Commit a4a45e75 authored by Marvin Scholz's avatar Marvin Scholz

macosx: Use specific class for log messages

Instead of a NSDictionary, use a dedicated class for log messages.
Not only allows this for better abstraction and reusability, it
additionally solves a problem where log messages with the same content
would be considered equal, because all keys in the dictionary were
equal, ending up in wrong selections in the table.
parent 95e3ec24
......@@ -93,6 +93,7 @@
6BBB05DA1EEFEA29003A1019 /* VLCHUDOutlineView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB05D91EEFEA29003A1019 /* VLCHUDOutlineView.m */; };
6BBB05E01EEFF165003A1019 /* VLCHUDTableCornerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB05DF1EEFF165003A1019 /* VLCHUDTableCornerView.m */; };
6BBB05E31EF08181003A1019 /* VLCHUDSegmentedCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBB05E21EF08181003A1019 /* VLCHUDSegmentedCell.m */; };
6BBBF9851F7B257100B404CD /* VLCLogMessage.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BBBF9841F7B257100B404CD /* VLCLogMessage.m */; };
6BF093F91EE0182B0049D8B0 /* VLCTimeField.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF093F81EE0182B0049D8B0 /* VLCTimeField.m */; };
6BF5C5011EFE03CF008A9C12 /* VLCHUDStepperCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF5C5001EFE03CF008A9C12 /* VLCHUDStepperCell.m */; };
6BF5C5041EFE66EF008A9C12 /* VLCHUDTableView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6BF5C5031EFE66EF008A9C12 /* VLCHUDTableView.m */; };
......@@ -635,6 +636,8 @@
6BBBB8B11D10A994001BD9BA /* VLCRendererItem.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCRendererItem.m; sourceTree = "<group>"; };
6BBBB8B51D114628001BD9BA /* VLCRendererDiscovery.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCRendererDiscovery.h; sourceTree = "<group>"; };
6BBBB8B61D114628001BD9BA /* VLCRendererDiscovery.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCRendererDiscovery.m; sourceTree = "<group>"; };
6BBBF9831F7B257100B404CD /* VLCLogMessage.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VLCLogMessage.h; sourceTree = "<group>"; };
6BBBF9841F7B257100B404CD /* VLCLogMessage.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = VLCLogMessage.m; sourceTree = "<group>"; };
6BCB59091DA247CD009BCA66 /* VLCFSPanelController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCFSPanelController.h; sourceTree = "<group>"; };
6BCB590A1DA247CD009BCA66 /* VLCFSPanelController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = VLCFSPanelController.m; sourceTree = "<group>"; };
6BF093F71EE0182B0049D8B0 /* VLCTimeField.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VLCTimeField.h; sourceTree = "<group>"; };
......@@ -850,6 +853,8 @@
CC4A33210F8CB017000FC4A7 /* VLCCoreDialogProvider.m */,
CC448A6013B68A0B009F72E0 /* VLCCoreInteraction.h */,
CC448A6113B68A0B009F72E0 /* VLCCoreInteraction.m */,
6BBBF9831F7B257100B404CD /* VLCLogMessage.h */,
6BBBF9841F7B257100B404CD /* VLCLogMessage.m */,
7D8BB0B318302AC000FAE9B7 /* VLCLogWindowController.h */,
7D8BB0B418302AC000FAE9B7 /* VLCLogWindowController.m */,
1C39ABBC1DA9AB9B00FE052A /* VLCDocumentController.h */,
......@@ -1699,7 +1704,7 @@
};
};
};
buildConfigurationList = C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "vlc" */;
buildConfigurationList = C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "VLC" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 1;
......@@ -1754,6 +1759,7 @@
1C3113941E508C6900D4DD76 /* VLCAddonsWindowController.m in Sources */,
1C3113961E508C6900D4DD76 /* applescript.m in Sources */,
1C3113981E508C6900D4DD76 /* VLCAudioEffectsWindowController.m in Sources */,
6BBBF9851F7B257100B404CD /* VLCLogMessage.m in Sources */,
1C31139A1E508C6900D4DD76 /* VLCBookmarksWindowController.m in Sources */,
6B0AB0F01F1AC8B3003A1B4E /* VLCSlider.m in Sources */,
6BF5C5041EFE66EF008A9C12 /* VLCHUDTableView.m in Sources */,
......@@ -2018,7 +2024,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Default;
};
C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "vlc" */ = {
C2F2A6EA09588F1B00018C74 /* Build configuration list for PBXProject "VLC" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C2F2A6EB09588F1B00018C74 /* Development */,
......
......@@ -71,6 +71,7 @@ libmacosx_plugin_la_SOURCES = \
gui/macosx/VLCAudioEffectsWindowController.h gui/macosx/VLCAudioEffectsWindowController.m \
gui/macosx/VLCBookmarksWindowController.h gui/macosx/VLCBookmarksWindowController.m \
gui/macosx/VLCCoreDialogProvider.h gui/macosx/VLCCoreDialogProvider.m \
gui/macosx/VLCLogMessage.h gui/macosx/VLCLogMessage.m \
gui/macosx/VLCLogWindowController.h gui/macosx/VLCLogWindowController.m \
gui/macosx/VLCHUDSliderCell.h gui/macosx/VLCHUDSliderCell.m \
gui/macosx/VLCHUDButtonCell.h gui/macosx/VLCHUDButtonCell.m \
......
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="16G24b" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="12121" systemVersion="17A365" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment version="1070" identifier="macosx"/>
<development version="7000" identifier="xcode"/>
......@@ -48,7 +48,7 @@
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
<color key="gridColor" name="gridColor" catalog="System" colorSpace="catalog"/>
<tableColumns>
<tableColumn width="60" minWidth="40" maxWidth="1000" id="1UD-vH-uqq">
<tableColumn identifier="" width="60" minWidth="40" maxWidth="1000" id="1UD-vH-uqq">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Type">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
......@@ -73,7 +73,7 @@
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="9bi-ti-5pD" name="value" keyPath="objectValue.type" id="K3E-xf-XY7"/>
<binding destination="9bi-ti-5pD" name="value" keyPath="objectValue.typeName" id="jag-ra-88G"/>
</connections>
</textField>
</subviews>
......@@ -88,7 +88,7 @@
</tableCellView>
</prototypeCellViews>
</tableColumn>
<tableColumn width="90" minWidth="40" maxWidth="1000" id="ybR-8n-0YS">
<tableColumn identifier="" width="90" minWidth="40" maxWidth="1000" id="ybR-8n-0YS">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" title="Component">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
......@@ -145,7 +145,7 @@
<rect key="frame" x="157" y="1" width="321" height="17"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" allowsExpansionToolTips="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hdT-qU-xRy">
<textField verticalHuggingPriority="750" horizontalCompressionResistancePriority="250" misplaced="YES" allowsExpansionToolTips="YES" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="hdT-qU-xRy">
<rect key="frame" x="0.0" y="-9" width="321" height="35"/>
<textFieldCell key="cell" lineBreakMode="truncatingTail" allowsUndo="NO" sendsActionOnEndEditing="YES" alignment="left" placeholderString="" usesSingleLineMode="YES" id="ed5-yc-Kp5">
<font key="font" metaFont="system"/>
......@@ -212,7 +212,7 @@ It can even span multiple lines</string>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.type" id="qUO-gT-OT1">
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.typeName" id="gwS-Dq-GX6">
<dictionary key="options">
<string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
IA
......@@ -229,7 +229,7 @@ IA
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.position" id="l9O-cX-idn">
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.location" id="vqO-9x-c2s">
<dictionary key="options">
<string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
IA
......@@ -295,7 +295,7 @@ IA
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.func" id="7hC-0w-bVD">
<binding destination="0Or-bh-QJU" name="value" keyPath="selection.function" id="ENe-8J-RIM">
<dictionary key="options">
<string key="NSNoSelectionPlaceholder" base64-UTF8="YES">
IA
......@@ -443,13 +443,7 @@ IA
</toolbar>
<point key="canvasLocation" x="139" y="192"/>
</window>
<arrayController editable="NO" selectsInsertedObjects="NO" id="0Or-bh-QJU">
<declaredKeys>
<string>component</string>
<string>message</string>
<string>type</string>
<string>image</string>
</declaredKeys>
<arrayController objectClassName="VLCLogMessage" editable="NO" selectsInsertedObjects="NO" id="0Or-bh-QJU">
<connections>
<binding destination="-2" name="contentArray" keyPath="self.messagesArray" id="nWK-kZ-4HF"/>
</connections>
......
/*****************************************************************************
* VLCLogMessage.h: Log message class
*****************************************************************************
* Copyright (C) 2017 VLC authors and VideoLAN
* $Id$
*
* Authors: Marvin Scholz <epirat07 at gmail dot com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import <Foundation/Foundation.h>
#import <vlc_common.h>
@interface VLCLogMessage : NSObject
@property (readonly, getter=typeName) NSString *typeName;
@property (readonly) int type;
@property (readonly) NSString *message;
@property (readonly) NSString *component;
@property (readonly) NSString *function;
@property (readonly) NSString *location;
@property (readonly, getter=fullMessage) NSString *fullMessage;
+ (instancetype)logMessage:(char *)msg type:(int)type info:(const vlc_log_t *)info;
- (instancetype)initWithMessage:(char *)message type:(int)type info:(const vlc_log_t *)info;
@end
/*****************************************************************************
* VLCLogMessage.m: Log message class
*****************************************************************************
* Copyright (C) 2017 VLC authors and VideoLAN
* $Id$
*
* Authors: Marvin Scholz <epirat07 at gmail dot com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#import "VLCLogMessage.h"
@implementation VLCLogMessage
+ (instancetype)logMessage:(char *)msg type:(int)type info:(const vlc_log_t *)info
{
return [[VLCLogMessage alloc] initWithMessage:msg type:type info:info];
}
- (instancetype)initWithMessage:(char *)message type:(int)type info:(const vlc_log_t *)info
{
self = [super init];
if (self) {
if (!message || !info->psz_module)
return nil;
_type = type;
_message = [NSString stringWithUTF8String:message];
_location = [NSString stringWithFormat:@"%s:%i", info->file, info->line];
_component = [NSString stringWithUTF8String:info->psz_module];
_function = [NSString stringWithUTF8String:info->func];
}
return self;
}
- (NSString *)fullMessage
{
return [NSString stringWithFormat:@"%@ %@: %@", _component, self.typeName, _message];
}
- (NSString *)typeName
{
switch (_type) {
case VLC_MSG_INFO:
return @"info";
case VLC_MSG_ERR:
return @"error";
case VLC_MSG_WARN:
return @"warning";
case VLC_MSG_DBG:
return @"debug";
default:
return @"unknown";
}
}
@end
......@@ -24,6 +24,7 @@
*****************************************************************************/
#import "VLCLogWindowController.h"
#import "VLCLogMessage.h"
#import "VLCMain.h"
#import <vlc_common.h>
......@@ -42,7 +43,7 @@
*/
@property (retain) NSTimer *refreshTimer;
- (void)addMessage:(NSDictionary *)message;
- (void)addMessage:(VLCLogMessage *)message;
@end
......@@ -56,27 +57,14 @@ static void MsgCallback(void *data, int type, const vlc_log_t *item, const char
@autoreleasepool {
char *msg;
VLCLogWindowController *controller = (__bridge VLCLogWindowController*)data;
static NSString *types[4] = { @"info", @"error", @"warning", @"debug" };
if (vasprintf(&msg, format, ap) == -1) {
return;
}
if (!item->psz_module || !msg) {
free(msg);
return;
}
NSString *position = [NSString stringWithFormat:@"%s:%i", item->file, item->line];
NSDictionary *messageDict = @{
@"type" : types[type],
@"message" : toNSStr(msg),
@"component" : toNSStr(item->psz_module),
@"position" : position,
@"func" : toNSStr(item->func)
};
[controller addMessage:messageDict];
[controller addMessage:[VLCLogMessage logMessage:msg
type:type
info:item]];
free(msg);
}
}
......@@ -175,16 +163,16 @@ static void MsgCallback(void *data, int type, const vlc_log_t *item, const char
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
colors = @{
@"info" : [NSColor colorWithCalibratedRed:0.65 green:0.91 blue:1.0 alpha:0.7],
@"error" : [NSColor colorWithCalibratedRed:1.0 green:0.49 blue:0.45 alpha:0.5],
@"warning" : [NSColor colorWithCalibratedRed:1.0 green:0.88 blue:0.45 alpha:0.7],
@"debug" : [NSColor colorWithCalibratedRed:0.96 green:0.96 blue:0.96 alpha:0.5]
@(VLC_MSG_INFO): [NSColor colorWithCalibratedRed:0.65 green:0.91 blue:1.0 alpha:0.7],
@(VLC_MSG_ERR) : [NSColor colorWithCalibratedRed:1.0 green:0.49 blue:0.45 alpha:0.5],
@(VLC_MSG_WARN): [NSColor colorWithCalibratedRed:1.0 green:0.88 blue:0.45 alpha:0.7],
@(VLC_MSG_DBG) : [NSColor colorWithCalibratedRed:0.96 green:0.96 blue:0.96 alpha:0.5]
};
});
// Lookup color for message type
NSDictionary *message = [[_arrayController arrangedObjects] objectAtIndex:row];
rowView.backgroundColor = [colors objectForKey:[message objectForKey:@"type"]];
VLCLogMessage *message = [[_arrayController arrangedObjects] objectAtIndex:row];
rowView.backgroundColor = [colors objectForKey:@(message.type)];
}
- (void)splitViewDidResizeSubviews:(NSNotification *)notification
......@@ -215,15 +203,11 @@ static void MsgCallback(void *data, int type, const vlc_log_t *item, const char
}
NSMutableString *string = [[NSMutableString alloc] init];
for (NSDictionary *line in _messagesArray) {
NSString *message = [NSString stringWithFormat:@"%@ %@ %@\n",
[line objectForKey:@"component"],
[line objectForKey:@"type"],
[line objectForKey:@"message"]];
[string appendString:message];
for (VLCLogMessage *message in _messagesArray) {
[string appendFormat:@"%@\r\n", message.fullMessage];
}
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
if ([data writeToFile: [[saveFolderPanel URL] path] atomically: YES] == NO)
if ([data writeToFile:[[saveFolderPanel URL] path] atomically:YES] == NO)
msg_Warn(getIntf(), "Error while saving the debug log");
}];
}
......@@ -267,12 +251,8 @@ static void MsgCallback(void *data, int type, const vlc_log_t *item, const char
- (void) copy:(id)sender {
NSPasteboard *pasteBoard = [NSPasteboard generalPasteboard];
[pasteBoard clearContents];
for (NSDictionary *line in [_arrayController selectedObjects]) {
NSString *message = [NSString stringWithFormat:@"%@ %@: %@",
[line objectForKey:@"component"],
[line objectForKey:@"type"],
[line objectForKey:@"message"]];
[pasteBoard writeObjects:@[message]];
for (VLCLogMessage *message in [_arrayController selectedObjects]) {
[pasteBoard writeObjects:@[message.fullMessage]];
}
}
......@@ -304,10 +284,13 @@ static void MsgCallback(void *data, int type, const vlc_log_t *item, const char
Adds a message to the messageBuffer, it does not has to be called from the main thread, as
items are only added to the messageArray on refresh.
*/
- (void)addMessage:(NSDictionary *)messageDict
- (void)addMessage:(VLCLogMessage *)message
{
if (!message)
return;
@synchronized (_messageBuffer) {
[_messageBuffer addObject:messageDict];
[_messageBuffer addObject:message];
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment