Author: abock
Date: Sat Feb  9 00:45:10 2008
New Revision: 3177
URL: http://svn.gnome.org/viewvc/banshee?rev=3177&view=rev

Log:
2008-02-08  Aaron Bockover  <[EMAIL PROTECTED]>


    * src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs:
    * src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs:
    * src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs:
    Implemented most of what is required for column reordering, but not
    100% complete yet

    * src/Core/Hyena.Gui/Hyena.Data.Gui/ListViewGraphics.cs: DrawColumnHighlight
    now can have an override color
    
    * src/Core/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs: Added Reorder



Modified:
   trunk/banshee/ChangeLog
   trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs
   trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
   
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
   
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
   trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListViewGraphics.cs

Modified: trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs
==============================================================================
--- trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs 
(original)
+++ trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ColumnController.cs Sat Feb 
 9 00:45:10 2008
@@ -100,6 +100,17 @@
             OnUpdated ();
         }
         
+        public void Reorder (int index, int newIndex)
+        {
+            lock (this) {
+                Column column = columns[index];
+                columns.RemoveAt (index);
+                columns.Insert (newIndex, column);
+            }
+            
+            OnUpdated ();
+        }
+        
         IEnumerator IEnumerable.GetEnumerator ()
         {
             return columns.GetEnumerator ();
@@ -111,7 +122,7 @@
         }
         
         public Column this[int index] {
-            get { return columns[index] as Column; }
+            get { return columns[index]; }
         }
         
         public int Count {

Modified: 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs
==============================================================================
--- trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs 
(original)
+++ trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Header.cs 
Sat Feb  9 00:45:10 2008
@@ -48,10 +48,16 @@
         
         private const int COLUMN_PADDING = 1;
         private static Gdk.Cursor resize_x_cursor = new Gdk.Cursor 
(Gdk.CursorType.SbHDoubleArrow);
+        private static Gdk.Cursor drag_cursor = new Gdk.Cursor 
(Gdk.CursorType.Fleur);
         
         private int column_text_y;
         private int column_text_height;
         private int resizing_column_index = -1;
+        private int pressed_column_index = -1;
+        private int pressed_column_x_start = -1;
+        private int pressed_column_x_drag = -1;
+        private bool pressed_column_is_dragging = false;
+        
         private Pango.Layout column_layout;
         
         private CachedColumn [] column_cache;

Modified: 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
==============================================================================
--- 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
    (original)
+++ 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Interaction.cs
    Sat Feb  9 00:45:10 2008
@@ -199,65 +199,78 @@
             
             if (press.Window == header_window) {
                 Gtk.Drag.SourceUnset (this);
-                Column column = GetColumnForResizeHandle ((int) press.X);
+                
+                Column column = GetColumnForResizeHandle ((int)press.X);
                 if (column != null) {
                     resizing_column_index = GetCachedColumnForColumn 
(column).Index;
-                }
-            } else if (press.Window == list_window && model != null) {
-                GrabFocus ();
-                
-                int row_index = GetRowAtY ((int) press.Y);
-                
-                if (press.Button == 1 && (press.State & 
Gdk.ModifierType.ControlMask) == 0 && 
-                    Selection.Contains (row_index)) {
-                    return true;
+                } else {
+                    column = GetColumnAt ((int)press.X);
+                    if (column != null) {
+                        pressed_column_index = GetCachedColumnForColumn 
(column).Index;
+                        pressed_column_x_start = (int)press.X;
+                    }
                 }
                 
-                object item = model[row_index];
-                if (item == null) {
-                    return true;
-                }
+                return true;
+            }
+            
+            if (press.Window != list_window || model == null) {
+                return true;
+            }
+            
+            GrabFocus ();
+            
+            int row_index = GetRowAtY ((int) press.Y);
+            
+            if (press.Button == 1 && (press.State & 
Gdk.ModifierType.ControlMask) == 0 && 
+                Selection.Contains (row_index)) {
+                return true;
+            }
+            
+            object item = model[row_index];
+            if (item == null) {
+                return true;
+            }
 
-                if (press.Button == 1 && press.Type == 
Gdk.EventType.TwoButtonPress && 
-                    row_index == last_click_row_index) {
-                    OnRowActivated ();
-                    last_click_row_index = -1;
-                } else {
-                    if ((press.State & Gdk.ModifierType.ControlMask) != 0) {
-                        if (press.Button == 3) {
-                            if (!Selection.Contains (row_index)) {
-                                Selection.Select (row_index);
-                            }
-                        } else {
-                            Selection.ToggleSelect(row_index);
+            if (press.Button == 1 && press.Type == 
Gdk.EventType.TwoButtonPress && 
+                row_index == last_click_row_index) {
+                OnRowActivated ();
+                last_click_row_index = -1;
+            } else {
+                if ((press.State & Gdk.ModifierType.ControlMask) != 0) {
+                    if (press.Button == 3) {
+                        if (!Selection.Contains (row_index)) {
+                            Selection.Select (row_index);
                         }
-                    } else if ((press.State & Gdk.ModifierType.ShiftMask) != 
0) {
-                        Selection.SelectFromFirst (row_index, true);
                     } else {
-                        if (press.Button == 3) {
-                            if (!Selection.Contains (row_index)) {
-                                Selection.Clear (false);
-                                Selection.Select (row_index);
-                            }
-                        } else {
+                        Selection.ToggleSelect(row_index);
+                    }
+                } else if ((press.State & Gdk.ModifierType.ShiftMask) != 0) {
+                    Selection.SelectFromFirst (row_index, true);
+                } else {
+                    if (press.Button == 3) {
+                        if (!Selection.Contains (row_index)) {
                             Selection.Clear (false);
                             Selection.Select (row_index);
                         }
+                    } else {
+                        Selection.Clear (false);
+                        Selection.Select (row_index);
                     }
+                }
 
-                    FocusRow (row_index);
+                FocusRow (row_index);
 
-                    if (press.Button == 3) {
-                        last_click_row_index = -1;
-                        OnPopupMenu ();
-                    } else {
-                        last_click_row_index = row_index;
-                    }
+                if (press.Button == 3) {
+                    last_click_row_index = -1;
+                    OnPopupMenu ();
+                } else {
+                    last_click_row_index = row_index;
                 }
-                
-                InvalidateListWindow ();
             }
             
+            InvalidateListWindow ();
+            
             return true;
         }
         
@@ -267,17 +280,29 @@
                 OnDragSourceSet ();
                 
                 if (resizing_column_index >= 0) {
+                    pressed_column_index = -1;
                     resizing_column_index = -1;
                     header_window.Cursor = null;
                     return true;
                 }
+                
+                if (pressed_column_index >= 0 && pressed_column_is_dragging) {
+                    pressed_column_is_dragging = false;
+                    pressed_column_index = -1;
+                    header_window.Cursor = null;
+                    InvalidateHeaderWindow ();
+                    InvalidateListWindow ();
+                    return true;
+                }
             
-                Column column = GetColumnAt ((int)evnt.X);
+                Column column = column_cache[pressed_column_index].Column;
                 if (column != null && Model is ISortable && column is 
ISortableColumn) {
                     ((ISortable)Model).Sort ((ISortableColumn)column);
                     Model.Reload ();
                     InvalidateHeaderWindow ();
                 }
+                
+                pressed_column_index = -1;
             } else if (evnt.Window == list_window && model != null &&
                 (evnt.State & (Gdk.ModifierType.ShiftMask | 
Gdk.ModifierType.ControlMask)) == 0) {
                 GrabFocus ();
@@ -302,10 +327,26 @@
         protected override bool OnMotionNotifyEvent (Gdk.EventMotion evnt)
         {
             if (evnt.Window == header_window) {
+                if (pressed_column_index >= 0 && !pressed_column_is_dragging 
&& 
+                    Gtk.Drag.CheckThreshold (this, pressed_column_x_start, 0, 
(int)evnt.X, 0)) {
+                    pressed_column_is_dragging = true;
+                    InvalidateHeaderWindow ();
+                    InvalidateListWindow ();
+                }
+                
+                if (pressed_column_is_dragging) {
+                    header_window.Cursor = drag_cursor;
+                    pressed_column_x_drag = (int)evnt.X - 
pressed_column_x_start + 
+                        column_cache[pressed_column_index].X1;
+                    InvalidateHeaderWindow ();
+                    InvalidateListWindow ();
+                    return true;
+                }
+            
                 header_window.Cursor = resizing_column_index >= 0 || 
GetColumnForResizeHandle ((int)evnt.X) != null 
                     ? resize_x_cursor 
                     : null;
-                  
+                
                 if (resizing_column_index >= 0) {
                     ResizeColumn (evnt.X);
                 }

Modified: 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs
==============================================================================
--- 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs  
    (original)
+++ 
trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListView/ListView_Rendering.cs  
    Sat Feb  9 00:45:10 2008
@@ -115,33 +115,71 @@
             cell_area.Y = column_text_y;
             cell_area.Height = HeaderHeight - column_text_y;
 
-            for (int ci = 0; ci < column_cache.Length; ci++) {            
-                cell_area.X = column_cache[ci].X1 + left_border_alloc.Width;
-                cell_area.Width = column_cache[ci].Width - COLUMN_PADDING;
-                
-                ColumnCell cell = column_cache[ci].Column.HeaderCell;
-                
-                if (cell is ColumnHeaderCellText && Model is ISortable) {
-                    bool has_sort = ((ISortable)Model).SortColumn == 
column_cache[ci].Column as ISortableColumn 
-                        && column_cache[ci].Column is ISortableColumn;
-                    ((ColumnHeaderCellText)cell).HasSort = has_sort;
-                    if (has_sort) {
-                        graphics.DrawColumnHighlight (header_cr, cell_area, 3);
-                    }
-                }
-                
-                if (cell != null) {
-                    header_cr.Save ();
-                    header_cr.Translate (cell_area.X, cell_area.Y);
-                    cell.Render (new CellContext (header_cr, 
header_pango_layout, this, header_window, 
-                        graphics, cell_area), StateType.Normal, 
cell_area.Width, cell_area.Height);
-                    header_cr.Restore ();
+            for (int ci = 0; ci < column_cache.Length; ci++) {
+                if (pressed_column_is_dragging && pressed_column_index == ci) {
+                    continue;
                 }
                 
+                cell_area.X = column_cache[ci].X1 + left_border_alloc.Width;
+                cell_area.Width = column_cache[ci].Width - COLUMN_PADDING;
+                PaintHeaderCell (cell_area, clip, ci, false);
+            }
+            
+            if (pressed_column_is_dragging && pressed_column_index >= 0) {
+                cell_area.X = pressed_column_x_drag + left_border_alloc.Width;
+                cell_area.Width = column_cache[pressed_column_index].Width - 
COLUMN_PADDING;
+                PaintHeaderCell (cell_area, clip, pressed_column_index, true);
+            }
+        }
+        
+        private void PaintHeaderCell (Gdk.Rectangle area, Gdk.Rectangle clip, 
int ci, bool dragging)
+        {
+            ColumnCell cell = column_cache[ci].Column.HeaderCell;
+            
+            if (dragging) {
                 if (ci < column_cache.Length - 1) {
                     graphics.DrawHeaderSeparator (header_cr, header_alloc, 
                         column_cache[ci].ResizeX1 - 1 + 
left_border_alloc.Width, 2);
                 }
+            
+                graphics.DrawColumnHighlight (header_cr, area, 3, 
+                    CairoExtensions.ColorShade (graphics.GetWidgetColor 
(GtkColorClass.Dark, StateType.Normal), 0.9));
+                    
+                Cairo.Color stroke_color = CairoExtensions.ColorShade 
(graphics.GetWidgetColor (
+                    GtkColorClass.Base, StateType.Normal), 0.0);
+                stroke_color.A = 0.5;
+                
+                header_cr.Color = stroke_color;
+                
+                header_cr.MoveTo (area.X - 1, area.Y + 1);
+                header_cr.LineTo (area.X - 1, area.Y + area.Height - 1);
+                header_cr.Stroke ();
+                
+                header_cr.MoveTo (area.X + area.Width, area.Y + 1);
+                header_cr.LineTo (area.X + area.Width, area.Y + area.Height - 
1);
+                header_cr.Stroke ();
+            }
+            
+            if (cell is ColumnHeaderCellText && Model is ISortable) {
+                bool has_sort = ((ISortable)Model).SortColumn == 
column_cache[ci].Column as ISortableColumn 
+                    && column_cache[ci].Column is ISortableColumn;
+                ((ColumnHeaderCellText)cell).HasSort = has_sort;
+                if (has_sort) {
+                    graphics.DrawColumnHighlight (header_cr, area, 3);
+                }
+            }
+            
+            if (cell != null) {
+                header_cr.Save ();
+                header_cr.Translate (area.X, area.Y);
+                cell.Render (new CellContext (header_cr, header_pango_layout, 
this, header_window, 
+                    graphics, area), StateType.Normal, area.Width, 
area.Height);
+                header_cr.Restore ();
+            }
+            
+            if (!dragging && ci < column_cache.Length - 1) {
+                graphics.DrawHeaderSeparator (header_cr, header_alloc, 
+                    column_cache[ci].ResizeX1 - 1 + left_border_alloc.Width, 
2);
             }
         }
 
@@ -228,6 +266,8 @@
                 single_list_alloc.Y = ri * single_list_alloc.Height - 
vadjustment_value;
                 PaintRow (ri, clip, single_list_alloc, StateType.Selected);
             }
+            
+            PaintDraggingColumn (evnt, clip);
         }
 
         private void PaintRow (int row_index, Gdk.Rectangle clip, 
Gdk.Rectangle area, StateType state)
@@ -241,28 +281,77 @@
             Gdk.Rectangle cell_area = new Gdk.Rectangle ();
             cell_area.Height = RowHeight;
             cell_area.Y = area.Y;
-
+            
             for (int ci = 0; ci < column_cache.Length; ci++) {
+                if (pressed_column_is_dragging && pressed_column_index == ci) {
+                    continue;
+                }
+                
                 cell_area.Width = column_cache[ci].Width;
                 cell_area.X = column_cache[ci].X1;
-                    
-                PaintCell (item, ci, row_index, cell_area, cell_area, state);
+                PaintCell (item, ci, row_index, cell_area, cell_area, state, 
false);
+            }
+            
+            if (pressed_column_is_dragging && pressed_column_index >= 0) {   
+                cell_area.Width = column_cache[pressed_column_index].Width;
+                cell_area.X = pressed_column_x_drag;
+                PaintCell (item, pressed_column_index, row_index, cell_area, 
cell_area, state, true);
             }
         }
         
         private void PaintCell (object item, int column_index, int row_index, 
Gdk.Rectangle area, 
-            Gdk.Rectangle clip, StateType state)
+            Gdk.Rectangle clip, StateType state, bool dragging)
         {
             ColumnCell cell = column_cache[column_index].Column.GetCell (0);
             cell.BindListItem (item);
             
+            if (dragging) {
+                Cairo.Color fill_color = graphics.GetWidgetColor 
(GtkColorClass.Base, StateType.Normal);
+                fill_color.A = 0.5;
+                list_cr.Color = fill_color;
+                list_cr.Rectangle (area.X, area.Y, area.Width, area.Height);
+                list_cr.Fill ();
+            }
+            
             list_cr.Save ();
             list_cr.Translate (clip.X, clip.Y);
             cell.Render (new CellContext (list_cr, list_pango_layout, this, 
list_window, graphics, area), 
-                state, area.Width, area.Height);
+                dragging? StateType.Normal : state, area.Width, area.Height);
             list_cr.Restore ();
         }
         
+        private void PaintDraggingColumn (Gdk.EventExpose evnt, Gdk.Rectangle 
clip)
+        {
+            if (!pressed_column_is_dragging || pressed_column_index < 0) {
+                return;
+            }
+            
+            CachedColumn column = column_cache[pressed_column_index];
+            
+            int x = pressed_column_x_drag;
+            
+            Cairo.Color fill_color = graphics.GetWidgetColor 
(GtkColorClass.Base, StateType.Normal);
+            fill_color.A = 0.6;
+            
+            Cairo.Color stroke_color = CairoExtensions.ColorShade 
(graphics.GetWidgetColor (
+                GtkColorClass.Base, StateType.Normal), 0.0);
+            stroke_color.A = 0.4;
+            
+            list_cr.Rectangle (x, list_alloc.Y, column.Width, 
list_alloc.Height);
+            list_cr.Color = fill_color;
+            list_cr.Fill ();
+            
+            list_cr.MoveTo (x, list_alloc.Y);
+            list_cr.LineTo (x, list_alloc.Y + list_alloc.Height);
+            list_cr.MoveTo (x + column.Width, list_alloc.Y);
+            list_cr.LineTo (x + column.Width, list_alloc.Y + 
list_alloc.Height);
+            
+            list_cr.Color = stroke_color;
+            list_cr.Antialias = Cairo.Antialias.None;
+            list_cr.LineWidth = 1.0;
+            list_cr.Stroke ();
+        }
+        
         private void PaintLeftBorder (Gdk.EventExpose evnt, Gdk.Rectangle clip)
         {
             graphics.DrawLeftBorder (left_border_cr, left_border_alloc);

Modified: trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListViewGraphics.cs
==============================================================================
--- trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListViewGraphics.cs 
(original)
+++ trunk/banshee/src/Core/Hyena.Gui/Hyena.Data.Gui/ListViewGraphics.cs Sat Feb 
 9 00:45:10 2008
@@ -222,9 +222,13 @@
         
         public void DrawColumnHighlight(Cairo.Context cr, Gdk.Rectangle alloc, 
int bottom_offset)
         {
-            Cairo.Color gtk_selection_color = 
GetWidgetColor(GtkColorClass.Background, StateType.Selected);
-            Cairo.Color light_color = 
CairoExtensions.ColorShade(gtk_selection_color, 1.6);
-            Cairo.Color dark_color = 
CairoExtensions.ColorShade(gtk_selection_color, 1.3);
+            DrawColumnHighlight(cr, alloc, bottom_offset, 
GetWidgetColor(GtkColorClass.Background, StateType.Selected));
+        }
+        
+        public void DrawColumnHighlight(Cairo.Context cr, Gdk.Rectangle alloc, 
int bottom_offset, Cairo.Color color)
+        {
+            Cairo.Color light_color = CairoExtensions.ColorShade(color, 1.6);
+            Cairo.Color dark_color = CairoExtensions.ColorShade(color, 1.3);
             
             LinearGradient grad = new LinearGradient(alloc.X, alloc.Y + 2, 
alloc.X, alloc.Y + alloc.Height - 3 - bottom_offset);
             grad.AddColorStop(0, light_color);
_______________________________________________
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 [EMAIL PROTECTED] if interested.

Reply via email to