Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed: selected rows in CPTableViews are barely readable in unfocussed state #2009

116 changes: 61 additions & 55 deletions AppKit/CPTableView.j
Original file line number Diff line number Diff line change
Expand Up @@ -1302,26 +1302,23 @@ NOT YET IMPLEMENTED
[selectRowIndexes getIndexes:selectRows maxCount:-1 inIndexRange:CPMakeRange(firstExposedRow, exposedLength)];

var showsSelection = _selectionHighlightStyle !== CPTableViewSelectionHighlightStyleNone,
selectors = [@selector(unsetThemeState:), @selector(setThemeState:)],
selectInfo = [
{ rows:deselectRows, selectorIndex:0 },
{ rows:selectRows, selectorIndex:showsSelection ? 1 : 0 }
];
selectionState = [self _isFocused]? CPThemeStateFirstResponder:CPThemeStateSelectedDataView;

for (var identifier in _dataViewsForTableColumns)
{
var dataViewsInTableColumn = _dataViewsForTableColumns[identifier];

for (var i = 0; i < selectInfo.length; ++i)
var count = deselectRows.length;
while (count--)
{
var info = selectInfo[i],
count = info.rows.length;

while (count--)
{
var view = dataViewsInTableColumn[info.rows[count]];
[view performSelector:selectors[info.selectorIndex] withObject:CPThemeStateSelectedDataView];
}
var view = dataViewsInTableColumn[deselectRows[count]];
[view unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
}
var count = selectRows.length;
while (count--)
{
var view = dataViewsInTableColumn[selectRows[count]];
[view unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
if(showsSelection) [view setThemeState: selectionState];
}
}
}
Expand All @@ -1345,49 +1342,50 @@ NOT YET IMPLEMENTED
[_exposedRows getIndexes:selectRows maxCount:-1 inIndexRange:nil];

var showsSelection = _selectionHighlightStyle !== CPTableViewSelectionHighlightStyleNone,
selectors = [@selector(unsetThemeState:), @selector(setThemeState:)],
selectionState = [self _isFocused]? CPThemeStateFirstResponder:CPThemeStateSelectedDataView;

// Rows do not show selection with CPTableViewSelectionHighlightStyleNone, but headers do
selectInfo = [
{
columns:deselectColumns,
rowSelectorIndex:0,
headerSelectorIndex:0
},
{
columns:selectColumns,
rowSelectorIndex:showsSelection ? 1 : 0,
headerSelectorIndex:1
}
],
rowsCount = selectRows.length;

for (var selectIndex = 0; selectIndex < selectInfo.length; ++selectIndex)
var count = deselectColumns.length;
while (count--)
{
var info = selectInfo[selectIndex],
count = info.columns.length,
rowSelector = selectors[info.rowSelectorIndex],
headerSelector = selectors[info.headerSelectorIndex];
var columnIndex = deselectColumns[count],
identifier = [_tableColumns[columnIndex] UID],
dataViewsInTableColumn = _dataViewsForTableColumns[identifier];

while (count--)
for (var i = 0; i < rowsCount; i++)
{
var columnIndex = info.columns[count],
identifier = [_tableColumns[columnIndex] UID],
dataViewsInTableColumn = _dataViewsForTableColumns[identifier];
var rowIndex = selectRows[i],
dataView = dataViewsInTableColumn[rowIndex];

for (var i = 0; i < rowsCount; i++)
{
var rowIndex = selectRows[i],
dataView = dataViewsInTableColumn[rowIndex];
[dataView unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
}

[dataView performSelector:rowSelector withObject:CPThemeStateSelectedDataView];
}
if (_headerView)
{
var headerView = [_tableColumns[columnIndex] headerView];
[headerView unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
}
}
var count = selectColumns.length;
while (count--)
{
var columnIndex = selectColumns[count],
identifier = [_tableColumns[columnIndex] UID],
dataViewsInTableColumn = _dataViewsForTableColumns[identifier];

if (_headerView)
{
var headerView = [_tableColumns[columnIndex] headerView];
[headerView performSelector:headerSelector withObject:CPThemeStateSelected];
}
for (var i = 0; i < rowsCount; i++)
{
var rowIndex = selectRows[i],
dataView = dataViewsInTableColumn[rowIndex];

[dataView unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
if(showsSelection) [dataView setThemeState: selectionState];
}

if (_headerView)
{
var headerView = [_tableColumns[columnIndex] headerView];
[headerView unsetThemeState: CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
[headerView setThemeState: selectionState]; // Rows do not show selection with CPTableViewSelectionHighlightStyleNone, but headers do
}
}
}
Expand Down Expand Up @@ -3519,7 +3517,8 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
UPDATE_COLUMN_RANGES_IF_NECESSARY();

var columnIndex = 0,
columnsCount = columnArray.length;
columnsCount = columnArray.length,
focusedState = [self _isFocused]? CPThemeStateFirstResponder:CPThemeStateSelectedDataView;

for (; columnIndex < columnsCount; ++columnIndex)
{
Expand Down Expand Up @@ -3549,13 +3548,12 @@ Your delegate can implement this method to avoid subclassing the tableview to ad

[self _setObjectValueForTableColumn:tableColumn row:row forView:dataView];

[dataView unsetThemeState:CPThemeStateFirstResponder|CPThemeStateSelectedDataView];
if ((_selectionHighlightStyle !== CPTableViewSelectionHighlightStyleNone) &&
(isColumnSelected || [self isRowSelected:row]))
{
[dataView setThemeState:CPThemeStateSelectedDataView];
[dataView setThemeState: focusedState];
}
else
[dataView unsetThemeState:CPThemeStateSelectedDataView];

// FIX ME: for performance reasons we might consider diverging from cocoa and moving this to the reloadData method
if ([self _sendDelegateIsGroupRow:row])
Expand Down Expand Up @@ -4420,8 +4418,11 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
*/
- (BOOL)startTrackingAt:(CGPoint)aPoint
{
var oldResponder= [[self window] firstResponder];
// Try to become the first responder, but if we can't, that's okay.
[[self window] makeFirstResponder:self];
if(oldResponder && [oldResponder isKindOfClass:[CPTableView class]] && oldResponder !== self)
[oldResponder setSelectionHighlightStyle:[oldResponder selectionHighlightStyle]]; // we have to reset the themestates of the "cells"

var row = [self rowAtPoint:aPoint];

Expand Down Expand Up @@ -4984,6 +4985,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (void)becomeKeyWindow
{
[self setNeedsDisplay:YES];
[self setSelectionHighlightStyle:[self selectionHighlightStyle]]; // we have redraw the selection
}

/*!
Expand All @@ -4992,6 +4994,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (void)resignKeyWindow
{
[self setNeedsDisplay:YES];
[self setSelectionHighlightStyle:[self selectionHighlightStyle]]; // we have redraw the selection
}

/*!
Expand All @@ -5000,6 +5003,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (BOOL)becomeFirstResponder
{
[self setNeedsDisplay:YES];
[self setSelectionHighlightStyle:[self selectionHighlightStyle]]; // we have redraw the selection
return YES;
}

Expand All @@ -5009,6 +5013,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad
- (BOOL)resignFirstResponder
{
[self setNeedsDisplay:YES];
[self setSelectionHighlightStyle:[self selectionHighlightStyle]]; // we have redraw the selection
return YES;
}

Expand Down Expand Up @@ -5053,6 +5058,7 @@ Your delegate can implement this method to avoid subclassing the tableview to ad

- (void)_firstResponderDidChange:(CPNotification)aNotification
{
[self setSelectionHighlightStyle:[self selectionHighlightStyle]];
var responder = [[self window] firstResponder];

if (![responder isKindOfClass:[CPView class]] || ![responder isDescendantOf:self])
Expand Down
39 changes: 20 additions & 19 deletions AppKit/CPTheme.j
Original file line number Diff line number Diff line change
Expand Up @@ -404,25 +404,26 @@ function CPThemeStateName(aState)
return name;
}

CPThemeStateNames[0] = "normal";
CPThemeStateNormal = CPThemeStates["normal"] = 0;
CPThemeStateDisabled = CPThemeState("disabled");
CPThemeStateHovered = CPThemeState("hovered");
CPThemeStateHighlighted = CPThemeState("highlighted");
CPThemeStateSelected = CPThemeState("selected");
CPThemeStateTableDataView = CPThemeState("tableDataView");
CPThemeStateSelectedDataView = CPThemeState("selectedTableDataView");
CPThemeStateGroupRow = CPThemeState("CPThemeStateGroupRow");
CPThemeStateBezeled = CPThemeState("bezeled");
CPThemeStateBordered = CPThemeState("bordered");
CPThemeStateEditable = CPThemeState("editable");
CPThemeStateEditing = CPThemeState("editing");
CPThemeStateVertical = CPThemeState("vertical");
CPThemeStateDefault = CPThemeState("default");
CPThemeStateCircular = CPThemeState("circular");
CPThemeStateAutocompleting = CPThemeState("autocompleting");
CPThemeStateMainWindow = CPThemeState("mainWindow");
CPThemeStateKeyWindow = CPThemeState("keyWindow");
CPThemeStateNames[0] = "normal";
CPThemeStateNormal = CPThemeStates["normal"] = 0;
CPThemeStateDisabled = CPThemeState("disabled");
CPThemeStateHovered = CPThemeState("hovered");
CPThemeStateHighlighted = CPThemeState("highlighted");
CPThemeStateSelected = CPThemeState("selected");
CPThemeStateTableDataView = CPThemeState("tableDataView");
CPThemeStateFirstResponder = CPThemeState("firstResponder");
CPThemeStateSelectedDataView = CPThemeState("selectedTableDataView");
CPThemeStateGroupRow = CPThemeState("CPThemeStateGroupRow");
CPThemeStateBezeled = CPThemeState("bezeled");
CPThemeStateBordered = CPThemeState("bordered");
CPThemeStateEditable = CPThemeState("editable");
CPThemeStateEditing = CPThemeState("editing");
CPThemeStateVertical = CPThemeState("vertical");
CPThemeStateDefault = CPThemeState("default");
CPThemeStateCircular = CPThemeState("circular");
CPThemeStateAutocompleting = CPThemeState("autocompleting");
CPThemeStateMainWindow = CPThemeState("mainWindow");
CPThemeStateKeyWindow = CPThemeState("keyWindow");

@implementation _CPThemeAttribute : CPObject
{
Expand Down
3 changes: 2 additions & 1 deletion AppKit/Themes/Aristo2/ThemeDescriptors.j
Original file line number Diff line number Diff line change
Expand Up @@ -559,7 +559,8 @@ var themedButtonValues = nil,
[@"content-inset", CGInsetMake(0.0, 0.0, 0.0, 5.0), CPThemeStateTableDataView],

[@"text-color", [CPColor colorWithCalibratedWhite:51.0 / 255.0 alpha:1.0], CPThemeStateTableDataView],
[@"text-color", [CPColor whiteColor], CPThemeStateTableDataView | CPThemeStateSelectedDataView],
[@"text-color", [CPColor blackColor], CPThemeStateTableDataView | CPThemeStateSelectedDataView],
[@"text-color", [CPColor whiteColor], CPThemeStateTableDataView | CPThemeStateFirstResponder],
[@"font", [CPFont systemFontOfSize:CPFontCurrentSystemSize], CPThemeStateTableDataView | CPThemeStateSelectedDataView],
[@"text-color", [CPColor blackColor], CPThemeStateTableDataView | CPThemeStateEditing],
[@"text-color", [CPColor blackColor], CPThemeStateTableDataView | CPThemeStateSelectedDataView | CPThemeStateEditable],
Expand Down