Implement popOver item type (woo hoo it worked)
This commit is contained in:
parent
2bc45c8665
commit
269d899a99
3 changed files with 115 additions and 44 deletions
|
@ -375,39 +375,42 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
- (void)resetTouchBar {
|
- (void)resetTouchBar {
|
||||||
bar_items_ = [[NSMutableArray alloc] init];
|
bar_items_ = [[NSMutableArray alloc] init];
|
||||||
self.touchBar = nil;
|
self.touchBar = nil;
|
||||||
NSLog(@"Destroying TouchBar");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)reloadTouchBar {
|
- (NSMutableArray<NSTouchBarItemIdentifier>*)identifierArrayFromDicts:(std::vector<mate::PersistentDictionary>)dicts {
|
||||||
bar_items_ = [[NSMutableArray alloc] init];
|
NSMutableArray<NSTouchBarItemIdentifier>* idents = [[NSMutableArray alloc] init];
|
||||||
std::vector<mate::PersistentDictionary> items = shell_->GetTouchBarItems();
|
|
||||||
std::map<std::string, mate::PersistentDictionary> new_map;
|
|
||||||
item_id_map = new_map;
|
|
||||||
|
|
||||||
for (mate::PersistentDictionary &item : items ) {
|
for (mate::PersistentDictionary &item : dicts) {
|
||||||
std::string type;
|
std::string type;
|
||||||
std::string item_id;
|
std::string item_id;
|
||||||
if (item.Get("type", &type) && item.Get("id", &item_id)) {
|
if (item.Get("type", &type) && item.Get("id", &item_id)) {
|
||||||
NSLog(@"type: %@", [NSString stringWithUTF8String:type.c_str()]);
|
|
||||||
NSLog(@"id: %@", [NSString stringWithUTF8String:item_id.c_str()]);
|
|
||||||
item_id_map.insert(make_pair(item_id, item));
|
item_id_map.insert(make_pair(item_id, item));
|
||||||
if (type == "button") {
|
if (type == "button") {
|
||||||
[bar_items_ addObject:[NSString stringWithFormat:@"%@%@", ButtonIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
[idents addObject:[NSString stringWithFormat:@"%@%@", ButtonIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
||||||
} else if (type == "label") {
|
} else if (type == "label") {
|
||||||
[bar_items_ addObject:[NSString stringWithFormat:@"%@%@", LabelIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
[idents addObject:[NSString stringWithFormat:@"%@%@", LabelIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
||||||
} else if (type == "colorpicker") {
|
} else if (type == "colorpicker") {
|
||||||
[bar_items_ addObject:[NSString stringWithFormat:@"%@%@", ColorPickerIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
[idents addObject:[NSString stringWithFormat:@"%@%@", ColorPickerIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
||||||
} else if (type == "slider") {
|
} else if (type == "slider") {
|
||||||
[bar_items_ addObject:[NSString stringWithFormat:@"%@%@", SliderIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
[idents addObject:[NSString stringWithFormat:@"%@%@", SliderIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
||||||
|
} else if (type == "popover") {
|
||||||
|
[idents addObject:[NSString stringWithFormat:@"%@%@", PopOverIdentifier, [NSString stringWithUTF8String:item_id.c_str()]]];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
[bar_items_ addObject:NSTouchBarItemIdentifierOtherItemsProxy];
|
[idents addObject:NSTouchBarItemIdentifierOtherItemsProxy];
|
||||||
|
|
||||||
|
return idents;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)reloadTouchBar {
|
||||||
|
std::map<std::string, mate::PersistentDictionary> new_map;
|
||||||
|
item_id_map = new_map;
|
||||||
|
bar_items_ = [self identifierArrayFromDicts:shell_->GetTouchBarItems()];
|
||||||
self.touchBar = nil;
|
self.touchBar = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSTouchBar *)makeTouchBar {
|
- (NSTouchBar *)makeTouchBar {
|
||||||
NSLog(@"Making Touch Bar");
|
|
||||||
return [self touchBarFromMutatableArray:bar_items_];
|
return [self touchBarFromMutatableArray:bar_items_];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -422,7 +425,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
|
|
||||||
- (void)buttonAction:(id)sender {
|
- (void)buttonAction:(id)sender {
|
||||||
NSString* item_id = [NSString stringWithFormat:@"com.electron.tb.button.%d", (int)((NSButton *)sender).tag];
|
NSString* item_id = [NSString stringWithFormat:@"com.electron.tb.button.%d", (int)((NSButton *)sender).tag];
|
||||||
NSLog(@"Button with ID: '%@' was pressed", item_id);
|
|
||||||
shell_->NotifyTouchBarItemInteraction("button", { std::string([item_id UTF8String]) });
|
shell_->NotifyTouchBarItemInteraction("button", { std::string([item_id UTF8String]) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -432,13 +434,11 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
NSString* colorHexString = [NSString stringWithFormat:@"#%02X%02X%02X",
|
NSString* colorHexString = [NSString stringWithFormat:@"#%02X%02X%02X",
|
||||||
(int) (color.redComponent * 0xFF), (int) (color.greenComponent * 0xFF),
|
(int) (color.redComponent * 0xFF), (int) (color.greenComponent * 0xFF),
|
||||||
(int) (color.blueComponent * 0xFF)];
|
(int) (color.blueComponent * 0xFF)];
|
||||||
NSLog(@"ColorPicker with ID: '%@' was updated with color '%@'", item_id, colorHexString);
|
|
||||||
shell_->NotifyTouchBarItemInteraction("color_picker", { std::string([item_id UTF8String]), std::string([colorHexString UTF8String]) });
|
shell_->NotifyTouchBarItemInteraction("color_picker", { std::string([item_id UTF8String]), std::string([colorHexString UTF8String]) });
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)sliderAction:(id)sender {
|
- (void)sliderAction:(id)sender {
|
||||||
NSString* item_id = ((NSSliderTouchBarItem *)sender).identifier;
|
NSString* item_id = ((NSSliderTouchBarItem *)sender).identifier;
|
||||||
NSLog(@"Slider with ID: '%@' was changed", item_id);
|
|
||||||
shell_->NotifyTouchBarItemInteraction("slider", { std::string([item_id UTF8String]), std::to_string([((NSSliderTouchBarItem *)sender).slider intValue]) });
|
shell_->NotifyTouchBarItemInteraction("slider", { std::string([item_id UTF8String]), std::to_string([((NSSliderTouchBarItem *)sender).slider intValue]) });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -474,13 +474,38 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (NSButton*)makeButtonForDict:(mate::PersistentDictionary)dict withLabel:(std::string)label {
|
||||||
|
NSButton *theButton = [NSButton buttonWithTitle:[NSString stringWithUTF8String:label.c_str()] target:self action:@selector(buttonAction:)];
|
||||||
|
|
||||||
|
std::string backgroundColor;
|
||||||
|
if (dict.Get("backgroundColor", &backgroundColor)) {
|
||||||
|
theButton.bezelColor = [self colorFromHexColorString:[NSString stringWithUTF8String:backgroundColor.c_str()]];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string labelColor;
|
||||||
|
if (dict.Get("labelColor", &labelColor)) {
|
||||||
|
NSMutableAttributedString *attrTitle = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithUTF8String:label.c_str()]];
|
||||||
|
NSUInteger len = [attrTitle length];
|
||||||
|
NSRange range = NSMakeRange(0, len);
|
||||||
|
[attrTitle addAttribute:NSForegroundColorAttributeName value:[self colorFromHexColorString:[NSString stringWithUTF8String:labelColor.c_str()]] range:range];
|
||||||
|
[attrTitle fixAttributesInRange:range];
|
||||||
|
[theButton setAttributedTitle:attrTitle];
|
||||||
|
}
|
||||||
|
|
||||||
|
gfx::Image image;
|
||||||
|
if (dict.Get("image", &image)) {
|
||||||
|
theButton.image = image.AsNSImage();
|
||||||
|
}
|
||||||
|
return theButton;
|
||||||
|
}
|
||||||
|
|
||||||
- (nullable NSTouchBarItem *)makeButtonForID:(NSString*)id withIdentifier:(NSString*)identifier {
|
- (nullable NSTouchBarItem *)makeButtonForID:(NSString*)id withIdentifier:(NSString*)identifier {
|
||||||
std::string s_id = std::string([id UTF8String]);
|
std::string s_id = std::string([id UTF8String]);
|
||||||
if (![self hasTBDict:s_id]) return nil;
|
if (![self hasTBDict:s_id]) return nil;
|
||||||
mate::PersistentDictionary item = item_id_map[s_id];
|
mate::PersistentDictionary item = item_id_map[s_id];
|
||||||
std::string label;
|
std::string label;
|
||||||
if (item.Get("label", &label)) {
|
if (item.Get("label", &label)) {
|
||||||
NSButton *theButton = [NSButton buttonWithTitle:[NSString stringWithUTF8String:label.c_str()] target:self action:@selector(buttonAction:)];
|
NSButton* theButton = [self makeButtonForDict:item withLabel:label];
|
||||||
theButton.tag = [id floatValue];
|
theButton.tag = [id floatValue];
|
||||||
|
|
||||||
NSCustomTouchBarItem *customItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
|
NSCustomTouchBarItem *customItem = [[NSCustomTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
@ -491,26 +516,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
customItem.customizationLabel = [NSString stringWithUTF8String:customizationLabel.c_str()];
|
customItem.customizationLabel = [NSString stringWithUTF8String:customizationLabel.c_str()];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string backgroundColor;
|
|
||||||
if (item.Get("backgroundColor", &backgroundColor)) {
|
|
||||||
theButton.bezelColor = [self colorFromHexColorString:[NSString stringWithUTF8String:backgroundColor.c_str()]];
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string labelColor;
|
|
||||||
if (item.Get("labelColor", &labelColor)) {
|
|
||||||
NSMutableAttributedString *attrTitle = [[NSMutableAttributedString alloc] initWithString:[NSString stringWithUTF8String:label.c_str()]];
|
|
||||||
NSUInteger len = [attrTitle length];
|
|
||||||
NSRange range = NSMakeRange(0, len);
|
|
||||||
[attrTitle addAttribute:NSForegroundColorAttributeName value:[self colorFromHexColorString:[NSString stringWithUTF8String:labelColor.c_str()]] range:range];
|
|
||||||
[attrTitle fixAttributesInRange:range];
|
|
||||||
[theButton setAttributedTitle:attrTitle];
|
|
||||||
}
|
|
||||||
|
|
||||||
gfx::Image image;
|
|
||||||
if (item.Get("image", &image)) {
|
|
||||||
theButton.image = image.AsNSImage();
|
|
||||||
}
|
|
||||||
|
|
||||||
return customItem;
|
return customItem;
|
||||||
}
|
}
|
||||||
return nil;
|
return nil;
|
||||||
|
@ -518,7 +523,6 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
|
|
||||||
- (nullable NSTouchBarItem*) makeLabelForID:(NSString*)id withIdentifier:(NSString*)identifier {
|
- (nullable NSTouchBarItem*) makeLabelForID:(NSString*)id withIdentifier:(NSString*)identifier {
|
||||||
std::string s_id = std::string([id UTF8String]);
|
std::string s_id = std::string([id UTF8String]);
|
||||||
NSLog(@"Making label: '%@'", id);
|
|
||||||
if (![self hasTBDict:s_id]) return nil;
|
if (![self hasTBDict:s_id]) return nil;
|
||||||
mate::PersistentDictionary item = item_id_map[s_id];
|
mate::PersistentDictionary item = item_id_map[s_id];
|
||||||
std::string label;
|
std::string label;
|
||||||
|
@ -577,9 +581,10 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
int maxValue = 100;
|
int maxValue = 100;
|
||||||
int minValue = 0;
|
int minValue = 0;
|
||||||
int initialValue = 50;
|
int initialValue = 50;
|
||||||
if (item.Get("minValue", &minValue) && item.Get("maxValue", &maxValue)) {
|
item.Get("minValue", &minValue);
|
||||||
item.Get("initialValue", &initialValue);
|
item.Get("maxValue", &maxValue);
|
||||||
}
|
item.Get("initialValue", &initialValue);
|
||||||
|
|
||||||
sliderItem.slider.minValue = minValue;
|
sliderItem.slider.minValue = minValue;
|
||||||
sliderItem.slider.maxValue = maxValue;
|
sliderItem.slider.maxValue = maxValue;
|
||||||
sliderItem.slider.doubleValue = initialValue;
|
sliderItem.slider.doubleValue = initialValue;
|
||||||
|
@ -587,10 +592,46 @@ bool ScopedDisableResize::disable_resize_ = false;
|
||||||
return sliderItem;
|
return sliderItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (nullable NSTouchBarItem*) makePopOverForID:(NSString*)id withIdentifier:(NSString*)identifier {
|
||||||
|
std::string s_id = std::string([id UTF8String]);
|
||||||
|
if (![self hasTBDict:s_id]) return nil;
|
||||||
|
mate::PersistentDictionary item = item_id_map[s_id];
|
||||||
|
|
||||||
|
NSPopoverTouchBarItem *popOverItem = [[NSPopoverTouchBarItem alloc] initWithIdentifier:identifier];
|
||||||
|
|
||||||
|
std::string customizationLabel;
|
||||||
|
if (item.Get("customizationLabel", &customizationLabel)) {
|
||||||
|
popOverItem.customizationLabel = [NSString stringWithUTF8String:customizationLabel.c_str()];
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string label;
|
||||||
|
gfx::Image image;
|
||||||
|
if (item.Get("label", &label)) {
|
||||||
|
popOverItem.collapsedRepresentationLabel = [NSString stringWithUTF8String:label.c_str()];
|
||||||
|
} else if (item.Get("image", &image)) {
|
||||||
|
popOverItem.collapsedRepresentationImage = image.AsNSImage();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool showCloseButton;
|
||||||
|
if (item.Get("showCloseButton", &showCloseButton)) {
|
||||||
|
popOverItem.showsCloseButton = showCloseButton;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<mate::PersistentDictionary> touchBar;
|
||||||
|
if (item.Get("touchBar", &touchBar)) {
|
||||||
|
popOverItem.popoverTouchBar = [self touchBarFromMutatableArray:[self identifierArrayFromDicts:touchBar]];
|
||||||
|
} else {
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
return popOverItem;
|
||||||
|
}
|
||||||
|
|
||||||
static NSTouchBarItemIdentifier ButtonIdentifier = @"com.electron.tb.button.";
|
static NSTouchBarItemIdentifier ButtonIdentifier = @"com.electron.tb.button.";
|
||||||
static NSTouchBarItemIdentifier ColorPickerIdentifier = @"com.electron.tb.colorpicker.";
|
static NSTouchBarItemIdentifier ColorPickerIdentifier = @"com.electron.tb.colorpicker.";
|
||||||
// static NSTouchBarItemIdentifier ListIdentifier = @"com.electron.tb.list.";
|
// static NSTouchBarItemIdentifier ListIdentifier = @"com.electron.tb.list.";
|
||||||
static NSTouchBarItemIdentifier LabelIdentifier = @"com.electron.tb.label.";
|
static NSTouchBarItemIdentifier LabelIdentifier = @"com.electron.tb.label.";
|
||||||
|
static NSTouchBarItemIdentifier PopOverIdentifier = @"com.electron.tb.popover.";
|
||||||
static NSTouchBarItemIdentifier SliderIdentifier = @"com.electron.tb.slider.";
|
static NSTouchBarItemIdentifier SliderIdentifier = @"com.electron.tb.slider.";
|
||||||
|
|
||||||
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {
|
- (nullable NSTouchBarItem *)touchBar:(NSTouchBar *)touchBar makeItemForIdentifier:(NSTouchBarItemIdentifier)identifier {
|
||||||
|
@ -606,6 +647,9 @@ static NSTouchBarItemIdentifier SliderIdentifier = @"com.electron.tb.slider.";
|
||||||
} else if ([identifier hasPrefix:SliderIdentifier]) {
|
} else if ([identifier hasPrefix:SliderIdentifier]) {
|
||||||
NSString* id = [self idFromIdentifier:identifier withPrefix:SliderIdentifier];
|
NSString* id = [self idFromIdentifier:identifier withPrefix:SliderIdentifier];
|
||||||
return [self makeSliderForID:id withIdentifier:identifier];
|
return [self makeSliderForID:id withIdentifier:identifier];
|
||||||
|
} else if ([identifier hasPrefix:PopOverIdentifier]) {
|
||||||
|
NSString* id = [self idFromIdentifier:identifier withPrefix:PopOverIdentifier];
|
||||||
|
return [self makePopOverForID:id withIdentifier:identifier];
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil;
|
return nil;
|
||||||
|
|
|
@ -28,6 +28,7 @@ exports.load = (appUrl) => {
|
||||||
mainWindow.setTouchBar(new TouchBar([
|
mainWindow.setTouchBar(new TouchBar([
|
||||||
new (TouchBar.Button)({
|
new (TouchBar.Button)({
|
||||||
label: 'Hello World!',
|
label: 'Hello World!',
|
||||||
|
// image: '/path/to/image',
|
||||||
backgroundColor: "FF0000",
|
backgroundColor: "FF0000",
|
||||||
labelColor: "0000FF",
|
labelColor: "0000FF",
|
||||||
click: () => {
|
click: () => {
|
||||||
|
@ -42,6 +43,19 @@ exports.load = (appUrl) => {
|
||||||
console.log('Color was changed', newColor)
|
console.log('Color was changed', newColor)
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
new (TouchBar.PopOver)({
|
||||||
|
// image: '/path/to/image',
|
||||||
|
label: 'foo',
|
||||||
|
showCloseButton: true,
|
||||||
|
touchBar: new TouchBar([
|
||||||
|
new (TouchBar.Button)({
|
||||||
|
label: 'Sub Button',
|
||||||
|
click: () => {
|
||||||
|
console.log('Sub Button Clicked')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
])
|
||||||
|
}),
|
||||||
new (TouchBar.Slider)({
|
new (TouchBar.Slider)({
|
||||||
label: 'Slider 123',
|
label: 'Slider 123',
|
||||||
minValue: 50,
|
minValue: 50,
|
||||||
|
|
|
@ -7,7 +7,6 @@ class TouchBar {
|
||||||
if (!Array.isArray(items)) {
|
if (!Array.isArray(items)) {
|
||||||
throw new Error('The items object provided has to be an array')
|
throw new Error('The items object provided has to be an array')
|
||||||
}
|
}
|
||||||
console.log(items)
|
|
||||||
items.forEach((item) => {
|
items.forEach((item) => {
|
||||||
if (!item.id) {
|
if (!item.id) {
|
||||||
throw new Error('Each item must be an instance of a TouchBarItem')
|
throw new Error('Each item must be an instance of a TouchBarItem')
|
||||||
|
@ -89,6 +88,20 @@ TouchBar.List = class TouchBarList extends TouchBarItem {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TouchBar.PopOver = class TouchBarPopOver extends TouchBarItem {
|
||||||
|
constructor (config) {
|
||||||
|
super(config)
|
||||||
|
this.config.type = 'popover'
|
||||||
|
}
|
||||||
|
|
||||||
|
toJSON () {
|
||||||
|
const config = this.config;
|
||||||
|
return Object.assign({}, config, {
|
||||||
|
touchBar: config.touchBar && config.touchBar.toJSON ? config.touchBar.toJSON() : []
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
TouchBar.Slider = class TouchBarSlider extends TouchBarItem {
|
TouchBar.Slider = class TouchBarSlider extends TouchBarItem {
|
||||||
constructor (config) {
|
constructor (config) {
|
||||||
super(config)
|
super(config)
|
||||||
|
|
Loading…
Add table
Reference in a new issue