Files
transmission/macosx/FileCheckCellView.mm
Dzmitry Neviadomski d1985b05c6 macos: View-based FileOutlineView (#7760)
Signed-off-by: Dzmitry Neviadomski <nevack.d@gmail.com>
2025-11-09 12:21:42 -05:00

114 lines
2.9 KiB
Plaintext

// This file Copyright © Transmission authors and contributors.
// It may be used under the MIT (SPDX: MIT) license.
// License text can be found in the licenses/ folder.
#import "FileCheckCellView.h"
#import "FileListNode.h"
#import "Torrent.h"
@interface FileCheckCellView ()
@property(nonatomic, weak) NSButton* checkButton;
@end
@implementation FileCheckCellView
- (instancetype)initWithFrame:(NSRect)frameRect
{
if ((self = [super initWithFrame:frameRect]))
{
// Create checkbox button
NSButton* checkButton = [[NSButton alloc] initWithFrame:NSZeroRect];
checkButton.translatesAutoresizingMaskIntoConstraints = NO;
[checkButton setButtonType:NSButtonTypeSwitch];
checkButton.title = @"";
checkButton.allowsMixedState = YES;
checkButton.target = self;
checkButton.action = @selector(checkButtonClicked:);
[self addSubview:checkButton];
_checkButton = checkButton;
// Setup constraints
[NSLayoutConstraint activateConstraints:@[
[checkButton.centerXAnchor constraintEqualToAnchor:self.centerXAnchor],
[checkButton.centerYAnchor constraintEqualToAnchor:self.centerYAnchor],
]];
}
return self;
}
- (void)setNode:(FileListNode*)node
{
_node = node;
[self updateDisplay];
}
- (void)updateDisplay
{
if (!self.node)
{
return;
}
FileListNode* node = self.node;
Torrent* torrent = node.torrent;
// Update checkbox state
self.checkButton.state = [torrent checkForFiles:node.indexes];
self.checkButton.enabled = [torrent canChangeDownloadCheckForFiles:node.indexes];
// Update tooltip
[self updateTooltip];
}
- (void)updateTooltip
{
if (!self.node)
{
return;
}
NSString* tooltip = nil;
switch (self.checkButton.state)
{
case NSControlStateValueOff:
tooltip = NSLocalizedString(@"Don't Download", "files tab -> tooltip");
break;
case NSControlStateValueOn:
tooltip = NSLocalizedString(@"Download", "files tab -> tooltip");
break;
case NSControlStateValueMixed:
tooltip = NSLocalizedString(@"Download Some", "files tab -> tooltip");
break;
}
self.checkButton.toolTip = tooltip;
}
- (void)checkButtonClicked:(NSButton*)sender
{
if (!self.node)
{
return;
}
FileListNode* node = self.node;
Torrent* torrent = node.torrent;
NSIndexSet* indexSet;
if (NSEvent.modifierFlags & NSEventModifierFlagOption)
{
indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, torrent.fileCount)];
}
else
{
indexSet = node.indexes;
}
[torrent setFileCheckState:sender.state != NSControlStateValueOff ? NSControlStateValueOn : NSControlStateValueOff
forIndexes:indexSet];
// Notify that we need to refresh
[NSNotificationCenter.defaultCenter postNotificationName:@"UpdateUI" object:nil];
}
@end