VAqua.libvaqua.AquaSidebarBackground.m Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of vaqua Show documentation
Show all versions of vaqua Show documentation
An improved native Swing look and feel for macOS
The newest version!
/*
* Copyright (c) 2015-2024 Alan Snyder.
* All rights reserved.
*
* You may not use, copy or modify this file, except in compliance with the license agreement. For details see
* accompanying license terms.
*/
#import "AquaSidebarBackground.h"
#import "org_violetlib_aqua_AquaVibrantSupport.h"
#import
// This background is used for sidebars and optionally for menus
@implementation AquaSidebarBackground {
NSMutableArray *selectionViews;
NSVisualEffectMaterial selectionMaterial;
BOOL forceActive;
}
- (AquaSidebarBackground *) initWithFrame: (NSRect) frameRect style: (UInt16) style forceActive: (BOOL) shouldForceActive {
self = [super initWithFrame: frameRect];
if (self) {
if (floor(NSAppKitVersionNumber) <= NSAppKitVersionNumber10_10_Max) {
self.material = NSVisualEffectMaterialAppearanceBased;
} else if (style == SIDEBAR_STYLE) {
self.material = NSVisualEffectMaterialSidebar;
} else {
self.material = NSVisualEffectMaterialMenu;
}
self.style = style;
selectionMaterial = NSVisualEffectMaterialSelection;
forceActive = shouldForceActive;
self.wantsLayer = YES;
self.autoresizesSubviews = YES;
selectionViews = [[NSMutableArray alloc] init];
self.blendingMode = NSVisualEffectBlendingModeBehindWindow;
if (shouldForceActive) {
self.state = NSVisualEffectStateActive;
}
}
return self;
}
- (void) updateSelectionViews: (int*) data {
int *p = data;
int count = p ? *p++ : 0;
int index = 0;
int currentCount = (int) selectionViews.count;
float width = self.bounds.size.width;
// NSLog(@"Updating selection views %@ %f %f %@ %f %f",
// [self description],
// self.frame.size.width,
// self.frame.size.height,
// [backgroundView description],
// backgroundView.frame.size.width,
// backgroundView.frame.size.height);
BOOL useInset = NO;
if (@available(macOS 10.16, *)) {
useInset = YES;
}
for (index = 0; index < count; index++) {
int y = *p++;
int h = *p++;
BOOL useEmphasized = h < 0;
if (useEmphasized) {
h = -h;
}
NSRect frame = NSMakeRect(0, y, width, h);
if (useInset) {
int inset = 5;
frame = NSMakeRect(inset, y, width - 2 * inset, h);
}
NSVisualEffectView *v = index < currentCount ? [selectionViews objectAtIndex:index] : nil;
if (v) {
v.frame = frame;
v.emphasized = (self.style != SIDEBAR_STYLE) || useEmphasized;
} else {
v = [[NSVisualEffectView alloc] initWithFrame: frame];
v.wantsLayer = YES;
v.autoresizingMask = NSViewWidthSizable;
v.blendingMode = NSVisualEffectBlendingModeBehindWindow;
v.emphasized = (self.style != SIDEBAR_STYLE) || useEmphasized;
v.material = selectionMaterial;
if (useInset) {
v.layer.cornerRadius = 4;
v.layer.masksToBounds = YES;
}
if (forceActive) {
v.state = NSVisualEffectStateActive;
}
[selectionViews addObject: v];
[self addSubview: v];
}
}
for (int i = index; i < currentCount; i++) {
NSVisualEffectView *v = selectionViews.lastObject;
[selectionViews removeLastObject];
[v removeFromSuperview];
}
self.needsDisplay = YES;
}
- (NSVisualEffectView *) createVisualEffectViewWithFrame: (NSRect) frame {
NSVisualEffectView *v = [[NSVisualEffectView alloc] initWithFrame: frame];
v.blendingMode = NSVisualEffectBlendingModeBehindWindow;
v.wantsLayer = YES;
v.material = self.material;
return v;
}
- (BOOL) isFlipped {
return YES;
}
@end
© 2015 - 2025 Weber Informatics LLC | Privacy Policy