mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-12-02 17:12:55 +00:00
fb65cd2b44
Obtaining a font has become rather expensive in recent gnustep, so cache fonts, obtaining new ones only when needed rather than every redraw. Makes things snappy again :)
100 lines
1.8 KiB
Objective-C
100 lines
1.8 KiB
Objective-C
#include "KeypairView.h"
|
|
#include "Map.h"
|
|
#include "Entity.h"
|
|
#include "Things.h"
|
|
|
|
id keypairview_i;
|
|
|
|
@implementation KeypairView
|
|
/*
|
|
==================
|
|
initWithFrame:
|
|
==================
|
|
*/
|
|
- (id) initWithFrame: (NSRect)frameRect
|
|
{
|
|
[super initWithFrame: frameRect];
|
|
font = [[NSFont systemFontOfSize: FONTSIZE] retain];
|
|
keypairview_i = self;
|
|
return self;
|
|
}
|
|
|
|
- (BOOL) isFlipped
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (BOOL) isOpaque
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (id) calcViewSize
|
|
{
|
|
NSRect b;
|
|
NSPoint pt;
|
|
int count;
|
|
id ent;
|
|
|
|
ent = [map_i currentEntity];
|
|
count = [ent numPairs];
|
|
|
|
b = [[self superview] bounds];
|
|
b.size.height = LINEHEIGHT * count + SPACING;
|
|
[self setFrameSize: b.size];
|
|
pt.x = pt.y = 0;
|
|
[self scrollPoint: pt];
|
|
return self;
|
|
}
|
|
|
|
- (id) drawRect: (NSRect)rects
|
|
{
|
|
epair_t *pair;
|
|
int y;
|
|
NSMutableDictionary *attribs = [NSMutableDictionary dictionary];
|
|
|
|
[[NSColor lightGrayColor] set];
|
|
NSRectFill (NSMakeRect (0, 0, _bounds.size.width, _bounds.size.height));
|
|
|
|
[font set];
|
|
[[NSColor blackColor] set];
|
|
|
|
pair = [[map_i currentEntity] epairs];
|
|
y = _bounds.size.height - LINEHEIGHT;
|
|
for ( ; pair; pair = pair->next) {
|
|
NSString *key = [NSString stringWithCString: pair->key];
|
|
NSString *value = [NSString stringWithCString: pair->value];
|
|
|
|
[key drawAtPoint: NSMakePoint (SPACING, y) withAttributes: attribs];
|
|
[value drawAtPoint: NSMakePoint (100, y) withAttributes: attribs];
|
|
y -= LINEHEIGHT;
|
|
}
|
|
|
|
return self;
|
|
}
|
|
|
|
- (void) mouseDown: (NSEvent *)theEvent
|
|
{
|
|
NSPoint loc;
|
|
int i;
|
|
epair_t *p;
|
|
|
|
loc = [theEvent locationInWindow];
|
|
loc = [self convertPoint: loc fromView: NULL];
|
|
|
|
i = (_bounds.size.height - loc.y - 4) / LINEHEIGHT;
|
|
|
|
p = [[map_i currentEntity] epairs];
|
|
while (i) {
|
|
p = p->next;
|
|
if (!p)
|
|
return;
|
|
i--;
|
|
}
|
|
if (p)
|
|
[things_i setSelectedKey: p];
|
|
|
|
return;
|
|
}
|
|
|
|
@end
|