f-spot r3588 - in trunk: . src src/Widgets
- From: sdelcroix svn gnome org
- To: svn-commits-list gnome org
- Subject: f-spot r3588 - in trunk: . src src/Widgets
- Date: Mon, 21 Jan 2008 14:46:26 +0000 (GMT)
Author: sdelcroix
Date: Mon Jan 21 14:46:25 2008
New Revision: 3588
URL: http://svn.gnome.org/viewvc/f-spot?rev=3588&view=rev
Log:
2008-01-21 Stephane Delcroix <sdelcroix novell com>
* src/Makefile.am:
* src/Widgets/Rating.cs: minor changes.
* src/Widgets/ComplexMenuItem.cs:
* src/Widgets/RatingMenuItem.cs: stealing ComplexMenuItem and
RatingMenuItem from banshee
Added:
trunk/src/Widgets/ComplexMenuItem.cs
trunk/src/Widgets/RatingMenuItem.cs
Modified:
trunk/ChangeLog
trunk/src/Makefile.am
trunk/src/Widgets/Rating.cs
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Mon Jan 21 14:46:25 2008
@@ -234,6 +234,7 @@
$(srcdir)/CameraFileSelectionDialog.cs \
$(srcdir)/TagSelectionDialog.cs \
$(srcdir)/Widgets/CairoUtils.cs \
+ $(srcdir)/Widgets/ComplexMenuItem.cs \
$(srcdir)/Widgets/CompositeUtils.cs \
$(srcdir)/Widgets/Dissolve.cs \
$(srcdir)/Widgets/FindBar.cs \
@@ -247,6 +248,7 @@
$(srcdir)/Widgets/Push.cs \
$(srcdir)/Widgets/QueryView.cs \
$(srcdir)/Widgets/Rating.cs \
+ $(srcdir)/Widgets/RatingMenuItem.cs \
$(srcdir)/Widgets/Reveal.cs \
$(srcdir)/Widgets/SaneTreeView.cs \
$(srcdir)/Widgets/ScalingIconView.cs \
Added: trunk/src/Widgets/ComplexMenuItem.cs
==============================================================================
--- (empty file)
+++ trunk/src/Widgets/ComplexMenuItem.cs Mon Jan 21 14:46:25 2008
@@ -0,0 +1,153 @@
+//
+// ComplexMenuItem.cs
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+// Gabriel Burt <gburt novell com>
+//
+// Copyright (C) 2007 Novell, Inc.
+//
+// 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 Gtk;
+
+namespace FSpot.Widgets
+{
+ public class ComplexMenuItem : MenuItem
+ {
+ private bool is_selected = false;
+
+ public ComplexMenuItem() : base()
+ {
+ }
+
+ // Override OnAdded and OnRemoved so we can work with Gtk.Action/Gtk.UIManager
+ // which otherwise would try to replace our child with a Label.
+ private bool first_add = true;
+ protected override void OnAdded (Widget widget)
+ {
+ if (first_add) {
+ first_add = false;
+ base.OnAdded (widget);
+ }
+ }
+
+ protected override void OnRemoved (Widget widget)
+ {
+ }
+
+ protected void ConnectChildExpose(Widget widget)
+ {
+ widget.ExposeEvent += OnChildExposeEvent;
+ }
+
+ [GLib.ConnectBefore]
+ private void OnChildExposeEvent(object o, ExposeEventArgs args)
+ {
+ // NOTE: This is a little insane, but it allows packing of EventBox based widgets
+ // into a GtkMenuItem without breaking the theme (leaving an unstyled void in the item).
+ // This method is called before the EventBox child does its drawing and the background
+ // is filled in with the proper style.
+
+ int x, y, width, height;
+ Widget widget = (Widget)o;
+
+ if(IsSelected) {
+ x = Allocation.X - widget.Allocation.X;
+ y = Allocation.Y - widget.Allocation.Y;
+ width = Allocation.Width;
+ height = Allocation.Height;
+
+ ShadowType shadow_type = (ShadowType)StyleGetProperty("selected-shadow-type");
+ Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Prelight, shadow_type,
+ args.Event.Area, widget, "menuitem", x, y, width, height);
+ } else {
+ // Fill only the visible area in solid color, to be most efficient
+ widget.GdkWindow.DrawRectangle(Parent.Style.BackgroundGC(StateType.Normal),
+ true, 0, 0, widget.Allocation.Width, widget.Allocation.Height);
+
+ // FIXME: The above should not be necessary, but Clearlooks-based themes apparently
+ // don't provide any style for the menu background so we have to fill it first with
+ // the correct theme color. Weak.
+ //
+ // Do a complete style paint based on the size of the entire menu to be compatible with
+ // themes that provide a real style for "menu"
+ x = Parent.Allocation.X - widget.Allocation.X;
+ y = Parent.Allocation.Y - widget.Allocation.Y;
+ width = Parent.Allocation.Width;
+ height = Parent.Allocation.Height;
+
+ Gtk.Style.PaintBox(Style, widget.GdkWindow, StateType.Normal, ShadowType.Out,
+ args.Event.Area, widget, "menu", x, y, width, height);
+ }
+ }
+
+ protected override void OnSelected()
+ {
+ base.OnSelected();
+ is_selected = true;
+ }
+
+ protected override void OnDeselected()
+ {
+ base.OnDeselected();
+ is_selected = false;
+ }
+
+ protected override void OnParentSet(Widget previous_parent)
+ {
+ if(previous_parent != null) {
+ previous_parent.KeyPressEvent -= OnKeyPressEventProxy;
+ }
+
+ if(Parent != null) {
+ Parent.KeyPressEvent += OnKeyPressEventProxy;
+ }
+ }
+
+ [GLib.ConnectBefore]
+ private void OnKeyPressEventProxy(object o, KeyPressEventArgs args)
+ {
+ if(!IsSelected) {
+ return;
+ }
+
+ switch(args.Event.Key) {
+ case Gdk.Key.Up:
+ case Gdk.Key.Down:
+ case Gdk.Key.Escape:
+ return;
+ }
+
+ args.RetVal = OnKeyPressEvent(args.Event);
+ }
+
+ protected override bool OnKeyPressEvent(Gdk.EventKey evnt)
+ {
+ return false;
+ }
+
+ protected bool IsSelected {
+ get { return is_selected; }
+ }
+ }
+}
Modified: trunk/src/Widgets/Rating.cs
==============================================================================
--- trunk/src/Widgets/Rating.cs (original)
+++ trunk/src/Widgets/Rating.cs Mon Jan 21 14:46:25 2008
@@ -107,6 +107,11 @@
IconUnrated.CopyArea (0, 0, IconUnrated.Width, IconUnrated.Height,
pbuf, (max_rating - min_rating + 2) * IconUnrated.Width, 0);
}
+
+ public void SetValueFromPosition (int x)
+ {
+ Value = RatingFromPosition (x);
+ }
private int RatingFromPosition (double x)
{
@@ -183,6 +188,11 @@
[GLib.ConnectBefore]
protected override bool OnScrollEvent (EventScroll args)
{
+ return HandleScroll (args);
+ }
+
+ public bool HandleScroll (EventScroll args)
+ {
if (editable) {
switch (args.Direction) {
case Gdk.ScrollDirection.Up:
Added: trunk/src/Widgets/RatingMenuItem.cs
==============================================================================
--- (empty file)
+++ trunk/src/Widgets/RatingMenuItem.cs Mon Jan 21 14:46:25 2008
@@ -0,0 +1,136 @@
+//
+// RatingMenuItem.cs
+//
+// Author:
+// Aaron Bockover <abockover novell com>
+//
+// Copyright (C) 2007 Novell, Inc.
+//
+// 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 Gtk;
+using Mono.Unix;
+
+namespace FSpot.Widgets
+{
+ public class RatingMenuItem : ComplexMenuItem
+ {
+ private Rating entry;
+ private bool pressing;
+ private bool can_activate = true;
+
+ public RatingMenuItem () : base ()
+ {
+ HBox box = new HBox ();
+ box.Spacing = 5;
+
+ Label label = new Label ();
+ label.Markup = String.Format ("<i>{0}</i>",
+ GLib.Markup.EscapeText (Catalog.GetString ("Rating:")));
+ box.PackStart (label, false, false, 0);
+
+ entry = new Rating (0, true);
+ entry.Changed += OnEntryChanged;
+ box.PackStart (entry, false, false, 0);
+
+ box.ShowAll ();
+ Add (box);
+
+ ConnectChildExpose (entry);
+ }
+
+ private int TransformX (double inx)
+ {
+ int x = (int)inx - entry.Allocation.X;
+
+ if (x < 0) {
+ x = 0;
+ } else if (x > entry.Allocation.Width) {
+ x = entry.Allocation.Width;
+ }
+
+ return x;
+ }
+
+ protected override bool OnButtonPressEvent (Gdk.EventButton evnt)
+ {
+ pressing = true;
+ entry.SetValueFromPosition (TransformX (evnt.X));
+ return true;
+ }
+
+ protected override bool OnButtonReleaseEvent (Gdk.EventButton evnt)
+ {
+ pressing = false;
+ return true;
+ }
+
+ protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt)
+ {
+ if (!pressing) {
+ return false;
+ }
+
+ entry.SetValueFromPosition (TransformX (evnt.X));
+ return true;
+ }
+
+ protected override bool OnLeaveNotifyEvent (Gdk.EventCrossing evnt)
+ {
+ pressing = false;
+ return true;
+ }
+
+ protected override bool OnScrollEvent (Gdk.EventScroll evnt)
+ {
+ return entry.HandleScroll (evnt);
+ }
+
+ protected override bool OnKeyPressEvent (Gdk.EventKey evnt)
+ {
+ return entry.HandleKeyPress (evnt);
+ }
+
+ private void OnEntryChanged (object o, EventArgs args)
+ {
+ if (can_activate) {
+ Activate ();
+ }
+ }
+
+ public void Reset (int value)
+ {
+ can_activate = false;
+ Value = value;
+ can_activate = true;
+ }
+
+ public int Value {
+ get { return entry.Value; }
+ set { entry.Value = value; }
+ }
+
+ public Rating RatingEntry {
+ get { return entry; }
+ }
+ }
+}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]