Hi Fred,

> Am 08.05.2020 um 20:00 schrieb Andreas Höschler <[email protected]>:
>> 
>> NSButtonCell.m
>> ==================
>> - (NSSize) cellSize
>> {
>> ...
>>  if (imageToDisplay)
>>    {
>>      imageSize = [imageToDisplay size];
>>      NSLog(@"cellSize imageSize %@", NSStringFromSize(imageSize));
>>    }
>> ...
>>      case NSImageLeft: 
>>      case NSImageRight: 
>>        s.width = imageSize.width + titleSize.width + GSCellTextImageXDist;
>>        NSLog(@"imageSize.height %f titleSize.height %f", imageSize.height, 
>> titleSize.height);
>>        s.height = MAX(imageSize.height, titleSize.height);
>>        break;
>> ...
>> 
>>  // Add border size
>>  s.width += border.left + border.right;
>>  NSLog(@"border.top %f border.bottom %f", border.top, border.bottom);
>>  s.height += border.top + border.bottom;
>>  NSLog(@"returning s %@", NSStringFromSize(s));
>> ...
>> }
>> 
>> 
>> 2020-05-08 19:58:14.729 SOObjectBrowser[14224:14224] cellSize imageSize 
>> {width = 15; height = 15}
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] imageSize.height 
>> 15.000000 titleSize.height 10000000.000000
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] border.top 0.000000 
>> border.bottom 0.000000
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] returning s {width = 
>> 18; height = 1e+07}
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] Reporting 
>> button::imagePosition 2
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] Reporting 
>> _cell::imagePosition 2
>> 2020-05-08 19:58:14.730 SOObjectBrowser[14224:14224] Got height 
>> 10000004.000000. We correct this ...
>> 
>> The mess is caused by the titleSize!? :-( I haven't set a title since this 
>> is an image only button!
> 
> Now we are getting closer. But this is weird, The variable titleSize gets 
> initialised with NSZeroSize and later only changed here
> 
> 
>  if (titleToDisplay != nil)
>    {
>      titleSize = [titleToDisplay size];
>    }
> 
> Could you add another NSLog line there and report the value of 
> titleToDisplay? This looks like either a bug in our NSString drawing code or 
> the compiler itself. We really need to get to the bottom of this. Fixing 
> NSWindow is just a work around that won’t help you much.
> 


  NSLog(@"titleToDisplay %@", titleToDisplay);
  if (titleToDisplay && ipos != NSImageOnly)
    {
      titleSize = [titleToDisplay size];
      NSLog(@"first %@", NSStringFromSize(titleSize));
    }
  else
    {
      // When there is no text to display, ignore it in the calculations
      titleToDisplay = nil;
      ipos = NSImageOnly;
    }
  NSLog(@"final %@", NSStringFromSize(titleSize));

This produces:

2020-05-08 22:26:32.671 SOObjectBrowser[16581:16581] titleToDisplay 
2020-05-08 22:26:32.671 SOObjectBrowser[16581:16581] first {width = 1; height = 
1e+07}
2020-05-08 22:26:32.671 SOObjectBrowser[16581:16581] final {width = 1; height = 
1e+07}

It seems [NSAttributedString size] has a problem!?

        pico ./Source/NSStringDrawing.m 

- (NSSize) size
{
  NSRect usedRect = [self boundingRectWithSize: NSZeroSize
                                       options: 
NSStringDrawingUsesLineFragmentOrigin];
  return usedRect.size;
}

- (NSRect) boundingRectWithSize: (NSSize)size
                        options: (NSStringDrawingOptions)options
{
  // FIXME: This ignores options
  cache_t *c;
  NSRect result = NSZeroRect;
  BOOL hasSize = !NSEqualSizes(NSZeroSize, size);

  cache_lock();
  NS_DURING
    {    
      prepare_attributed_string(self);
      c = cache_lookup(hasSize, size, YES);
      result = c->usedRect;
    }
  NS_HANDLER
    {
      cache_unlock();
      [localException raise];
    }
  NS_ENDHANDLER;
  cache_unlock();

  return result;
}


I did the following:

- (NSSize) size
{
  if ([self length] == 0) return NSZeroSize; // <-- inserted this

  NSRect usedRect = [self boundingRectWithSize: NSZeroSize
                                       options: 
NSStringDrawingUsesLineFragmentOrigin];
  return usedRect.size;
}

- (NSSize) sizeWithAttributes: (NSDictionary *)attrs
{
  if ([self length] == 0) return NSZeroSize; // <-- inserted this

  NSRect usedRect = [self boundingRectWithSize: NSZeroSize
                                       options: 
NSStringDrawingUsesLineFragmentOrigin
                                    attributes: attrs];
  return usedRect.size;
}

Problem gone!! :-)

Regards,

 Andreas





    • ... Andreas Höschler via Discussion list for the GNUstep programming environment
      • ... Andreas Höschler via Discussion list for the GNUstep programming environment
        • ... Riccardo Mottola
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
          • ... Fred Kiefer
          • ... Fred Kiefer
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
          • ... Fred Kiefer
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
          • ... Fred Kiefer
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
          • ... Fred Kiefer
          • ... Fred Kiefer
          • ... Andreas Höschler via Discussion list for the GNUstep programming environment
          • ... Fred Kiefer
          • ... Riccardo Mottola
      • ... Riccardo Mottola
  • ... Riccardo Mottola
    • ... Svetlana
      • ... Andreas Höschler via Discussion list for the GNUstep programming environment
      • ... Riccardo Mottola

Reply via email to