Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
7
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Open sidebar
GSoC
GSoC2018
macOS
vlc
Commits
8fc2554e
Commit
8fc2554e
authored
Jun 10, 2018
by
Felix Paul Kühne
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
macosx: remove remnants of the previous sidebar
parent
ca234a9e
Changes
14
Hide whitespace changes
Inline
Side-by-side
Showing
14 changed files
with
6 additions
and
1521 deletions
+6
-1521
extras/package/macosx/VLC.xcodeproj/project.pbxproj
extras/package/macosx/VLC.xcodeproj/project.pbxproj
+0
-24
modules/gui/macosx/Makefile.am
modules/gui/macosx/Makefile.am
+0
-3
modules/gui/macosx/PXSourceList.h
modules/gui/macosx/PXSourceList.h
+0
-32
modules/gui/macosx/PXSourceList.m
modules/gui/macosx/PXSourceList.m
+0
-831
modules/gui/macosx/PXSourceListDataSource.h
modules/gui/macosx/PXSourceListDataSource.h
+0
-41
modules/gui/macosx/PXSourceListDelegate.h
modules/gui/macosx/PXSourceListDelegate.h
+0
-63
modules/gui/macosx/SideBarItem.h
modules/gui/macosx/SideBarItem.h
+0
-50
modules/gui/macosx/SideBarItem.m
modules/gui/macosx/SideBarItem.m
+0
-70
modules/gui/macosx/UI/MainMenu.xib
modules/gui/macosx/UI/MainMenu.xib
+5
-15
modules/gui/macosx/VLCMainMenu.h
modules/gui/macosx/VLCMainMenu.h
+0
-3
modules/gui/macosx/VLCMainMenu.m
modules/gui/macosx/VLCMainMenu.m
+0
-11
modules/gui/macosx/VLCMainWindow.h
modules/gui/macosx/VLCMainWindow.h
+0
-29
modules/gui/macosx/VLCMainWindow.m
modules/gui/macosx/VLCMainWindow.m
+1
-348
modules/gui/macosx/VLCPlaylist.h
modules/gui/macosx/VLCPlaylist.h
+0
-1
No files found.
extras/package/macosx/VLC.xcodeproj/project.pbxproj
View file @
8fc2554e
...
...
@@ -57,8 +57,6 @@
1C3113F11E508C7600D4DD76
/* VLCRendererItem.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
6BBBB8B11D10A994001BD9BA
/* VLCRendererItem.m */
;
};
1C3113F31E508C7600D4DD76
/* VLCRendererMenuController.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
6BBBB8A81D108A17001BD9BA
/* VLCRendererMenuController.m */
;
};
1C3114031E508C8800D4DD76
/* AppleRemote.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
CC6D8D9D0A878DED006F2BBE
/* AppleRemote.m */
;
};
1C3114051E508C8800D4DD76
/* SideBarItem.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
CCCDDEF013E870BB00A35661
/* SideBarItem.m */
;
};
1C3114071E508C8800D4DD76
/* PXSourceList.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
CC0CD0E013DE0EAE00B0D90D
/* PXSourceList.m */
;
};
1C31140B1E508C8800D4DD76
/* SPInvocationGrabbing.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
CCF0777A13659A8000AF19FD
/* SPInvocationGrabbing.m */
;
};
1C31140D1E508C8800D4DD76
/* SPMediaKeyTap.m in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
CCF0777C13659A8000AF19FD
/* SPMediaKeyTap.m */
;
};
1C5716AC1F5B142200678627
/* coreaudio_common.c in Sources */
=
{
isa
=
PBXBuildFile
;
fileRef
=
1C5716AB1F5B142200678627
/* coreaudio_common.c */
;
};
...
...
@@ -464,10 +462,6 @@
8ED6C28603E2EB1C0059A3A7
/* prefs.m */
=
{
isa
=
PBXFileReference
;
fileEncoding
=
4
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
prefs.m
;
sourceTree
=
"<group>"
;
};
CC0663341566C34C003A411C
/* VLCConvertAndSaveWindowController.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
lineEnding
=
0
;
path
=
VLCConvertAndSaveWindowController.h
;
sourceTree
=
"<group>"
;
};
CC0663351566C34C003A411C
/* VLCConvertAndSaveWindowController.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
lineEnding
=
0
;
path
=
VLCConvertAndSaveWindowController.m
;
sourceTree
=
"<group>"
;
};
CC0CD0DF13DE0EAE00B0D90D
/* PXSourceList.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
PXSourceList.h
;
sourceTree
=
"<group>"
;
};
CC0CD0E013DE0EAE00B0D90D
/* PXSourceList.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
PXSourceList.m
;
sourceTree
=
"<group>"
;
};
CC0CD0E113DE0EAE00B0D90D
/* PXSourceListDataSource.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
PXSourceListDataSource.h
;
sourceTree
=
"<group>"
;
};
CC0CD0E213DE0EAE00B0D90D
/* PXSourceListDelegate.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
PXSourceListDelegate.h
;
sourceTree
=
"<group>"
;
};
CC1941240B9C1F8400635F6B
/* QTKit.framework */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
wrapper.framework
;
name
=
QTKit.framework
;
path
=
/System/Library/Frameworks/QTKit.framework
;
sourceTree
=
"<absolute>"
;
};
CC269A4615E7947F00F2FDC9
/* VLCStringUtility.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
VLCStringUtility.h
;
sourceTree
=
"<group>"
;
};
CC269A4715E7947F00F2FDC9
/* VLCStringUtility.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
VLCStringUtility.m
;
sourceTree
=
"<group>"
;
};
...
...
@@ -501,8 +495,6 @@
CCBE999E0F922C51000705F8
/* CoreServices.framework */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
wrapper.framework
;
name
=
CoreServices.framework
;
path
=
/System/Library/Frameworks/CoreServices.framework
;
sourceTree
=
"<absolute>"
;
};
CCCCDCA01413E1C000FE3DE1
/* VLCVoutView.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
VLCVoutView.h
;
sourceTree
=
"<group>"
;
};
CCCCDCA11413E1C000FE3DE1
/* VLCVoutView.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
VLCVoutView.m
;
sourceTree
=
"<group>"
;
};
CCCDDEEF13E870BB00A35661
/* SideBarItem.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
SideBarItem.h
;
sourceTree
=
"<group>"
;
};
CCCDDEF013E870BB00A35661
/* SideBarItem.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
path
=
SideBarItem.m
;
sourceTree
=
"<group>"
;
};
CCCE366D13817E4500694F2A
/* VLCVideoEffectsWindowController.h */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.h
;
path
=
VLCVideoEffectsWindowController.h
;
sourceTree
=
"<group>"
;
};
CCCE366E13817E4500694F2A
/* VLCVideoEffectsWindowController.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
lineEnding
=
0
;
path
=
VLCVideoEffectsWindowController.m
;
sourceTree
=
"<group>"
;
xcLanguageSpecificationIdentifier
=
xcode.lang.objc
;
};
CCDBA3B313D32E200006127B
/* macosx.m */
=
{
isa
=
PBXFileReference
;
lastKnownFileType
=
sourcecode.c.objc
;
name
=
macosx.m
;
path
=
../../../modules/video_output/macosx.m
;
sourceTree
=
"<group>"
;
};
...
...
@@ -1335,24 +1327,10 @@
name
=
"UI Graphics"
;
sourceTree
=
"<group>"
;
};
CC0CD0E413DE0EB500B0D90D
/* PXSourceList */
=
{
isa
=
PBXGroup
;
children
=
(
CCCDDEEF13E870BB00A35661
/* SideBarItem.h */
,
CCCDDEF013E870BB00A35661
/* SideBarItem.m */
,
CC0CD0DF13DE0EAE00B0D90D
/* PXSourceList.h */
,
CC0CD0E013DE0EAE00B0D90D
/* PXSourceList.m */
,
CC0CD0E113DE0EAE00B0D90D
/* PXSourceListDataSource.h */
,
CC0CD0E213DE0EAE00B0D90D
/* PXSourceListDelegate.h */
,
);
name
=
PXSourceList
;
sourceTree
=
"<group>"
;
};
CC0CD0E513DE0FC600B0D90D
/* Imported Code */
=
{
isa
=
PBXGroup
;
children
=
(
6B8223FD1E4D29F100833BE1
/* Apple Remote */
,
CC0CD0E413DE0EB500B0D90D
/* PXSourceList */
,
CC78DA4A13DE0E0100E9603C
/* SPMediaKeyTap */
,
);
name
=
"Imported Code"
;
...
...
@@ -1551,10 +1529,8 @@
6B4D50901E79781F004479B5
/* VLCHotkeyChangeWindow.m in Sources */
,
1C3114031E508C8800D4DD76
/* AppleRemote.m in Sources */
,
1CFE8D591EA0D42A00E94451
/* VLCErrorWindowController.m in Sources */
,
1C3114051E508C8800D4DD76
/* SideBarItem.m in Sources */
,
6B4D50961E7A7D16004479B5
/* NSSound+VLCAdditions.m in Sources */
,
6BF093F91EE0182B0049D8B0
/* VLCTimeField.m in Sources */
,
1C3114071E508C8800D4DD76
/* PXSourceList.m in Sources */
,
1C31140B1E508C8800D4DD76
/* SPInvocationGrabbing.m in Sources */
,
1C31140D1E508C8800D4DD76
/* SPMediaKeyTap.m in Sources */
,
1C3113EF1E508C7600D4DD76
/* VLCRendererDiscovery.m in Sources */
,
...
...
modules/gui/macosx/Makefile.am
View file @
8fc2554e
...
...
@@ -48,9 +48,6 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/VLCPLModel.h gui/macosx/VLCPLModel.m
\
gui/macosx/prefs.h gui/macosx/prefs.m
\
gui/macosx/prefs_widgets.h gui/macosx/prefs_widgets.m
\
gui/macosx/PXSourceList.h gui/macosx/PXSourceList.m
\
gui/macosx/PXSourceListDataSource.h gui/macosx/PXSourceListDelegate.h
\
gui/macosx/SideBarItem.h gui/macosx/SideBarItem.m
\
gui/macosx/VLCPopupPanelController.h gui/macosx/VLCPopupPanelController.m
\
gui/macosx/VLCTextfieldPanelController.h gui/macosx/VLCTextfieldPanelController.m
\
gui/macosx/VLCSimplePrefsController.h gui/macosx/VLCSimplePrefsController.m
\
...
...
modules/gui/macosx/PXSourceList.h
deleted
100644 → 0
View file @
ca234a9e
//
// PXSourceList.h
// PXSourceList
//
// Created by Alex Rozanski on 05/09/2009.
// Copyright 2009-10 Alex Rozanski http://perspx.com
//
#import <Cocoa/Cocoa.h>
#import "PXSourceListDelegate.h"
#import "PXSourceListDataSource.h"
@interface
PXSourceList
:
NSOutlineView
<
NSOutlineViewDelegate
,
NSOutlineViewDataSource
>
{
id
<
PXSourceListDelegate
>
_secondaryDelegate
;
//Used to store the publicly visible delegate
id
<
PXSourceListDataSource
>
_secondaryDataSource
;
//Used to store the publicly visible data source
}
@property
(
nonatomic
)
NSSize
iconSize
;
@property
(
assign
)
id
<
PXSourceListDataSource
,
NSOutlineViewDataSource
>
_Nullable
dataSource
;
@property
(
assign
)
id
<
PXSourceListDelegate
,
NSOutlineViewDelegate
>
_Nullable
delegate
;
-
(
NSUInteger
)
numberOfGroups
;
//Returns the number of groups in the Source List
-
(
BOOL
)
isGroupItem
:(
nonnull
id
)
item
;
//Returns whether `item` is a group
-
(
BOOL
)
isGroupAlwaysExpanded
:(
nonnull
id
)
group
;
//Returns whether `group` is displayed as always expanded
-
(
BOOL
)
itemHasBadge
:(
nonnull
id
)
item
;
//Returns whether `item` has a badge
-
(
NSInteger
)
badgeValueForItem
:(
nonnull
id
)
item
;
//Returns the badge value for `item`
@end
modules/gui/macosx/PXSourceList.m
deleted
100644 → 0
View file @
ca234a9e
//
// PXSourceList.m
// PXSourceList
//
// Created by Alex Rozanski on 05/09/2009.
// Copyright 2009-10 Alex Rozanski http://perspx.com
//
// GC-enabled code revised by Stefan Vogt http://byteproject.net
//
#import "CompatibilityFixes.h"
#import "PXSourceList.h"
#import "SideBarItem.h"
//Layout constants
#define MIN_BADGE_WIDTH 22.0 //The minimum badge width for each item (default 22.0)
#define BADGE_HEIGHT 14.0 //The badge height for each item (default 14.0)
#define BADGE_MARGIN 5.0 //The spacing between the badge and the cell for that row
#define ROW_RIGHT_MARGIN 5.0 //The spacing between the right edge of the badge and the edge of the table column
#define ICON_SPACING 2.0 //The spacing between the icon and it's adjacent cell
#define DISCLOSURE_TRIANGLE_SPACE 18.0 //The indentation reserved for disclosure triangles for non-group items
//Drawing constants
#define BADGE_BACKGROUND_COLOR [NSColor colorWithCalibratedRed:(152/255.0) green:(168/255.0) blue:(202/255.0) alpha:1]
#define BADGE_HIDDEN_BACKGROUND_COLOR [NSColor colorWithDeviceWhite:(180/255.0) alpha:1]
#define BADGE_SELECTED_TEXT_COLOR [NSColor keyboardFocusIndicatorColor]
#define BADGE_SELECTED_UNFOCUSED_TEXT_COLOR [NSColor colorWithCalibratedRed:(153/255.0) green:(169/255.0) blue:(203/255.0) alpha:1]
#define BADGE_SELECTED_HIDDEN_TEXT_COLOR [NSColor colorWithCalibratedWhite:(170/255.0) alpha:1]
#define BADGE_FONT [NSFont boldSystemFontOfSize:11]
//Delegate notification constants
NSString
*
const
PXSLSelectionIsChangingNotification
=
@"PXSourceListSelectionIsChanging"
;
NSString
*
const
PXSLSelectionDidChangeNotification
=
@"PXSourceListSelectionDidChange"
;
NSString
*
const
PXSLItemWillExpandNotification
=
@"PXSourceListItemWillExpand"
;
NSString
*
const
PXSLItemDidExpandNotification
=
@"PXSourceListItemDidExpand"
;
NSString
*
const
PXSLItemWillCollapseNotification
=
@"PXSourceListItemWillCollapse"
;
NSString
*
const
PXSLItemDidCollapseNotification
=
@"PXSourceListItemDidCollapse"
;
NSString
*
const
PXSLDeleteKeyPressedOnRowsNotification
=
@"PXSourceListDeleteKeyPressedOnRows"
;
#pragma mark -
@interface
PXSourceList
()
-
(
NSSize
)
sizeOfBadgeAtRow
:(
NSInteger
)
rowIndex
;
-
(
void
)
drawBadgeForRow
:(
NSInteger
)
rowIndex
inRect
:(
NSRect
)
badgeFrame
;
-
(
void
)
registerDelegateToReceiveNotification
:(
NSString
*
)
notification
withSelector
:(
SEL
)
selector
;
@end
#pragma mark -
@implementation
PXSourceList
@dynamic
dataSource
;
@dynamic
delegate
;
#pragma mark Init/Dealloc/Finalize
-
(
id
)
initWithCoder
:(
NSCoder
*
)
decoder
{
if
(
self
=
[
super
initWithCoder
:
decoder
])
{
[
self
setDelegate
:(
id
<
PXSourceListDelegate
,
NSOutlineViewDelegate
>
)[
super
delegate
]];
[
super
setDelegate
:
self
];
[
self
setDataSource
:(
id
<
PXSourceListDataSource
,
NSOutlineViewDataSource
>
)[
super
dataSource
]];
[
super
setDataSource
:
self
];
_iconSize
=
NSMakeSize
(
16
,
16
);
}
return
self
;
}
-
(
void
)
dealloc
{
//Unregister the delegate from receiving notifications
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
_secondaryDelegate
];
}
#pragma mark -
#pragma mark Custom Accessors
-
(
void
)
setDelegate
:(
id
<
PXSourceListDelegate
>
)
aDelegate
{
//Unregister the old delegate from receiving notifications
[[
NSNotificationCenter
defaultCenter
]
removeObserver
:
_secondaryDelegate
name
:
nil
object
:
self
];
_secondaryDelegate
=
aDelegate
;
//Register the new delegate to receive notifications
[
self
registerDelegateToReceiveNotification
:
PXSLSelectionIsChangingNotification
withSelector
:
@selector
(
sourceListSelectionIsChanging
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLSelectionDidChangeNotification
withSelector
:
@selector
(
sourceListSelectionDidChange
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLItemWillExpandNotification
withSelector
:
@selector
(
sourceListItemWillExpand
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLItemDidExpandNotification
withSelector
:
@selector
(
sourceListItemDidExpand
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLItemWillCollapseNotification
withSelector
:
@selector
(
sourceListItemWillCollapse
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLItemDidCollapseNotification
withSelector
:
@selector
(
sourceListItemDidCollapse
:
)];
[
self
registerDelegateToReceiveNotification
:
PXSLDeleteKeyPressedOnRowsNotification
withSelector
:
@selector
(
sourceListDeleteKeyPressedOnRows
:
)];
}
-
(
void
)
setDataSource
:(
id
<
PXSourceListDataSource
>
)
aDataSource
{
_secondaryDataSource
=
aDataSource
;
if
([
self
respondsToSelector
:
@selector
(
reloadData
)])
[
self
reloadData
];
}
-
(
void
)
setIconSize
:(
NSSize
)
newIconSize
{
_iconSize
=
newIconSize
;
CGFloat
rowHeight
=
[
self
rowHeight
];
//Make sure icon height does not exceed row height; if so constrain, keeping width and height in proportion
if
(
_iconSize
.
height
>
rowHeight
)
{
_iconSize
.
width
=
_iconSize
.
width
*
(
rowHeight
/
_iconSize
.
height
);
_iconSize
.
height
=
rowHeight
;
}
}
#pragma mark -
#pragma mark Data Management
-
(
void
)
reloadData
{
if
([
super
respondsToSelector
:
@selector
(
reloadData
)])
[
super
reloadData
];
//Expand items that are displayed as always expanded
if
([
_secondaryDataSource
conformsToProtocol
:
@protocol
(
PXSourceListDataSource
)]
&&
[
_secondaryDelegate
respondsToSelector
:
@selector
(
sourceList
:
isGroupAlwaysExpanded
:
)])
{
for
(
NSUInteger
i
=
0
;
i
<
[
self
numberOfGroups
];
i
++
)
{
id
item
=
[
_secondaryDataSource
sourceList
:
self
child
:
i
ofItem
:
nil
];
if
([
self
isGroupAlwaysExpanded
:
item
])
{
[
self
expandItem
:
item
expandChildren
:
NO
];
}
}
}
//If there are selected rows and the item hierarchy has changed, make sure a Group row isn't
//selected
if
([
self
numberOfSelectedRows
]
>
0
)
{
NSIndexSet
*
selectedIndexes
=
[
self
selectedRowIndexes
];
NSUInteger
firstSelectedRow
=
[
selectedIndexes
firstIndex
];
//Is a group item selected?
if
([
self
isGroupItem
:[
self
itemAtRow
:
firstSelectedRow
]])
{
//Work backwards to find the first non-group row
BOOL
foundRow
=
NO
;
for
(
NSUInteger
i
=
firstSelectedRow
;
i
>
0
;
i
--
)
{
if
(
!
[
self
isGroupItem
:[
self
itemAtRow
:
i
]])
{
[
self
selectRowIndexes
:[
NSIndexSet
indexSetWithIndex
:
i
]
byExtendingSelection
:
NO
];
foundRow
=
YES
;
break
;
}
}
//If there is no non-group row preceding the currently selected group item, remove the selection
//from the Source List
if
(
!
foundRow
)
{
[
self
deselectAll
:
self
];
}
}
}
else
if
(
!
[
self
allowsEmptySelection
]
&&
[
self
numberOfSelectedRows
]
==
0
)
{
//Select the first non-group row if no rows are selected, and empty selection is disallowed
for
(
NSUInteger
i
=
0
;
i
<
[
self
numberOfRows
];
i
++
)
{
if
(
!
[
self
isGroupItem
:[
self
itemAtRow
:
i
]])
{
[
self
selectRowIndexes
:[
NSIndexSet
indexSetWithIndex
:
i
]
byExtendingSelection
:
NO
];
break
;
}
}
}
}
-
(
NSUInteger
)
numberOfGroups
{
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
numberOfChildrenOfItem
:
)])
{
return
[
_secondaryDataSource
sourceList
:
self
numberOfChildrenOfItem
:
nil
];
}
return
0
;
}
-
(
BOOL
)
isGroupItem
:(
id
)
item
{
//Groups are defined as root items (at level 0)
return
0
==
[
self
levelForItem
:
item
];
}
-
(
BOOL
)
isGroupAlwaysExpanded
:(
id
)
group
{
//Make sure that the item IS a group to prevent unwanted queries sent to the data source
if
([
self
isGroupItem
:
group
])
{
//Query the data source
if
([
_secondaryDelegate
respondsToSelector
:
@selector
(
sourceList
:
isGroupAlwaysExpanded
:
)])
{
return
[
_secondaryDelegate
sourceList
:
self
isGroupAlwaysExpanded
:
group
];
}
}
return
NO
;
}
-
(
BOOL
)
itemHasBadge
:(
id
)
item
{
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
itemHasBadge
:
)])
{
return
[
_secondaryDataSource
sourceList
:
self
itemHasBadge
:
item
];
}
return
NO
;
}
-
(
NSInteger
)
badgeValueForItem
:(
id
)
item
{
//Make sure that the item has a badge
if
(
!
[
self
itemHasBadge
:
item
])
{
return
NSNotFound
;
}
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
badgeValueForItem
:
)])
{
return
[
_secondaryDataSource
sourceList
:
self
badgeValueForItem
:
item
];
}
return
NSNotFound
;
}
#pragma mark -
#pragma mark Selection Handling
-
(
void
)
selectRowIndexes
:(
NSIndexSet
*
)
indexes
byExtendingSelection
:(
BOOL
)
extend
{
NSUInteger
numberOfIndexes
=
[
indexes
count
];
//Prevent empty selection if we don't want it
if
(
!
[
self
allowsEmptySelection
]
&&
0
==
numberOfIndexes
)
{
return
;
}
//Would use blocks but we're also targeting 10.5...
//Get the selected indexes
NSUInteger
*
selectedIndexes
=
malloc
(
sizeof
(
NSUInteger
)
*
numberOfIndexes
);
[
indexes
getIndexes
:
selectedIndexes
maxCount
:
numberOfIndexes
inIndexRange
:
nil
];
//Loop through the indexes and only add non-group row indexes
//Allows selection across groups without selecting the group rows
NSMutableIndexSet
*
newSelectionIndexes
=
[
NSMutableIndexSet
indexSet
];
for
(
NSInteger
i
=
0
;
i
<
numberOfIndexes
;
i
++
)
{
if
(
!
[
self
isGroupItem
:[
self
itemAtRow
:
selectedIndexes
[
i
]]])
{
[
newSelectionIndexes
addIndex
:
selectedIndexes
[
i
]];
}
}
//If there are any non-group rows selected
if
([
newSelectionIndexes
count
]
>
0
)
{
[
super
selectRowIndexes
:
newSelectionIndexes
byExtendingSelection
:
extend
];
}
//C memory management... *sigh*
free
(
selectedIndexes
);
}
#pragma mark -
#pragma mark Layout
-
(
NSRect
)
frameOfOutlineCellAtRow
:(
NSInteger
)
row
{
//Return a zero-rect if the item is always expanded (a disclosure triangle will not be drawn)
if
([
self
isGroupAlwaysExpanded
:[
self
itemAtRow
:
row
]])
{
return
NSZeroRect
;
}
return
[
super
frameOfOutlineCellAtRow
:
row
];
}
-
(
NSRect
)
frameOfCellAtColumn
:(
NSInteger
)
column
row
:(
NSInteger
)
row
{
id
item
=
[
self
itemAtRow
:
row
];
NSCell
*
cell
=
[
self
preparedCellAtColumn
:
column
row
:
row
];
NSSize
cellSize
=
[
cell
cellSize
];
if
(
!
([
cell
type
]
==
NSImageCellType
)
&&
!
([
cell
type
]
==
NSTextCellType
))
cellSize
=
[
cell
cellSizeForBounds
:[
super
frameOfCellAtColumn
:
column
row
:
row
]];
NSRect
cellFrame
=
[
super
frameOfCellAtColumn
:
column
row
:
row
];
NSRect
rowRect
=
[
self
rectOfRow
:
row
];
if
([
self
isGroupItem
:
item
])
{
CGFloat
minX
=
NSMinX
(
cellFrame
);
//Set the origin x-coord; if there are no children of the group at current, there will still be a
//margin to the left of the cell (in cellFrame), which we don't want
if
([
self
isGroupAlwaysExpanded
:[
self
itemAtRow
:
row
]])
{
minX
=
7
;
}
return
NSMakeRect
(
minX
,
NSMidY
(
cellFrame
)
-
(
cellSize
.
height
/
2
.
0
),
NSWidth
(
rowRect
)
-
minX
,
cellSize
.
height
);
}
else
{
CGFloat
leftIndent
=
([
self
levelForRow
:
row
]
-
1
)
*
[
self
indentationPerLevel
]
+
DISCLOSURE_TRIANGLE_SPACE
;
//Calculate space left for a badge if need be
CGFloat
rightIndent
=
[
self
sizeOfBadgeAtRow
:
row
].
width
+
ROW_RIGHT_MARGIN
;
//Allow space for an icon if need be
if
(
!
[
self
isGroupItem
:
item
]
&&
[
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
itemHasIcon
:
)])
{
if
([
_secondaryDataSource
sourceList
:
self
itemHasIcon
:
item
])
{
leftIndent
+=
[
self
iconSize
].
width
+
(
ICON_SPACING
*
2
);
}
}
return
NSMakeRect
(
leftIndent
,
NSMidY
(
rowRect
)
-
(
cellSize
.
height
/
2
.
0
),
NSWidth
(
rowRect
)
-
rightIndent
-
leftIndent
,
cellSize
.
height
);
}
}
//This method calculates and returns the size of the badge for the row index passed to the method. If the
//row for the row index passed to the method does not have a badge, then NSZeroSize is returned.
-
(
NSSize
)
sizeOfBadgeAtRow
:(
NSInteger
)
rowIndex
{
id
rowItem
=
[
self
itemAtRow
:
rowIndex
];
//Make sure that the item has a badge
if
(
!
[
self
itemHasBadge
:
rowItem
])
{
return
NSZeroSize
;
}
NSAttributedString
*
badgeAttrString
=
[[
NSAttributedString
alloc
]
initWithString
:[
NSString
stringWithFormat
:
@"%ld"
,
[
self
badgeValueForItem
:
rowItem
]]
attributes
:[
NSDictionary
dictionaryWithObjectsAndKeys
:
BADGE_FONT
,
NSFontAttributeName
,
nil
]];
NSSize
stringSize
=
[
badgeAttrString
size
];
//Calculate the width needed to display the text or the minimum width if it's smaller
CGFloat
width
=
stringSize
.
width
+
(
2
*
BADGE_MARGIN
);
if
(
width
<
MIN_BADGE_WIDTH
)
{
width
=
MIN_BADGE_WIDTH
;
}
return
NSMakeSize
(
width
,
BADGE_HEIGHT
);
}
#pragma mark -
#pragma mark Drawing
-
(
void
)
drawRow
:(
NSInteger
)
rowIndex
clipRect
:(
NSRect
)
clipRect
{
[
super
drawRow
:
rowIndex
clipRect
:
clipRect
];
id
item
=
[
self
itemAtRow
:
rowIndex
];
//Draw an icon if the item has one
if
(
!
[
self
isGroupItem
:
item
]
&&
[
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
itemHasIcon
:
)])
{
if
([
_secondaryDataSource
sourceList
:
self
itemHasIcon
:
item
])
{
NSRect
cellFrame
=
[
self
frameOfCellAtColumn
:
0
row
:
rowIndex
];
NSSize
iconSize
=
[
self
iconSize
];
NSRect
iconRect
=
NSMakeRect
(
NSMinX
(
cellFrame
)
-
iconSize
.
width
-
ICON_SPACING
,
NSMidY
(
cellFrame
)
-
(
iconSize
.
width
/
2
.
0
f
),
iconSize
.
width
,
iconSize
.
height
);
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
iconForItem
:
)])
{
NSImage
*
icon
=
[
_secondaryDataSource
sourceList
:
self
iconForItem
:
item
];
if
(
icon
!=
nil
)
{
NSSize
actualIconSize
=
[
icon
size
];
//If the icon is *smaller* than the size retrieved from the -iconSize property, make sure we
//reduce the size of the rectangle to draw the icon in, so that it is not stretched.
if
((
actualIconSize
.
width
<
iconSize
.
width
)
||
(
actualIconSize
.
height
<
iconSize
.
height
))
{
iconRect
=
NSMakeRect
(
NSMidX
(
iconRect
)
-
(
actualIconSize
.
width
/
2
.
0
f
),
NSMidY
(
iconRect
)
-
(
actualIconSize
.
height
/
2
.
0
f
),
actualIconSize
.
width
,
actualIconSize
.
height
);
}
[
icon
drawInRect
:
iconRect
fromRect:
NSZeroRect
operation:
NSCompositeSourceOver
fraction:
1
respectFlipped:
YES
hints
:
nil
];
}
}
}
}
//Draw the badge if the item has one
if
([
self
itemHasBadge
:
item
])
{
NSRect
rowRect
=
[
self
rectOfRow
:
rowIndex
];
NSSize
badgeSize
=
[
self
sizeOfBadgeAtRow
:
rowIndex
];
NSRect
badgeFrame
=
NSMakeRect
(
NSMaxX
(
rowRect
)
-
badgeSize
.
width
-
ROW_RIGHT_MARGIN
,
NSMidY
(
rowRect
)
-
(
badgeSize
.
height
/
2
.
0
),
badgeSize
.
width
,
badgeSize
.
height
);
[
self
drawBadgeForRow
:
rowIndex
inRect
:
badgeFrame
];
}
}
-
(
void
)
drawBadgeForRow
:(
NSInteger
)
rowIndex
inRect
:(
NSRect
)
badgeFrame
{
id
rowItem
=
[
self
itemAtRow
:
rowIndex
];
NSBezierPath
*
badgePath
=
[
NSBezierPath
bezierPathWithRoundedRect
:
badgeFrame
xRadius:
(
BADGE_HEIGHT
/
2
.
0
)
yRadius:
(
BADGE_HEIGHT
/
2
.
0
)];
//Get window and control state to determine colours used
BOOL
isVisible
=
[[
NSApp
mainWindow
]
isVisible
];
BOOL
isFocused
=
[[[
self
window
]
firstResponder
]
isEqual
:
self
];
NSInteger
rowBeingEdited
=
[
self
editedRow
];
//Set the attributes based on the row state
NSDictionary
*
attributes
;
NSColor
*
backgroundColor
;
if
([[
self
selectedRowIndexes
]
containsIndex
:
rowIndex
])
{
backgroundColor
=
[
NSColor
whiteColor
];
//Set the text color based on window and control state
NSColor
*
textColor
;
if
(
isVisible
&&
(
isFocused
||
rowBeingEdited
==
rowIndex
))
{
textColor
=
BADGE_SELECTED_TEXT_COLOR
;
}
else
if
(
isVisible
&&
!
isFocused
)
{
textColor
=
BADGE_SELECTED_UNFOCUSED_TEXT_COLOR
;
}
else
{
textColor
=
BADGE_SELECTED_HIDDEN_TEXT_COLOR
;
}
attributes
=
[[
NSDictionary
alloc
]
initWithObjectsAndKeys
:
BADGE_FONT
,
NSFontAttributeName
,
textColor
,
NSForegroundColorAttributeName
,
nil
];
}
else
{
//Set the text colour based on window and control state
NSColor
*
badgeColor
=
[
NSColor
whiteColor
];
if
(
isVisible
)
{
//If the data source returns a custom colour..
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
badgeBackgroundColorForItem
:
)])
{
backgroundColor
=
[
_secondaryDataSource
sourceList
:
self
badgeBackgroundColorForItem
:
rowItem
];
if
(
backgroundColor
==
nil
)
backgroundColor
=
BADGE_BACKGROUND_COLOR
;
}
else
{
//Otherwise use the default (purple-blue colour)
backgroundColor
=
BADGE_BACKGROUND_COLOR
;
}
//If the delegate wants a custom badge text colour..
if
([
_secondaryDataSource
respondsToSelector
:
@selector
(
sourceList
:
badgeTextColorForItem
:
)])
{
badgeColor
=
[
_secondaryDataSource
sourceList
:
self
badgeTextColorForItem
:
rowItem
];
if
(
badgeColor
==
nil
)
badgeColor
=
[
NSColor
whiteColor
];
}
}
else
{
//Gray colour
backgroundColor
=
BADGE_HIDDEN_BACKGROUND_COLOR
;
}
attributes
=
[[
NSDictionary
alloc
]
initWithObjectsAndKeys
:
BADGE_FONT
,
NSFontAttributeName
,
badgeColor
,
NSForegroundColorAttributeName
,
nil
];
}
[
backgroundColor
set
];
[
badgePath
fill
];
//Draw the badge text
NSAttributedString
*
badgeAttrString
=
[[
NSAttributedString
alloc
]
initWithString
:[
NSString
stringWithFormat
:
@"%ld"
,
[
self
badgeValueForItem
:
rowItem
]]
attributes
:
attributes
];
NSSize
stringSize
=
[
badgeAttrString
size
];
NSPoint
badgeTextPoint
=
NSMakePoint
(
NSMidX
(
badgeFrame
)
-
(
stringSize
.
width
/
2
.
0
),
//Center in the badge frame
NSMidY
(
badgeFrame
)
-
(
stringSize
.
height
/
2
.
0
));
//Center in the badge frame
[
badgeAttrString
drawAtPoint
:
badgeTextPoint
];