mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-30 08:00:51 +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 :)
150 lines
2.9 KiB
Objective-C
150 lines
2.9 KiB
Objective-C
#include "QF/sys.h"
|
|
|
|
#include "KeypairView.h"
|
|
#include "TextureView.h"
|
|
#include "TexturePalette.h"
|
|
|
|
#include "Storage.h"
|
|
|
|
/*
|
|
|
|
NOTE: I am specifically not using cached image reps, because the data is also needed for texturing the views, and a cached rep would waste tons of space.
|
|
|
|
*/
|
|
|
|
@implementation TextureView
|
|
|
|
- (id) init
|
|
{
|
|
font = [[NSFont systemFontOfSize: FONTSIZE] retain];
|
|
deselectIndex = -1;
|
|
return self;
|
|
}
|
|
|
|
- (BOOL) isOpaque
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (id) setParent: (id)from
|
|
{
|
|
parent_i = from;
|
|
return self;
|
|
}
|
|
|
|
- (BOOL) acceptsFirstMouse
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
- (id) drawRect: (NSRect)rects
|
|
{
|
|
int i;
|
|
int max;
|
|
id list_i;
|
|
texpal_t *t;
|
|
int x;
|
|
int y;
|
|
NSPoint p;
|
|
NSRect r;
|
|
int selected;
|
|
NSMutableDictionary *attribs = [NSMutableDictionary dictionary];
|
|
|
|
selected = [parent_i getSelectedTexture];
|
|
list_i = [parent_i getList];
|
|
[font set];
|
|
|
|
[[NSColor lightGrayColor] set];
|
|
NSRectFill (rects);
|
|
|
|
if (!list_i) // WADfile didn't init
|
|
return self;
|
|
if (deselectIndex != -1) {
|
|
t = [list_i elementAt: deselectIndex];
|
|
r = t->r;
|
|
r.origin.x -= TEX_INDENT;
|
|
r.origin.y -= TEX_INDENT;
|
|
r.size.width += TEX_INDENT * 2;
|
|
r.size.height += TEX_INDENT * 2;
|
|
|
|
[[NSColor lightGrayColor] set];
|
|
NSRectFill (r);
|
|
p = t->r.origin;
|
|
p.y += TEX_SPACING;
|
|
[t->image drawAtPoint: p];
|
|
[[NSColor blackColor] set];
|
|
x = t->r.origin.x;
|
|
y = t->r.origin.y + 7;
|
|
[[NSString stringWithCString: t->name]
|
|
drawAtPoint: NSMakePoint (x, y) withAttributes: attribs];
|
|
deselectIndex = -1;
|
|
}
|
|
|
|
max = [list_i count];
|
|
[[NSColor blackColor] set];
|
|
|
|
for (i = 0; i < max; i++) {
|
|
t = [list_i elementAt: i];
|
|
r = t->r;
|
|
r.origin.x -= TEX_INDENT / 2;
|
|
r.size.width += TEX_INDENT;
|
|
r.origin.y += 4;
|
|
if (NSIntersectsRect (rects, r) == YES && t->display) {
|
|
if (selected == i) {
|
|
[[NSColor whiteColor] set];
|
|
NSRectFill (r);
|
|
[[NSColor redColor] set];
|
|
NSFrameRect (r);
|
|
[[NSColor blackColor] set];
|
|
}
|
|
|
|
p = t->r.origin;
|
|
p.y += TEX_SPACING;
|
|
[t->image drawAtPoint: p];
|
|
x = t->r.origin.x;
|
|
y = t->r.origin.y + 7;
|
|
[[NSString stringWithCString: t->name]
|
|
drawAtPoint: NSMakePoint (x, y) withAttributes: attribs];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id) deselect
|
|
{
|
|
deselectIndex = [parent_i getSelectedTexture];
|
|
return self;
|
|
}
|
|
|
|
- (id) mouseDown: (NSEvent *)theEvent
|
|
{
|
|
NSPoint loc;
|
|
int i;
|
|
int max;
|
|
|
|
// int oldwindowmask;
|
|
texpal_t *t;
|
|
id list;
|
|
NSRect r;
|
|
|
|
// oldwindowmask = [window addToEventMask:NSLeftMouseDraggedMask];
|
|
loc = [theEvent locationInWindow];
|
|
loc = [self convertPoint: loc fromView: NULL];
|
|
|
|
list = [parent_i getList];
|
|
max = [list count];
|
|
for (i = 0; i < max; i++) {
|
|
t = [list elementAt: i];
|
|
r = t->r;
|
|
if (NSPointInRect (loc, r) == YES) {
|
|
[self deselect];
|
|
[parent_i setSelectedTexture: i];
|
|
break;
|
|
}
|
|
}
|
|
|
|
// [window setEventMask:oldwindowmask];
|
|
return self;
|
|
}
|
|
|
|
@end
|