mirror of
https://github.com/transmission/transmission
synced 2025-03-16 08:49:47 +00:00
macOS revert fullscreen changes (#3304)
* macOS remove NSWindow subclass as discussed in #3297
This commit is contained in:
parent
037f1bf403
commit
c6b49e99d8
12 changed files with 443 additions and 409 deletions
|
@ -21,7 +21,6 @@
|
||||||
3C7A11980D0B2EE300B5701F /* getgateway.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11920D0B2EE300B5701F /* getgateway.h */; };
|
3C7A11980D0B2EE300B5701F /* getgateway.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11920D0B2EE300B5701F /* getgateway.h */; };
|
||||||
3C7A11990D0B2EE300B5701F /* natpmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A11930D0B2EE300B5701F /* natpmp.c */; };
|
3C7A11990D0B2EE300B5701F /* natpmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 3C7A11930D0B2EE300B5701F /* natpmp.c */; };
|
||||||
3C7A119A0D0B2EE300B5701F /* natpmp.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11940D0B2EE300B5701F /* natpmp.h */; };
|
3C7A119A0D0B2EE300B5701F /* natpmp.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C7A11940D0B2EE300B5701F /* natpmp.h */; };
|
||||||
456B90D02855332F000D4D80 /* ControllerWindowMethods.mm in Sources */ = {isa = PBXBuildFile; fileRef = 456B90CE2855332F000D4D80 /* ControllerWindowMethods.mm */; };
|
|
||||||
45A7D3292843B54D00F0C32A /* GroupPopUpButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 45A7D3282843B54D00F0C32A /* GroupPopUpButtonCell.mm */; };
|
45A7D3292843B54D00F0C32A /* GroupPopUpButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 45A7D3282843B54D00F0C32A /* GroupPopUpButtonCell.mm */; };
|
||||||
45A7D32C2843B55F00F0C32A /* PriorityPopUpButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 45A7D32B2843B55F00F0C32A /* PriorityPopUpButtonCell.mm */; };
|
45A7D32C2843B55F00F0C32A /* PriorityPopUpButtonCell.mm in Sources */ = {isa = PBXBuildFile; fileRef = 45A7D32B2843B55F00F0C32A /* PriorityPopUpButtonCell.mm */; };
|
||||||
4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */; };
|
4D043A7F090AE979009FEDA8 /* TransmissionDocument.icns in Resources */ = {isa = PBXBuildFile; fileRef = 4D043A7E090AE979009FEDA8 /* TransmissionDocument.icns */; };
|
||||||
|
@ -614,8 +613,6 @@
|
||||||
3C7A11920D0B2EE300B5701F /* getgateway.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = getgateway.h; sourceTree = "<group>"; };
|
3C7A11920D0B2EE300B5701F /* getgateway.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = getgateway.h; sourceTree = "<group>"; };
|
||||||
3C7A11930D0B2EE300B5701F /* natpmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = natpmp.c; sourceTree = "<group>"; };
|
3C7A11930D0B2EE300B5701F /* natpmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = natpmp.c; sourceTree = "<group>"; };
|
||||||
3C7A11940D0B2EE300B5701F /* natpmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = natpmp.h; sourceTree = "<group>"; };
|
3C7A11940D0B2EE300B5701F /* natpmp.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = natpmp.h; sourceTree = "<group>"; };
|
||||||
456B90CE2855332F000D4D80 /* ControllerWindowMethods.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ControllerWindowMethods.mm; sourceTree = "<group>"; };
|
|
||||||
456B90CF2855332F000D4D80 /* ControllerWindowMethods.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ControllerWindowMethods.h; sourceTree = "<group>"; };
|
|
||||||
45A7D3272843B54D00F0C32A /* GroupPopUpButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupPopUpButtonCell.h; sourceTree = "<group>"; };
|
45A7D3272843B54D00F0C32A /* GroupPopUpButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = GroupPopUpButtonCell.h; sourceTree = "<group>"; };
|
||||||
45A7D3282843B54D00F0C32A /* GroupPopUpButtonCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GroupPopUpButtonCell.mm; sourceTree = "<group>"; };
|
45A7D3282843B54D00F0C32A /* GroupPopUpButtonCell.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = GroupPopUpButtonCell.mm; sourceTree = "<group>"; };
|
||||||
45A7D32A2843B55F00F0C32A /* PriorityPopUpButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PriorityPopUpButtonCell.h; sourceTree = "<group>"; };
|
45A7D32A2843B55F00F0C32A /* PriorityPopUpButtonCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PriorityPopUpButtonCell.h; sourceTree = "<group>"; };
|
||||||
|
@ -1391,8 +1388,6 @@
|
||||||
C86BCD9828228A9600F45599 /* SparkleProxy.mm */,
|
C86BCD9828228A9600F45599 /* SparkleProxy.mm */,
|
||||||
4DF0C5AA0899190500DD8943 /* Controller.h */,
|
4DF0C5AA0899190500DD8943 /* Controller.h */,
|
||||||
4DF0C5A90899190500DD8943 /* Controller.mm */,
|
4DF0C5A90899190500DD8943 /* Controller.mm */,
|
||||||
456B90CF2855332F000D4D80 /* ControllerWindowMethods.h */,
|
|
||||||
456B90CE2855332F000D4D80 /* ControllerWindowMethods.mm */,
|
|
||||||
4DFBC2DD09C0970D00D5C571 /* Torrent.h */,
|
4DFBC2DD09C0970D00D5C571 /* Torrent.h */,
|
||||||
4DFBC2DE09C0970D00D5C571 /* Torrent.mm */,
|
4DFBC2DE09C0970D00D5C571 /* Torrent.mm */,
|
||||||
A27F0F310E19AD9800B2DB97 /* TorrentGroup.h */,
|
A27F0F310E19AD9800B2DB97 /* TorrentGroup.h */,
|
||||||
|
@ -3028,7 +3023,6 @@
|
||||||
35F373030C2DA89000DAA8F2 /* FilePriorityCell.mm in Sources */,
|
35F373030C2DA89000DAA8F2 /* FilePriorityCell.mm in Sources */,
|
||||||
A2085DDC0C53BC74000BC3B7 /* AboutWindowController.mm in Sources */,
|
A2085DDC0C53BC74000BC3B7 /* AboutWindowController.mm in Sources */,
|
||||||
A21282A80CA6C66800EAEE0F /* StatusBarView.mm in Sources */,
|
A21282A80CA6C66800EAEE0F /* StatusBarView.mm in Sources */,
|
||||||
456B90D02855332F000D4D80 /* ControllerWindowMethods.mm in Sources */,
|
|
||||||
A257C1820CAD3003004E121C /* PeerTableView.mm in Sources */,
|
A257C1820CAD3003004E121C /* PeerTableView.mm in Sources */,
|
||||||
A2A6321B0CD9751700E3DA60 /* BadgeView.mm in Sources */,
|
A2A6321B0CD9751700E3DA60 /* BadgeView.mm in Sources */,
|
||||||
A2ED7D8F0CEF431B00970975 /* FilterButton.mm in Sources */,
|
A2ED7D8F0CEF431B00970975 /* FilterButton.mm in Sources */,
|
||||||
|
|
|
@ -74,8 +74,8 @@
|
||||||
self.fNameField.stringValue = name;
|
self.fNameField.stringValue = name;
|
||||||
self.fNameField.toolTip = name;
|
self.fNameField.toolTip = name;
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
[self setGroupsMenu];
|
[self setGroupsMenu];
|
||||||
[self.fGroupPopUp selectItemWithTag:self.fGroupValue];
|
[self.fGroupPopUp selectItemWithTag:self.fGroupValue];
|
||||||
|
|
|
@ -106,8 +106,8 @@
|
||||||
self.fNameField.stringValue = name;
|
self.fNameField.stringValue = name;
|
||||||
self.fNameField.toolTip = name;
|
self.fNameField.toolTip = name;
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
self.fIconView.image = self.torrent.icon;
|
self.fIconView.image = self.torrent.icon;
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,6 @@ set(${PROJECT_NAME}_SOURCES
|
||||||
ButtonToolbarItem.mm
|
ButtonToolbarItem.mm
|
||||||
ColorTextField.mm
|
ColorTextField.mm
|
||||||
Controller.mm
|
Controller.mm
|
||||||
ControllerWindowMethods.mm
|
|
||||||
CreatorWindowController.mm
|
CreatorWindowController.mm
|
||||||
DragOverlayView.mm
|
DragOverlayView.mm
|
||||||
DragOverlayWindow.mm
|
DragOverlayWindow.mm
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include <libtransmission/transmission.h>
|
#include <libtransmission/transmission.h>
|
||||||
|
|
||||||
#import "VDKQueue.h"
|
#import "VDKQueue.h"
|
||||||
#import "TorrentTableView.h"
|
|
||||||
|
|
||||||
@class AddMagnetWindowController;
|
@class AddMagnetWindowController;
|
||||||
@class AddWindowController;
|
@class AddWindowController;
|
||||||
|
@ -159,12 +158,20 @@ typedef NS_ENUM(unsigned int, addType) { //
|
||||||
- (void)toggleAvailabilityBar:(id)sender;
|
- (void)toggleAvailabilityBar:(id)sender;
|
||||||
|
|
||||||
- (void)toggleStatusBar:(id)sender;
|
- (void)toggleStatusBar:(id)sender;
|
||||||
|
- (void)showStatusBar:(BOOL)show animate:(BOOL)animate;
|
||||||
- (void)toggleFilterBar:(id)sender;
|
- (void)toggleFilterBar:(id)sender;
|
||||||
|
- (void)showFilterBar:(BOOL)show animate:(BOOL)animate;
|
||||||
- (void)focusFilterField;
|
- (void)focusFilterField;
|
||||||
|
|
||||||
- (void)allToolbarClicked:(id)sender;
|
- (void)allToolbarClicked:(id)sender;
|
||||||
- (void)selectedToolbarClicked:(id)sender;
|
- (void)selectedToolbarClicked:(id)sender;
|
||||||
|
|
||||||
|
- (void)setWindowSizeToFit;
|
||||||
|
@property(nonatomic, readonly) NSRect sizedWindowFrame;
|
||||||
|
- (void)updateForAutoSize;
|
||||||
|
- (void)setWindowMinMaxToCurrent;
|
||||||
|
@property(nonatomic, readonly) CGFloat minWindowContentSizeAllowed;
|
||||||
|
|
||||||
- (void)updateForExpandCollapse;
|
- (void)updateForExpandCollapse;
|
||||||
|
|
||||||
- (void)showMainWindow:(id)sender;
|
- (void)showMainWindow:(id)sender;
|
||||||
|
@ -184,71 +191,4 @@ typedef NS_ENUM(unsigned int, addType) { //
|
||||||
- (void)rpcMovedTorrent:(Torrent*)torrent;
|
- (void)rpcMovedTorrent:(Torrent*)torrent;
|
||||||
- (void)rpcUpdateQueue;
|
- (void)rpcUpdateQueue;
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSWindow* fWindow;
|
|
||||||
@property(nonatomic) IBOutlet TorrentTableView* fTableView;
|
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fOpenIgnoreDownloadFolder;
|
|
||||||
@property(nonatomic) IBOutlet NSButton* fActionButton;
|
|
||||||
@property(nonatomic) IBOutlet NSButton* fSpeedLimitButton;
|
|
||||||
@property(nonatomic) IBOutlet NSButton* fClearCompletedButton;
|
|
||||||
@property(nonatomic) IBOutlet NSTextField* fTotalTorrentsField;
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fNextFilterItem;
|
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fNextInfoTabItem;
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fPrevInfoTabItem;
|
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSMenu* fSortMenu;
|
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSMenu* fGroupsSetMenu;
|
|
||||||
@property(nonatomic) IBOutlet NSMenu* fGroupsSetContextMenu;
|
|
||||||
|
|
||||||
@property(nonatomic) IBOutlet NSMenu* fShareMenu;
|
|
||||||
@property(nonatomic) IBOutlet NSMenu* fShareContextMenu;
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fShareMenuItem; // remove when dropping 10.6
|
|
||||||
@property(nonatomic) IBOutlet NSMenuItem* fShareContextMenuItem; // remove when dropping 10.6
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) tr_session* fLib;
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) NSMutableArray<Torrent*>* fTorrents;
|
|
||||||
@property(nonatomic, readonly) NSMutableArray* fDisplayedTorrents;
|
|
||||||
@property(nonatomic, readonly) NSMutableDictionary<NSString*, Torrent*>* fTorrentHashes;
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) InfoWindowController* fInfoController;
|
|
||||||
@property(nonatomic) MessageWindowController* fMessageController;
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) NSUserDefaults* fDefaults;
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) NSString* fConfigDirectory;
|
|
||||||
|
|
||||||
@property(nonatomic) DragOverlayWindow* fOverlayWindow;
|
|
||||||
|
|
||||||
@property(nonatomic) io_connect_t fRootPort;
|
|
||||||
@property(nonatomic) NSTimer* fTimer;
|
|
||||||
|
|
||||||
@property(nonatomic) StatusBarController* fStatusBar;
|
|
||||||
|
|
||||||
@property(nonatomic) FilterBarController* fFilterBar;
|
|
||||||
|
|
||||||
@property(nonatomic) QLPreviewPanel* fPreviewPanel;
|
|
||||||
@property(nonatomic) BOOL fQuitting;
|
|
||||||
@property(nonatomic) BOOL fQuitRequested;
|
|
||||||
@property(nonatomic, readonly) BOOL fPauseOnLaunch;
|
|
||||||
|
|
||||||
@property(nonatomic) Badger* fBadger;
|
|
||||||
|
|
||||||
@property(nonatomic) NSMutableArray<NSString*>* fAutoImportedNames;
|
|
||||||
@property(nonatomic) NSTimer* fAutoImportTimer;
|
|
||||||
|
|
||||||
@property(nonatomic) NSMutableDictionary<NSURL*, id>* fPendingTorrentDownloads;
|
|
||||||
|
|
||||||
@property(nonatomic) NSMutableSet<Torrent*>* fAddingTransfers;
|
|
||||||
|
|
||||||
@property(nonatomic) NSMutableSet<NSWindowController*>* fAddWindows;
|
|
||||||
@property(nonatomic) URLSheetWindowController* fUrlSheetController;
|
|
||||||
|
|
||||||
@property(nonatomic) BOOL fGlobalPopoverShown;
|
|
||||||
@property(nonatomic) NSView* fPositioningView;
|
|
||||||
@property(nonatomic) BOOL fSoundPlaying;
|
|
||||||
@property(nonatomic) id fNoNapActivity;
|
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -22,9 +22,9 @@
|
||||||
#import "CocoaCompatibility.h"
|
#import "CocoaCompatibility.h"
|
||||||
|
|
||||||
#import "Controller.h"
|
#import "Controller.h"
|
||||||
#import "ControllerWindowMethods.h"
|
|
||||||
#import "Torrent.h"
|
#import "Torrent.h"
|
||||||
#import "TorrentGroup.h"
|
#import "TorrentGroup.h"
|
||||||
|
#import "TorrentTableView.h"
|
||||||
#import "CreatorWindowController.h"
|
#import "CreatorWindowController.h"
|
||||||
#import "StatsWindowController.h"
|
#import "StatsWindowController.h"
|
||||||
#import "InfoWindowController.h"
|
#import "InfoWindowController.h"
|
||||||
|
@ -42,6 +42,8 @@
|
||||||
#import "ShareTorrentFileHelper.h"
|
#import "ShareTorrentFileHelper.h"
|
||||||
#import "ToolbarSegmentedCell.h"
|
#import "ToolbarSegmentedCell.h"
|
||||||
#import "BlocklistDownloader.h"
|
#import "BlocklistDownloader.h"
|
||||||
|
#import "StatusBarController.h"
|
||||||
|
#import "FilterBarController.h"
|
||||||
#import "FileRenameSheetController.h"
|
#import "FileRenameSheetController.h"
|
||||||
#import "BonjourController.h"
|
#import "BonjourController.h"
|
||||||
#import "Badger.h"
|
#import "Badger.h"
|
||||||
|
@ -101,6 +103,10 @@ typedef NS_ENUM(unsigned int, sortOrderTag) { //
|
||||||
|
|
||||||
#define ROW_HEIGHT_REGULAR 62.0
|
#define ROW_HEIGHT_REGULAR 62.0
|
||||||
#define ROW_HEIGHT_SMALL 22.0
|
#define ROW_HEIGHT_SMALL 22.0
|
||||||
|
#define WINDOW_REGULAR_WIDTH 468.0
|
||||||
|
|
||||||
|
#define STATUS_BAR_HEIGHT 21.0
|
||||||
|
#define FILTER_BAR_HEIGHT 23.0
|
||||||
|
|
||||||
#define UPDATE_UI_SECONDS 1.0
|
#define UPDATE_UI_SECONDS 1.0
|
||||||
|
|
||||||
|
@ -221,6 +227,77 @@ static void removeKeRangerRansomware()
|
||||||
NSLog(@"OSX.KeRanger.A ransomware removal completed, proceeding to normal operation");
|
NSLog(@"OSX.KeRanger.A ransomware removal completed, proceeding to normal operation");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@interface Controller ()
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSWindow* fWindow;
|
||||||
|
@property(nonatomic) IBOutlet TorrentTableView* fTableView;
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fOpenIgnoreDownloadFolder;
|
||||||
|
@property(nonatomic) IBOutlet NSButton* fActionButton;
|
||||||
|
@property(nonatomic) IBOutlet NSButton* fSpeedLimitButton;
|
||||||
|
@property(nonatomic) IBOutlet NSButton* fClearCompletedButton;
|
||||||
|
@property(nonatomic) IBOutlet NSTextField* fTotalTorrentsField;
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fNextFilterItem;
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fNextInfoTabItem;
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fPrevInfoTabItem;
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSMenu* fSortMenu;
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSMenu* fGroupsSetMenu;
|
||||||
|
@property(nonatomic) IBOutlet NSMenu* fGroupsSetContextMenu;
|
||||||
|
|
||||||
|
@property(nonatomic) IBOutlet NSMenu* fShareMenu;
|
||||||
|
@property(nonatomic) IBOutlet NSMenu* fShareContextMenu;
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fShareMenuItem; // remove when dropping 10.6
|
||||||
|
@property(nonatomic) IBOutlet NSMenuItem* fShareContextMenuItem; // remove when dropping 10.6
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) tr_session* fLib;
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) NSMutableArray<Torrent*>* fTorrents;
|
||||||
|
@property(nonatomic, readonly) NSMutableArray* fDisplayedTorrents;
|
||||||
|
@property(nonatomic, readonly) NSMutableDictionary<NSString*, Torrent*>* fTorrentHashes;
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) InfoWindowController* fInfoController;
|
||||||
|
@property(nonatomic) MessageWindowController* fMessageController;
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) NSUserDefaults* fDefaults;
|
||||||
|
|
||||||
|
@property(nonatomic, readonly) NSString* fConfigDirectory;
|
||||||
|
|
||||||
|
@property(nonatomic) DragOverlayWindow* fOverlayWindow;
|
||||||
|
|
||||||
|
@property(nonatomic) io_connect_t fRootPort;
|
||||||
|
@property(nonatomic) NSTimer* fTimer;
|
||||||
|
|
||||||
|
@property(nonatomic) StatusBarController* fStatusBar;
|
||||||
|
|
||||||
|
@property(nonatomic) FilterBarController* fFilterBar;
|
||||||
|
|
||||||
|
@property(nonatomic) QLPreviewPanel* fPreviewPanel;
|
||||||
|
@property(nonatomic) BOOL fQuitting;
|
||||||
|
@property(nonatomic) BOOL fQuitRequested;
|
||||||
|
@property(nonatomic, readonly) BOOL fPauseOnLaunch;
|
||||||
|
|
||||||
|
@property(nonatomic) Badger* fBadger;
|
||||||
|
|
||||||
|
@property(nonatomic) NSMutableArray<NSString*>* fAutoImportedNames;
|
||||||
|
@property(nonatomic) NSTimer* fAutoImportTimer;
|
||||||
|
|
||||||
|
@property(nonatomic) NSMutableDictionary<NSURL*, id>* fPendingTorrentDownloads;
|
||||||
|
|
||||||
|
@property(nonatomic) NSMutableSet<Torrent*>* fAddingTransfers;
|
||||||
|
|
||||||
|
@property(nonatomic) NSMutableSet<NSWindowController*>* fAddWindows;
|
||||||
|
@property(nonatomic) URLSheetWindowController* fUrlSheetController;
|
||||||
|
|
||||||
|
@property(nonatomic) BOOL fGlobalPopoverShown;
|
||||||
|
@property(nonatomic) NSView* fPositioningView;
|
||||||
|
@property(nonatomic) BOOL fSoundPlaying;
|
||||||
|
@property(nonatomic) id fNoNapActivity;
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
@implementation Controller
|
@implementation Controller
|
||||||
|
|
||||||
+ (void)initialize
|
+ (void)initialize
|
||||||
|
@ -485,12 +562,12 @@ static void removeKeRangerRansomware()
|
||||||
|
|
||||||
self.fWindow.delegate = self; //do manually to avoid placement issue
|
self.fWindow.delegate = self; //do manually to avoid placement issue
|
||||||
|
|
||||||
|
//disable fullscreen support
|
||||||
|
[self.fWindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
[self.fWindow makeFirstResponder:self.fTableView];
|
[self.fWindow makeFirstResponder:self.fTableView];
|
||||||
self.fWindow.excludedFromWindowsMenu = YES;
|
self.fWindow.excludedFromWindowsMenu = YES;
|
||||||
|
|
||||||
//make window primary view in fullscreen
|
|
||||||
[self.fWindow setCollectionBehavior:NSWindowCollectionBehaviorFullScreenPrimary];
|
|
||||||
|
|
||||||
//set table size
|
//set table size
|
||||||
BOOL const small = [self.fDefaults boolForKey:@"SmallView"];
|
BOOL const small = [self.fDefaults boolForKey:@"SmallView"];
|
||||||
if (small)
|
if (small)
|
||||||
|
@ -504,6 +581,12 @@ static void removeKeRangerRansomware()
|
||||||
|
|
||||||
self.fTotalTorrentsField.cell.backgroundStyle = NSBackgroundStyleRaised;
|
self.fTotalTorrentsField.cell.backgroundStyle = NSBackgroundStyleRaised;
|
||||||
|
|
||||||
|
//set up filter bar
|
||||||
|
[self showFilterBar:[self.fDefaults boolForKey:@"FilterBar"] animate:NO];
|
||||||
|
|
||||||
|
//set up status bar
|
||||||
|
[self showStatusBar:[self.fDefaults boolForKey:@"StatusBar"] animate:NO];
|
||||||
|
|
||||||
self.fActionButton.toolTip = NSLocalizedString(@"Shortcuts for changing global settings.", "Main window -> 1st bottom left button (action) tooltip");
|
self.fActionButton.toolTip = NSLocalizedString(@"Shortcuts for changing global settings.", "Main window -> 1st bottom left button (action) tooltip");
|
||||||
self.fSpeedLimitButton.toolTip = NSLocalizedString(
|
self.fSpeedLimitButton.toolTip = NSLocalizedString(
|
||||||
@"Speed Limit overrides the total bandwidth limits with its own limits.",
|
@"Speed Limit overrides the total bandwidth limits with its own limits.",
|
||||||
|
@ -547,6 +630,13 @@ static void removeKeRangerRansomware()
|
||||||
[self.fSortMenu insertItem:item atIndex:sortMenuIndex++];
|
[self.fSortMenu insertItem:item atIndex:sortMenuIndex++];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//you would think this would be called later in this method from updateUI, but it's not reached in awakeFromNib
|
||||||
|
//this must be called after showStatusBar:
|
||||||
|
[self.fStatusBar updateWithDownload:0.0 upload:0.0];
|
||||||
|
|
||||||
|
//this should also be after the rest of the setup
|
||||||
|
[self updateForAutoSize];
|
||||||
|
|
||||||
//register for sleep notifications
|
//register for sleep notifications
|
||||||
IONotificationPortRef notify;
|
IONotificationPortRef notify;
|
||||||
io_object_t iterator;
|
io_object_t iterator;
|
||||||
|
@ -658,7 +748,7 @@ static void removeKeRangerRansomware()
|
||||||
#warning rename
|
#warning rename
|
||||||
[nc addObserver:self selector:@selector(fullUpdateUI) name:@"UpdateQueue" object:nil];
|
[nc addObserver:self selector:@selector(fullUpdateUI) name:@"UpdateQueue" object:nil];
|
||||||
|
|
||||||
[nc addObserver:self selector:@selector(drawMainWindow) name:@"ApplyFilter" object:nil];
|
[nc addObserver:self selector:@selector(applyFilter) name:@"ApplyFilter" object:nil];
|
||||||
|
|
||||||
//open newly created torrent file
|
//open newly created torrent file
|
||||||
[nc addObserver:self selector:@selector(beginCreateFile:) name:@"BeginCreateTorrentFile" object:nil];
|
[nc addObserver:self selector:@selector(beginCreateFile:) name:@"BeginCreateTorrentFile" object:nil];
|
||||||
|
@ -668,8 +758,6 @@ static void removeKeRangerRansomware()
|
||||||
|
|
||||||
[nc addObserver:self selector:@selector(applyFilter) name:@"UpdateGroups" object:nil];
|
[nc addObserver:self selector:@selector(applyFilter) name:@"UpdateGroups" object:nil];
|
||||||
|
|
||||||
[self drawMainWindow];
|
|
||||||
|
|
||||||
//timer to update the interface every second
|
//timer to update the interface every second
|
||||||
[self updateUI];
|
[self updateUI];
|
||||||
self.fTimer = [NSTimer scheduledTimerWithTimeInterval:UPDATE_UI_SECONDS target:self selector:@selector(updateUI)
|
self.fTimer = [NSTimer scheduledTimerWithTimeInterval:UPDATE_UI_SECONDS target:self selector:@selector(updateUI)
|
||||||
|
@ -678,6 +766,8 @@ static void removeKeRangerRansomware()
|
||||||
[NSRunLoop.currentRunLoop addTimer:self.fTimer forMode:NSModalPanelRunLoopMode];
|
[NSRunLoop.currentRunLoop addTimer:self.fTimer forMode:NSModalPanelRunLoopMode];
|
||||||
[NSRunLoop.currentRunLoop addTimer:self.fTimer forMode:NSEventTrackingRunLoopMode];
|
[NSRunLoop.currentRunLoop addTimer:self.fTimer forMode:NSEventTrackingRunLoopMode];
|
||||||
|
|
||||||
|
[self applyFilter];
|
||||||
|
|
||||||
[self.fWindow makeKeyAndOrderFront:nil];
|
[self.fWindow makeKeyAndOrderFront:nil];
|
||||||
|
|
||||||
if ([self.fDefaults boolForKey:@"InfoVisible"])
|
if ([self.fDefaults boolForKey:@"InfoVisible"])
|
||||||
|
@ -879,6 +969,9 @@ static void removeKeRangerRansomware()
|
||||||
[window close];
|
[window close];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self showStatusBar:NO animate:NO];
|
||||||
|
[self showFilterBar:NO animate:NO];
|
||||||
|
|
||||||
//save history
|
//save history
|
||||||
[self updateTorrentHistory];
|
[self updateTorrentHistory];
|
||||||
[self.fTableView saveCollapsedGroups];
|
[self.fTableView saveCollapsedGroups];
|
||||||
|
@ -1114,7 +1207,7 @@ static void removeKeRangerRansomware()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
[self drawMainWindow];
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)askOpenConfirmed:(AddWindowController*)addController add:(BOOL)add
|
- (void)askOpenConfirmed:(AddWindowController*)addController add:(BOOL)add
|
||||||
|
@ -1134,7 +1227,7 @@ static void removeKeRangerRansomware()
|
||||||
}
|
}
|
||||||
[self.fAddingTransfers addObject:torrent];
|
[self.fAddingTransfers addObject:torrent];
|
||||||
|
|
||||||
[self drawMainWindow];
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1208,7 +1301,7 @@ static void removeKeRangerRansomware()
|
||||||
[self.fAddingTransfers addObject:torrent];
|
[self.fAddingTransfers addObject:torrent];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self drawMainWindow];
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)askOpenMagnetConfirmed:(AddMagnetWindowController*)addController add:(BOOL)add
|
- (void)askOpenMagnetConfirmed:(AddMagnetWindowController*)addController add:(BOOL)add
|
||||||
|
@ -1228,7 +1321,7 @@ static void removeKeRangerRansomware()
|
||||||
}
|
}
|
||||||
[self.fAddingTransfers addObject:torrent];
|
[self.fAddingTransfers addObject:torrent];
|
||||||
|
|
||||||
[self drawMainWindow];
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1725,8 +1818,6 @@ static void removeKeRangerRansomware()
|
||||||
{
|
{
|
||||||
[torrent closeRemoveTorrent:deleteData];
|
[torrent closeRemoveTorrent:deleteData];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self drawMainWindow];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
[self.fTableView beginUpdates];
|
[self.fTableView beginUpdates];
|
||||||
|
@ -1768,9 +1859,9 @@ static void removeKeRangerRansomware()
|
||||||
{
|
{
|
||||||
[torrent closeRemoveTorrent:deleteData];
|
[torrent closeRemoveTorrent:deleteData];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self drawMainWindow];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)removeNoDelete:(id)sender
|
- (void)removeNoDelete:(id)sender
|
||||||
|
@ -3728,7 +3819,7 @@ static void removeKeRangerRansomware()
|
||||||
[self.fTableView endUpdates];
|
[self.fTableView endUpdates];
|
||||||
|
|
||||||
//resize for larger min height if not set to auto size
|
//resize for larger min height if not set to auto size
|
||||||
if (![self.fDefaults boolForKey:@"AutoSize"] || self.isFullScreen)
|
if (![self.fDefaults boolForKey:@"AutoSize"])
|
||||||
{
|
{
|
||||||
NSSize const contentSize = self.fWindow.contentView.frame.size;
|
NSSize const contentSize = self.fWindow.contentView.frame.size;
|
||||||
|
|
||||||
|
@ -3751,8 +3842,6 @@ static void removeKeRangerRansomware()
|
||||||
{
|
{
|
||||||
[self setWindowSizeToFit];
|
[self setWindowSizeToFit];
|
||||||
}
|
}
|
||||||
|
|
||||||
[self drawMainWindow];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)togglePiecesBar:(id)sender
|
- (void)togglePiecesBar:(id)sender
|
||||||
|
@ -3767,29 +3856,266 @@ static void removeKeRangerRansomware()
|
||||||
[self.fTableView display];
|
[self.fTableView display];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSRect)windowFrameByAddingHeight:(CGFloat)height checkLimits:(BOOL)check
|
||||||
|
{
|
||||||
|
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
||||||
|
|
||||||
|
//convert pixels to points
|
||||||
|
NSRect windowFrame = self.fWindow.frame;
|
||||||
|
NSSize windowSize = [scrollView convertSize:windowFrame.size fromView:nil];
|
||||||
|
windowSize.height += height;
|
||||||
|
|
||||||
|
if (check)
|
||||||
|
{
|
||||||
|
//we can't call minSize, since it might be set to the current size (auto size)
|
||||||
|
CGFloat const minHeight = self.minWindowContentSizeAllowed +
|
||||||
|
(NSHeight(self.fWindow.frame) - NSHeight(self.fWindow.contentView.frame)); //contentView to window
|
||||||
|
|
||||||
|
if (windowSize.height <= minHeight)
|
||||||
|
{
|
||||||
|
windowSize.height = minHeight;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSScreen* screen = self.fWindow.screen;
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
NSSize maxSize = [scrollView convertSize:screen.visibleFrame.size fromView:nil];
|
||||||
|
if (!self.fStatusBar)
|
||||||
|
{
|
||||||
|
maxSize.height -= STATUS_BAR_HEIGHT;
|
||||||
|
}
|
||||||
|
if (!self.fFilterBar)
|
||||||
|
{
|
||||||
|
maxSize.height -= FILTER_BAR_HEIGHT;
|
||||||
|
}
|
||||||
|
if (windowSize.height > maxSize.height)
|
||||||
|
{
|
||||||
|
windowSize.height = maxSize.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//convert points to pixels
|
||||||
|
windowSize = [scrollView convertSize:windowSize toView:nil];
|
||||||
|
|
||||||
|
windowFrame.origin.y -= (windowSize.height - windowFrame.size.height);
|
||||||
|
windowFrame.size.height = windowSize.height;
|
||||||
|
return windowFrame;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)toggleStatusBar:(id)sender
|
- (void)toggleStatusBar:(id)sender
|
||||||
{
|
{
|
||||||
BOOL const show = self.fStatusBar == nil;
|
BOOL const show = self.fStatusBar == nil;
|
||||||
|
[self showStatusBar:show animate:YES];
|
||||||
[self.fDefaults setBool:show forKey:@"StatusBar"];
|
[self.fDefaults setBool:show forKey:@"StatusBar"];
|
||||||
[self drawMainWindow];
|
}
|
||||||
|
|
||||||
|
//doesn't save shown state
|
||||||
|
- (void)showStatusBar:(BOOL)show animate:(BOOL)animate
|
||||||
|
{
|
||||||
|
BOOL const prevShown = self.fStatusBar != nil;
|
||||||
|
if (show == prevShown)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show)
|
||||||
|
{
|
||||||
|
self.fStatusBar = [[StatusBarController alloc] initWithLib:self.fLib];
|
||||||
|
|
||||||
|
NSView* contentView = self.fWindow.contentView;
|
||||||
|
NSSize const windowSize = [contentView convertSize:self.fWindow.frame.size fromView:nil];
|
||||||
|
|
||||||
|
NSRect statusBarFrame = self.fStatusBar.view.frame;
|
||||||
|
statusBarFrame.size.width = windowSize.width;
|
||||||
|
self.fStatusBar.view.frame = statusBarFrame;
|
||||||
|
|
||||||
|
[contentView addSubview:self.fStatusBar.view];
|
||||||
|
[self.fStatusBar.view setFrameOrigin:NSMakePoint(0.0, NSMaxY(contentView.frame))];
|
||||||
|
}
|
||||||
|
|
||||||
|
CGFloat heightChange = self.fStatusBar.view.frame.size.height;
|
||||||
|
if (!show)
|
||||||
|
{
|
||||||
|
heightChange *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//allow bar to show even if not enough room
|
||||||
|
if (show && ![self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
NSRect frame = [self windowFrameByAddingHeight:heightChange checkLimits:NO];
|
||||||
|
|
||||||
|
NSScreen* screen = self.fWindow.screen;
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
CGFloat change = screen.visibleFrame.size.height - frame.size.height;
|
||||||
|
if (change < 0.0)
|
||||||
|
{
|
||||||
|
frame = self.fWindow.frame;
|
||||||
|
frame.size.height += change;
|
||||||
|
frame.origin.y -= change;
|
||||||
|
[self.fWindow setFrame:frame display:NO animate:NO];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
[self updateUI];
|
||||||
|
|
||||||
|
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
||||||
|
|
||||||
|
//set views to not autoresize
|
||||||
|
NSUInteger const statsMask = self.fStatusBar.view.autoresizingMask;
|
||||||
|
self.fStatusBar.view.autoresizingMask = NSViewNotSizable;
|
||||||
|
NSUInteger filterMask;
|
||||||
|
if (self.fFilterBar)
|
||||||
|
{
|
||||||
|
filterMask = self.fFilterBar.view.autoresizingMask;
|
||||||
|
self.fFilterBar.view.autoresizingMask = NSViewNotSizable;
|
||||||
|
}
|
||||||
|
NSUInteger const scrollMask = scrollView.autoresizingMask;
|
||||||
|
scrollView.autoresizingMask = NSViewNotSizable;
|
||||||
|
|
||||||
|
NSRect const frame = [self windowFrameByAddingHeight:heightChange checkLimits:NO];
|
||||||
|
[self.fWindow setFrame:frame display:YES animate:animate];
|
||||||
|
|
||||||
|
//re-enable autoresize
|
||||||
|
self.fStatusBar.view.autoresizingMask = statsMask;
|
||||||
|
if (self.fFilterBar)
|
||||||
|
{
|
||||||
|
self.fFilterBar.view.autoresizingMask = filterMask;
|
||||||
|
}
|
||||||
|
scrollView.autoresizingMask = scrollMask;
|
||||||
|
|
||||||
|
if (!show)
|
||||||
|
{
|
||||||
|
[self.fStatusBar.view removeFromSuperviewWithoutNeedingDisplay];
|
||||||
|
self.fStatusBar = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
[self setWindowMinMaxToCurrent];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//change min size
|
||||||
|
NSSize minSize = self.fWindow.contentMinSize;
|
||||||
|
minSize.height += heightChange;
|
||||||
|
self.fWindow.contentMinSize = minSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)toggleFilterBar:(id)sender
|
- (void)toggleFilterBar:(id)sender
|
||||||
{
|
{
|
||||||
BOOL const show = self.fFilterBar == nil;
|
BOOL const show = self.fFilterBar == nil;
|
||||||
|
|
||||||
//disable filtering when hiding (have to do before drawMainWindow:)
|
//disable filtering when hiding (have to do before showFilterBar:animate:)
|
||||||
if (!show)
|
if (!show)
|
||||||
{
|
{
|
||||||
[self.fFilterBar reset:NO];
|
[self.fFilterBar reset:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[self showFilterBar:show animate:YES];
|
||||||
[self.fDefaults setBool:show forKey:@"FilterBar"];
|
[self.fDefaults setBool:show forKey:@"FilterBar"];
|
||||||
[self drawMainWindow];
|
[self.fWindow.toolbar validateVisibleItems];
|
||||||
|
|
||||||
|
[self applyFilter]; //do even if showing to ensure tooltips are updated
|
||||||
|
}
|
||||||
|
|
||||||
|
//doesn't save shown state
|
||||||
|
- (void)showFilterBar:(BOOL)show animate:(BOOL)animate
|
||||||
|
{
|
||||||
|
BOOL const prevShown = self.fFilterBar != nil;
|
||||||
|
if (show == prevShown)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
{
|
{
|
||||||
[self focusFilterField];
|
self.fFilterBar = [[FilterBarController alloc] init];
|
||||||
|
|
||||||
|
NSView* contentView = self.fWindow.contentView;
|
||||||
|
NSSize const windowSize = [contentView convertSize:self.fWindow.frame.size fromView:nil];
|
||||||
|
|
||||||
|
NSRect filterBarFrame = self.fFilterBar.view.frame;
|
||||||
|
filterBarFrame.size.width = windowSize.width;
|
||||||
|
self.fFilterBar.view.frame = filterBarFrame;
|
||||||
|
|
||||||
|
if (self.fStatusBar)
|
||||||
|
{
|
||||||
|
[contentView addSubview:self.fFilterBar.view positioned:NSWindowBelow relativeTo:self.fStatusBar.view];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[contentView addSubview:self.fFilterBar.view];
|
||||||
|
}
|
||||||
|
CGFloat const originY = self.fStatusBar ? NSMinY(self.fStatusBar.view.frame) : NSMaxY(contentView.frame);
|
||||||
|
[self.fFilterBar.view setFrameOrigin:NSMakePoint(0.0, originY)];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[self.fWindow makeFirstResponder:self.fTableView];
|
||||||
|
}
|
||||||
|
|
||||||
|
CGFloat heightChange = NSHeight(self.fFilterBar.view.frame);
|
||||||
|
if (!show)
|
||||||
|
{
|
||||||
|
heightChange *= -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//allow bar to show even if not enough room
|
||||||
|
if (show && ![self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
NSRect frame = [self windowFrameByAddingHeight:heightChange checkLimits:NO];
|
||||||
|
|
||||||
|
NSScreen* screen = self.fWindow.screen;
|
||||||
|
if (screen)
|
||||||
|
{
|
||||||
|
CGFloat change = screen.visibleFrame.size.height - frame.size.height;
|
||||||
|
if (change < 0.0)
|
||||||
|
{
|
||||||
|
frame = self.fWindow.frame;
|
||||||
|
frame.size.height += change;
|
||||||
|
frame.origin.y -= change;
|
||||||
|
[self.fWindow setFrame:frame display:NO animate:NO];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
||||||
|
|
||||||
|
//set views to not autoresize
|
||||||
|
NSUInteger const filterMask = self.fFilterBar.view.autoresizingMask;
|
||||||
|
NSUInteger const scrollMask = scrollView.autoresizingMask;
|
||||||
|
self.fFilterBar.view.autoresizingMask = NSViewNotSizable;
|
||||||
|
scrollView.autoresizingMask = NSViewNotSizable;
|
||||||
|
|
||||||
|
NSRect const frame = [self windowFrameByAddingHeight:heightChange checkLimits:NO];
|
||||||
|
[self.fWindow setFrame:frame display:YES animate:animate];
|
||||||
|
|
||||||
|
//re-enable autoresize
|
||||||
|
self.fFilterBar.view.autoresizingMask = filterMask;
|
||||||
|
scrollView.autoresizingMask = scrollMask;
|
||||||
|
|
||||||
|
if (!show)
|
||||||
|
{
|
||||||
|
[self.fFilterBar.view removeFromSuperviewWithoutNeedingDisplay];
|
||||||
|
self.fFilterBar = nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ([self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
[self setWindowMinMaxToCurrent];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//change min size
|
||||||
|
NSSize minSize = self.fWindow.contentMinSize;
|
||||||
|
minSize.height += heightChange;
|
||||||
|
self.fWindow.contentMinSize = minSize;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4850,6 +5176,80 @@ static void removeKeRangerRansomware()
|
||||||
return menu;
|
return menu;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSRect)windowWillUseStandardFrame:(NSWindow*)window defaultFrame:(NSRect)defaultFrame
|
||||||
|
{
|
||||||
|
//if auto size is enabled, the current frame shouldn't need to change
|
||||||
|
NSRect frame = [self.fDefaults boolForKey:@"AutoSize"] ? window.frame : self.sizedWindowFrame;
|
||||||
|
|
||||||
|
frame.size.width = [self.fDefaults boolForKey:@"SmallView"] ? self.fWindow.minSize.width : WINDOW_REGULAR_WIDTH;
|
||||||
|
return frame;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setWindowSizeToFit
|
||||||
|
{
|
||||||
|
if ([self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
||||||
|
|
||||||
|
scrollView.hasVerticalScroller = NO;
|
||||||
|
[self.fWindow setFrame:self.sizedWindowFrame display:YES animate:YES];
|
||||||
|
scrollView.hasVerticalScroller = YES;
|
||||||
|
|
||||||
|
[self setWindowMinMaxToCurrent];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSRect)sizedWindowFrame
|
||||||
|
{
|
||||||
|
NSUInteger groups = (self.fDisplayedTorrents.count > 0 && ![self.fDisplayedTorrents[0] isKindOfClass:[Torrent class]]) ?
|
||||||
|
self.fDisplayedTorrents.count :
|
||||||
|
0;
|
||||||
|
|
||||||
|
CGFloat heightChange = (GROUP_SEPARATOR_HEIGHT + self.fTableView.intercellSpacing.height) * groups +
|
||||||
|
(self.fTableView.rowHeight + self.fTableView.intercellSpacing.height) * (self.fTableView.numberOfRows - groups) -
|
||||||
|
NSHeight(self.fTableView.enclosingScrollView.frame);
|
||||||
|
|
||||||
|
return [self windowFrameByAddingHeight:heightChange checkLimits:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)updateForAutoSize
|
||||||
|
{
|
||||||
|
if ([self.fDefaults boolForKey:@"AutoSize"])
|
||||||
|
{
|
||||||
|
[self setWindowSizeToFit];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
NSSize contentMinSize = self.fWindow.contentMinSize;
|
||||||
|
contentMinSize.height = self.minWindowContentSizeAllowed;
|
||||||
|
|
||||||
|
self.fWindow.contentMinSize = contentMinSize;
|
||||||
|
|
||||||
|
NSSize contentMaxSize = self.fWindow.contentMaxSize;
|
||||||
|
contentMaxSize.height = FLT_MAX;
|
||||||
|
self.fWindow.contentMaxSize = contentMaxSize;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setWindowMinMaxToCurrent
|
||||||
|
{
|
||||||
|
CGFloat const height = NSHeight(self.fWindow.contentView.frame);
|
||||||
|
|
||||||
|
NSSize minSize = self.fWindow.contentMinSize, maxSize = self.fWindow.contentMaxSize;
|
||||||
|
minSize.height = height;
|
||||||
|
maxSize.height = height;
|
||||||
|
|
||||||
|
self.fWindow.contentMinSize = minSize;
|
||||||
|
self.fWindow.contentMaxSize = maxSize;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (CGFloat)minWindowContentSizeAllowed
|
||||||
|
{
|
||||||
|
CGFloat contentMinHeight = NSHeight(self.fWindow.contentView.frame) - NSHeight(self.fTableView.enclosingScrollView.frame) +
|
||||||
|
self.fTableView.rowHeight + self.fTableView.intercellSpacing.height;
|
||||||
|
return contentMinHeight;
|
||||||
|
}
|
||||||
|
|
||||||
- (void)updateForExpandCollapse
|
- (void)updateForExpandCollapse
|
||||||
{
|
{
|
||||||
[self setWindowSizeToFit];
|
[self setWindowSizeToFit];
|
||||||
|
@ -5007,7 +5407,7 @@ static void removeKeRangerRansomware()
|
||||||
}
|
}
|
||||||
[self.fAddingTransfers addObject:torrent];
|
[self.fAddingTransfers addObject:torrent];
|
||||||
|
|
||||||
[self drawMainWindow];
|
[self fullUpdateUI];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)rpcRemoveTorrent:(Torrent*)torrent deleteData:(BOOL)deleteData
|
- (void)rpcRemoveTorrent:(Torrent*)torrent deleteData:(BOOL)deleteData
|
||||||
|
|
|
@ -1,26 +0,0 @@
|
||||||
// This file Copyright © 2005-2022 Transmission authors and contributors.
|
|
||||||
// It may be used under the MIT (SPDX: MIT) license.
|
|
||||||
// License text can be found in the licenses/ folder.
|
|
||||||
|
|
||||||
#import "Controller.h"
|
|
||||||
#import "StatusBarController.h"
|
|
||||||
#import "FilterBarController.h"
|
|
||||||
#import "Torrent.h"
|
|
||||||
|
|
||||||
@interface Controller (ControllerWindowMethods)
|
|
||||||
|
|
||||||
- (void)drawMainWindow;
|
|
||||||
|
|
||||||
- (void)setWindowSizeToFit;
|
|
||||||
- (void)updateForAutoSize;
|
|
||||||
- (void)setWindowMinMaxToCurrent;
|
|
||||||
|
|
||||||
@property(nonatomic, readonly) NSRect sizedWindowFrame;
|
|
||||||
@property(nonatomic, readonly) CGFloat titlebarHeight;
|
|
||||||
@property(nonatomic, readonly) CGFloat mainWindowComponentHeight;
|
|
||||||
@property(nonatomic, readonly) CGFloat scrollViewHeight;
|
|
||||||
@property(nonatomic, readonly) CGFloat fullScreenScrollViewHeight;
|
|
||||||
@property(nonatomic, readonly) CGFloat minWindowContentSizeAllowed;
|
|
||||||
@property(nonatomic, readonly) BOOL isFullScreen;
|
|
||||||
|
|
||||||
@end
|
|
|
@ -1,273 +0,0 @@
|
||||||
// This file Copyright © 2005-2022 Transmission authors and contributors.
|
|
||||||
// It may be used under the MIT (SPDX: MIT) license.
|
|
||||||
// License text can be found in the licenses/ folder.
|
|
||||||
|
|
||||||
#import "ControllerWindowMethods.h"
|
|
||||||
|
|
||||||
#define WINDOW_REGULAR_WIDTH 468.0
|
|
||||||
|
|
||||||
#define STATUS_BAR_HEIGHT 21.0
|
|
||||||
#define FILTER_BAR_HEIGHT 23.0
|
|
||||||
#define BOTTOM_BAR_HEIGHT 24.0
|
|
||||||
|
|
||||||
@implementation Controller (ControllerWindowMethods)
|
|
||||||
|
|
||||||
- (void)drawMainWindow
|
|
||||||
{
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
|
||||||
NSView* contentView = self.fWindow.contentView;
|
|
||||||
NSSize const windowSize = [contentView convertSize:self.fWindow.frame.size fromView:nil];
|
|
||||||
CGFloat originY = NSMaxY(contentView.frame);
|
|
||||||
|
|
||||||
//remove all subviews
|
|
||||||
for (id view in contentView.subviews.copy)
|
|
||||||
{
|
|
||||||
[view removeFromSuperviewWithoutNeedingDisplay];
|
|
||||||
}
|
|
||||||
|
|
||||||
self.fStatusBar = nil;
|
|
||||||
self.fFilterBar = nil;
|
|
||||||
|
|
||||||
if ([self.fDefaults boolForKey:@"StatusBar"])
|
|
||||||
{
|
|
||||||
self.fStatusBar = [[StatusBarController alloc] initWithLib:self.fLib];
|
|
||||||
|
|
||||||
NSRect statusBarFrame = self.fStatusBar.view.frame;
|
|
||||||
statusBarFrame.size.width = windowSize.width;
|
|
||||||
|
|
||||||
originY -= STATUS_BAR_HEIGHT;
|
|
||||||
statusBarFrame.origin.y = originY;
|
|
||||||
self.fStatusBar.view.frame = statusBarFrame;
|
|
||||||
|
|
||||||
[contentView addSubview:self.fStatusBar.view];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([self.fDefaults boolForKey:@"FilterBar"])
|
|
||||||
{
|
|
||||||
self.fFilterBar = [[FilterBarController alloc] init];
|
|
||||||
|
|
||||||
NSRect filterBarFrame = self.fFilterBar.view.frame;
|
|
||||||
filterBarFrame.size.width = windowSize.width;
|
|
||||||
|
|
||||||
originY -= FILTER_BAR_HEIGHT;
|
|
||||||
filterBarFrame.origin.y = originY;
|
|
||||||
self.fFilterBar.view.frame = filterBarFrame;
|
|
||||||
|
|
||||||
[contentView addSubview:self.fFilterBar.view];
|
|
||||||
}
|
|
||||||
|
|
||||||
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
|
||||||
[contentView addSubview:scrollView];
|
|
||||||
|
|
||||||
[contentView addSubview:self.fActionButton];
|
|
||||||
[contentView addSubview:self.fSpeedLimitButton];
|
|
||||||
[contentView addSubview:self.fClearCompletedButton];
|
|
||||||
[contentView addSubview:self.fTotalTorrentsField];
|
|
||||||
|
|
||||||
//window is updated and animated in fullUpdateUI --> applyFilter --> setWindowSizeToFit
|
|
||||||
[self fullUpdateUI];
|
|
||||||
[self updateForAutoSize];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setWindowSizeToFit
|
|
||||||
{
|
|
||||||
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
|
||||||
|
|
||||||
scrollView.hasVerticalScroller = NO;
|
|
||||||
[self.fWindow setFrame:self.sizedWindowFrame display:YES animate:YES];
|
|
||||||
scrollView.hasVerticalScroller = YES;
|
|
||||||
|
|
||||||
if ([self.fDefaults boolForKey:@"AutoSize"])
|
|
||||||
{
|
|
||||||
if (!self.isFullScreen)
|
|
||||||
{
|
|
||||||
[self setWindowMinMaxToCurrent];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)updateForAutoSize
|
|
||||||
{
|
|
||||||
if ([self.fDefaults boolForKey:@"AutoSize"] && !self.isFullScreen)
|
|
||||||
{
|
|
||||||
[self setWindowSizeToFit];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSSize contentMinSize = self.fWindow.contentMinSize;
|
|
||||||
contentMinSize.height = self.minWindowContentSizeAllowed;
|
|
||||||
|
|
||||||
self.fWindow.contentMinSize = contentMinSize;
|
|
||||||
|
|
||||||
NSSize contentMaxSize = self.fWindow.contentMaxSize;
|
|
||||||
contentMaxSize.height = FLT_MAX;
|
|
||||||
self.fWindow.contentMaxSize = contentMaxSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)setWindowMinMaxToCurrent
|
|
||||||
{
|
|
||||||
CGFloat const height = NSHeight(self.fWindow.contentView.frame);
|
|
||||||
|
|
||||||
NSSize minSize = self.fWindow.contentMinSize, maxSize = self.fWindow.contentMaxSize;
|
|
||||||
minSize.height = height;
|
|
||||||
maxSize.height = height;
|
|
||||||
|
|
||||||
self.fWindow.contentMinSize = minSize;
|
|
||||||
self.fWindow.contentMaxSize = maxSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSRect)sizedWindowFrame
|
|
||||||
{
|
|
||||||
NSRect windowFrame = self.fWindow.frame;
|
|
||||||
NSScrollView* scrollView = self.fTableView.enclosingScrollView;
|
|
||||||
CGFloat titleBarHeight = self.titlebarHeight;
|
|
||||||
CGFloat scrollViewHeight = self.scrollViewHeight;
|
|
||||||
CGFloat componentHeight = [self mainWindowComponentHeight];
|
|
||||||
|
|
||||||
//update window frame
|
|
||||||
NSSize windowSize = [scrollView convertSize:windowFrame.size fromView:nil];
|
|
||||||
windowSize.height = titleBarHeight + componentHeight + scrollViewHeight + BOTTOM_BAR_HEIGHT;
|
|
||||||
|
|
||||||
//update scrollview
|
|
||||||
NSRect scrollViewFrame = scrollView.frame;
|
|
||||||
scrollViewFrame.size.height = scrollViewHeight;
|
|
||||||
|
|
||||||
//we can't call minSize, since it might be set to the current size (auto size)
|
|
||||||
CGFloat const minHeight = self.minWindowContentSizeAllowed +
|
|
||||||
(NSHeight(self.fWindow.frame) - NSHeight(self.fWindow.contentView.frame)); //contentView to window
|
|
||||||
|
|
||||||
if (windowSize.height <= minHeight)
|
|
||||||
{
|
|
||||||
windowSize.height = minHeight;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSScreen* screen = self.fWindow.screen;
|
|
||||||
if (screen && !self.isFullScreen)
|
|
||||||
{
|
|
||||||
NSSize maxSize = screen.frame.size;
|
|
||||||
maxSize.height -= titleBarHeight;
|
|
||||||
maxSize.height -= BOTTOM_BAR_HEIGHT;
|
|
||||||
|
|
||||||
if (self.fStatusBar)
|
|
||||||
{
|
|
||||||
maxSize.height -= STATUS_BAR_HEIGHT;
|
|
||||||
}
|
|
||||||
if (self.fFilterBar)
|
|
||||||
{
|
|
||||||
maxSize.height -= FILTER_BAR_HEIGHT;
|
|
||||||
}
|
|
||||||
if (windowSize.height > maxSize.height)
|
|
||||||
{
|
|
||||||
windowSize.height = maxSize.height;
|
|
||||||
|
|
||||||
//recalculate scrollview height
|
|
||||||
scrollViewFrame.size.height = self.fullScreenScrollViewHeight;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//commit scrollview changes
|
|
||||||
scrollViewFrame.origin.y = BOTTOM_BAR_HEIGHT;
|
|
||||||
[scrollView setFrame:scrollViewFrame];
|
|
||||||
|
|
||||||
windowFrame.origin.y -= (windowSize.height - windowFrame.size.height);
|
|
||||||
windowFrame.size.height = windowSize.height;
|
|
||||||
return windowFrame;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (CGFloat)titlebarHeight
|
|
||||||
{
|
|
||||||
return self.fWindow.frame.size.height - [self.fWindow contentRectForFrameRect:self.fWindow.frame].size.height;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (CGFloat)mainWindowComponentHeight
|
|
||||||
{
|
|
||||||
CGFloat height = 0;
|
|
||||||
if (self.fStatusBar)
|
|
||||||
{
|
|
||||||
height += STATUS_BAR_HEIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (self.fFilterBar)
|
|
||||||
{
|
|
||||||
height += FILTER_BAR_HEIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (CGFloat)scrollViewHeight
|
|
||||||
{
|
|
||||||
if (self.isFullScreen)
|
|
||||||
{
|
|
||||||
return self.fullScreenScrollViewHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ([self.fDefaults boolForKey:@"AutoSize"])
|
|
||||||
{
|
|
||||||
NSUInteger groups = (self.fDisplayedTorrents.count > 0 && ![self.fDisplayedTorrents[0] isKindOfClass:[Torrent class]]) ?
|
|
||||||
self.fDisplayedTorrents.count :
|
|
||||||
0;
|
|
||||||
|
|
||||||
CGFloat height = (GROUP_SEPARATOR_HEIGHT + self.fTableView.intercellSpacing.height) * groups +
|
|
||||||
(self.fTableView.rowHeight + self.fTableView.intercellSpacing.height) * (self.fTableView.numberOfRows - groups);
|
|
||||||
|
|
||||||
return height;
|
|
||||||
}
|
|
||||||
|
|
||||||
return NSHeight(self.fTableView.enclosingScrollView.frame);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (CGFloat)fullScreenScrollViewHeight
|
|
||||||
{
|
|
||||||
return self.fWindow.frame.size.height - self.titlebarHeight - self.mainWindowComponentHeight - BOTTOM_BAR_HEIGHT;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (CGFloat)minWindowContentSizeAllowed
|
|
||||||
{
|
|
||||||
CGFloat contentMinHeight = self.fTableView.rowHeight + self.fTableView.intercellSpacing.height +
|
|
||||||
self.mainWindowComponentHeight + BOTTOM_BAR_HEIGHT;
|
|
||||||
return contentMinHeight;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (BOOL)isFullScreen
|
|
||||||
{
|
|
||||||
return (self.fWindow.styleMask & NSFullScreenWindowMask);
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)windowWillEnterFullScreen:(NSNotification*)notification
|
|
||||||
{
|
|
||||||
// temporarily disable AutoSize
|
|
||||||
NSSize contentMinSize = self.fWindow.contentMinSize;
|
|
||||||
contentMinSize.height = self.minWindowContentSizeAllowed;
|
|
||||||
|
|
||||||
self.fWindow.contentMinSize = contentMinSize;
|
|
||||||
|
|
||||||
NSSize contentMaxSize = self.fWindow.contentMaxSize;
|
|
||||||
contentMaxSize.height = FLT_MAX;
|
|
||||||
self.fWindow.contentMaxSize = contentMaxSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)windowDidEnterFullScreen:(NSNotification*)notification
|
|
||||||
{
|
|
||||||
[self drawMainWindow];
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)windowWillExitFullScreen:(NSNotification*)notification
|
|
||||||
{
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
|
||||||
[self drawMainWindow];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
- (void)windowDidExitFullScreen:(NSNotification*)notification
|
|
||||||
{
|
|
||||||
dispatch_async(dispatch_get_main_queue(), ^{
|
|
||||||
[self drawMainWindow];
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
@end
|
|
|
@ -160,8 +160,8 @@ NSMutableSet* creatorWindowControllerSet = nil;
|
||||||
|
|
||||||
self.window.title = name;
|
self.window.title = name;
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
self.fNameField.stringValue = name;
|
self.fNameField.stringValue = name;
|
||||||
self.fNameField.toolTip = self.fPath.path;
|
self.fNameField.toolTip = self.fPath.path;
|
||||||
|
|
|
@ -66,8 +66,8 @@
|
||||||
|
|
||||||
self.window.title = NSLocalizedString(@"Message Log", "Message window -> title");
|
self.window.title = NSLocalizedString(@"Message Log", "Message window -> title");
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
//set images and text for popup button items
|
//set images and text for popup button items
|
||||||
[self.fLevelButton itemAtIndex:LEVEL_ERROR].title = NSLocalizedString(@"Error", "Message window -> level string");
|
[self.fLevelButton itemAtIndex:LEVEL_ERROR].title = NSLocalizedString(@"Error", "Message window -> level string");
|
||||||
|
|
|
@ -202,8 +202,8 @@
|
||||||
|
|
||||||
self.window.restorationClass = [self class];
|
self.window.restorationClass = [self class];
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
NSToolbar* toolbar = [[NSToolbar alloc] initWithIdentifier:@"Preferences Toolbar"];
|
NSToolbar* toolbar = [[NSToolbar alloc] initWithIdentifier:@"Preferences Toolbar"];
|
||||||
toolbar.delegate = self;
|
toolbar.delegate = self;
|
||||||
|
|
|
@ -69,8 +69,8 @@ tr_session* fLib = NULL;
|
||||||
|
|
||||||
self.window.title = NSLocalizedString(@"Statistics", "Stats window -> title");
|
self.window.title = NSLocalizedString(@"Statistics", "Stats window -> title");
|
||||||
|
|
||||||
//make window an auxillary view in fullscreen
|
//disable fullscreen support
|
||||||
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenAuxiliary];
|
[self.window setCollectionBehavior:NSWindowCollectionBehaviorFullScreenNone];
|
||||||
|
|
||||||
//set label text
|
//set label text
|
||||||
self.fUploadedLabelField.stringValue = [NSLocalizedString(@"Uploaded", "Stats window -> label") stringByAppendingString:@":"];
|
self.fUploadedLabelField.stringValue = [NSLocalizedString(@"Uploaded", "Stats window -> label") stringByAppendingString:@":"];
|
||||||
|
|
Loading…
Add table
Reference in a new issue