Hi,

I'm ready to commit this patch, but I wanted to give the heads up before...
This basically remove the reverse splitview bar we draw to instead do
live resizing.
It's reasonably fast, tested on slow-ish machines (~1ghz x86 & ppc),
and makes things much nicer from a UI point of view.
Comments before I submit ? :)

-- 
Nicolas Roard
"I love deadlines. I like the whooshing sound
they make as they fly by." -- Douglas Adams
Index: Source/NSSplitView.m
===================================================================
--- Source/NSSplitView.m	(revision 28272)
+++ Source/NSSplitView.m	(working copy)
@@ -167,8 +167,6 @@
 - (void) mouseDown: (NSEvent*)theEvent
 {
   NSApplication *app = [NSApplication sharedApplication];
-  static NSRect oldRect; //only one can be dragged at a time
-  static BOOL lit = NO;
   NSPoint p, op;
   NSEvent *e;
   NSRect r, r1, bigRect, vis;
@@ -345,12 +343,8 @@
         }
     }
 
-  oldRect = NSZeroRect;
-  [self lockFocus];
-
   [[NSRunLoop currentRunLoop] limitDateForMode: NSEventTrackingRunLoopMode];
 
-  [_dividerColor set];
   r.size.width = divHorizontal;
   r.size.height = divVertical;
   e = [app nextEventMatchingMask: eventMask
@@ -363,12 +357,13 @@
       constrainImp = (floatIMP)[_delegate methodForSelector: constrainSel];
     }
     
-  // Save the old position
-  op = p;
-
   // user is moving the knob loop until left mouse up
   while ([e type] != NSLeftMouseUp)
     {
+
+      // Save the old position
+      op = p;
+
       p = [self convertPoint: [e locationInWindow] fromView: nil];
       if (delegateConstrains)
         {
@@ -410,148 +405,7 @@
           r.origin.x = p.x - (divHorizontal/2.);
           r.origin.y = NSMinY(vis);
         }
-      if (NSEqualRects(r, oldRect) == NO)
-        {
-          NSDebugLLog(@"NSSplitView", @"drawing divider at %...@\n",
-                      NSStringFromRect(r));
-          [_dividerColor set];
-        
-            
-          if (lit == YES)
-            {
-              if (_isVertical == NO)
-                {
-                  if ((NSMinY(r) > NSMaxY(oldRect)) 
-                      || (NSMaxY(r) < NSMinY(oldRect)))
-                    // the two rects don't intersect
-                    {
-                      NSHighlightRect(oldRect);
-                      NSHighlightRect(r);
-                    }
-                  else
-                    // the two rects intersect
-                    {
-                      if (NSMinY(r) > NSMinY(oldRect))
-                        {
-                          NSRect onRect, offRect;
-                          onRect.size.width = r.size.width;
-                          onRect.origin.x = r.origin.x;
-                          offRect.size.width = r.size.width;
-                          offRect.origin.x = r.origin.x;
 
-                          offRect.origin.y = NSMinY(oldRect);
-                          offRect.size.height = 
-                            NSMinY(r) - NSMinY(oldRect);
-
-                          onRect.origin.y = NSMaxY(oldRect);
-                          onRect.size.height = 
-                            NSMaxY(r) - NSMaxY(oldRect);
-
-                          NSHighlightRect(onRect);
-                          NSHighlightRect(offRect);
-
-                          //NSLog(@"on : %@", NSStringFromRect(onRect));
-                          //NSLog(@"off : %@", NSStringFromRect(offRect));
-                          //NSLog(@"old : %@", NSStringFromRect(oldRect));
-                          //NSLog(@"r : %@", NSStringFromRect(r));
-                        }
-                      else
-                        {
-                          NSRect onRect, offRect;
-                          onRect.size.width = r.size.width;
-                          onRect.origin.x = r.origin.x;
-                          offRect.size.width = r.size.width;
-                          offRect.origin.x = r.origin.x;
-
-                          offRect.origin.y = NSMaxY(r);
-                          offRect.size.height = 
-                            NSMaxY(oldRect) - NSMaxY(r);
-
-                          onRect.origin.y = NSMinY(r);
-                          onRect.size.height = 
-                            NSMinY(oldRect) - NSMinY(r);
-
-                          NSHighlightRect(onRect);
-                          NSHighlightRect(offRect);
-
-                          //NSLog(@"on : %@", NSStringFromRect(onRect));
-                          //NSLog(@"off : %@", NSStringFromRect(offRect));
-                          //NSLog(@"old : %@", NSStringFromRect(oldRect));
-                          //NSLog(@"r : %@", NSStringFromRect(r));
-                        }
-                    }
-                }
-              else
-                {
-                  if ((NSMinX(r) > NSMaxX(oldRect)) 
-                      || (NSMaxX(r) < NSMinX(oldRect)))
-                    // the two rects don't intersect
-                    {
-                      NSHighlightRect(oldRect);
-                      NSHighlightRect(r);
-                    }
-                  else
-                    // the two rects intersect
-                    {
-                      if (NSMinX(r) > NSMinX(oldRect))
-                        {
-                          NSRect onRect, offRect;
-                          onRect.size.height = r.size.height;
-                          onRect.origin.y = r.origin.y;
-                          offRect.size.height = r.size.height;
-                          offRect.origin.y = r.origin.y;
-
-                          offRect.origin.x = NSMinX(oldRect);
-                          offRect.size.width = 
-                            NSMinX(r) - NSMinX(oldRect);
-
-                          onRect.origin.x = NSMaxX(oldRect);
-                          onRect.size.width = 
-                            NSMaxX(r) - NSMaxX(oldRect);
-
-                          NSHighlightRect(onRect);
-                          NSHighlightRect(offRect);
-                        }
-                      else
-                        {
-                          NSRect onRect, offRect;
-                          onRect.size.height = r.size.height;
-                          onRect.origin.y = r.origin.y;
-                          offRect.size.height = r.size.height;
-                          offRect.origin.y = r.origin.y;
-
-                          offRect.origin.x = NSMaxX(r);
-                          offRect.size.width = 
-                            NSMaxX(oldRect) - NSMaxX(r);
-
-                          onRect.origin.x = NSMinX(r);
-                          onRect.size.width = 
-                            NSMinX(oldRect) - NSMinX(r);
-
-                          NSHighlightRect(onRect);
-                          NSHighlightRect(offRect);
-                        }
-                    }
-
-                }
-            }
-          else
-            {
-              NSHighlightRect(r);
-            }
-          [_window flushWindow];
-          /*
-          if (lit == YES)
-            {
-              NSHighlightRect(oldRect);
-              lit = NO;
-            }
-          NSHighlightRect(r);
-          */
-          lit = YES;
-          oldRect = r;
-        }
-
       {
         NSEvent *ee;
 
@@ -584,96 +438,82 @@
           }
       }
       
-    }
+      // If the splitview was moved, we resize the subviews
+      if ((_isVertical == YES && p.x != op.x)
+         || (_isVertical == NO && p.y != op.y))
+        {
+       
+          [nc postNotificationName: NSSplitViewWillResizeSubviewsNotification
+                            object: self];
 
-  if (lit == YES)
-    {
-      [_dividerColor set];
-      NSHighlightRect(oldRect);
-      lit = NO;
-    }
+          /* resize the subviews accordingly */
+          r = [prev frame];
+          if (_isVertical == NO)
+            {
+              r.size.height = p.y - NSMinY(bigRect) - (divVertical/2.);
+              if (NSHeight(r) < 1.)
+                {
+                  r.size.height = 1.;
+                }
+            }
+          else
+            {
+              r.size.width = p.x - NSMinX(bigRect) - (divHorizontal/2.);
+              if (NSWidth(r) < 1.)
+                {
+                  r.size.width = 1.;
+                }
+            }
+      
+          [prev setFrame: r];
+          NSDebugLLog(@"NSSplitView", @"drawing PREV at x: %d, y: %d, w: %d, h: %d\n",
+                     (int)NSMinX(r),(int)NSMinY(r),(int)NSWidth(r),(int)NSHeight(r));
 
-  [self unlockFocus];
+          r1 = [v frame];
+          if (_isVertical == NO)
+            {
+              r1.origin.y = p.y + (divVertical/2.);
+              if (NSMinY(r1) < 0.)
+                {
+                  r1.origin.y = 0.;
+                }
+              r1.size.height = NSHeight(bigRect) - NSHeight(r) - divVertical;
+              if (NSHeight(r) < 1.)
+                {
+                  r.size.height = 1.;
+                }
+            }
+          else
+            {
+              r1.origin.x = p.x + (divHorizontal/2.);
+              if (NSMinX(r1) < 0.)
+                {
+                  r1.origin.x = 0.;
+                }
+              r1.size.width = NSWidth(bigRect) - NSWidth(r) - divHorizontal;
+              if (NSWidth(r1) < 1.)
+                {
+                  r1.size.width = 1.;
+                }
+            }
 
-  // Divider position hasn't changed don't try to resize subviews  
-  if (_isVertical == YES && p.x == op.x)
-    {
-      [self setNeedsDisplay: YES];
-      return;
-    }
-  else if (_isVertical == NO && p.y == op.y)   
-    {
-      [self setNeedsDisplay: YES];
-      return;
-    }
+          [v setFrame: r1];
+          NSDebugLLog(@"NSSplitView", @"drawing LAST at x: %d, y: %d, w: %d, h: %d\n",
+                     (int)NSMinX(r1),(int)NSMinY(r1),(int)NSWidth(r1),
+                     (int)NSHeight(r1));
 
-  [nc postNotificationName: NSSplitViewWillResizeSubviewsNotification
-                    object: self];
+          [_window invalidateCursorRectsForView: self];
 
-  /* resize the subviews accordingly */
-  r = [prev frame];
-  if (_isVertical == NO)
-    {
-      r.size.height = p.y - NSMinY(bigRect) - (divVertical/2.);
-      if (NSHeight(r) < 1.)
-        {
-          r.size.height = 1.;
-        }
-    }
-  else
-    {
-      r.size.width = p.x - NSMinX(bigRect) - (divHorizontal/2.);
-      if (NSWidth(r) < 1.)
-        {
-          r.size.width = 1.;
-        }
-    }
-  [prev setFrame: r];
-  NSDebugLLog(@"NSSplitView", @"drawing PREV at x: %d, y: %d, w: %d, h: %d\n",
-             (int)NSMinX(r),(int)NSMinY(r),(int)NSWidth(r),(int)NSHeight(r));
+          [nc postNotificationName: NSSplitViewDidResizeSubviewsNotification
+                            object: self];
 
-  r1 = [v frame];
-  if (_isVertical == NO)
-    {
-      r1.origin.y = p.y + (divVertical/2.);
-      if (NSMinY(r1) < 0.)
-        {
-          r1.origin.y = 0.;
+          [self setNeedsDisplay: YES];
+
         }
-      r1.size.height = NSHeight(bigRect) - NSHeight(r) - divVertical;
-      if (NSHeight(r) < 1.)
-        {
-          r.size.height = 1.;
-        }
     }
-  else
-    {
-      r1.origin.x = p.x + (divHorizontal/2.);
-      if (NSMinX(r1) < 0.)
-        {
-          r1.origin.x = 0.;
-        }
-      r1.size.width = NSWidth(bigRect) - NSWidth(r) - divHorizontal;
-      if (NSWidth(r1) < 1.)
-        {
-          r1.size.width = 1.;
-        }
-    }
-  [v setFrame: r1];
-  NSDebugLLog(@"NSSplitView", @"drawing LAST at x: %d, y: %d, w: %d, h: %d\n",
-             (int)NSMinX(r1),(int)NSMinY(r1),(int)NSWidth(r1),
-             (int)NSHeight(r1));
 
-  [_window invalidateCursorRectsForView: self];
-
-  [nc postNotificationName: NSSplitViewDidResizeSubviewsNotification
-                    object: self];
-
   [self _autosaveSubviewProportions];
 
-  [self setNeedsDisplay: YES];
-
-  //[self display];
 }
 
 - (void) _adjustSubviews: (NSSize)oldSize
_______________________________________________
Gnustep-dev mailing list
Gnustep-dev@gnu.org
http://lists.gnu.org/mailman/listinfo/gnustep-dev

Reply via email to