Menüleistensymbol: Konturfassung statt Silhouette
Das Glyph des App-Icons besteht aus deckenden Flächen. Als Template-Bild — der einzige Weg, macOS zum Einfärben zu bewegen — verschmolzen die Facetten zu einer flachen Silhouette, weil dabei nur der Alphakanal zählt. MenuBarIcon.svg ist als Kontur gezeichnet: zwischen den Linien ist nichts, also bleibt beim Einfärben die Struktur erhalten. Das Symbol wird damit automatisch weiß auf dunkler und schwarz auf heller Menüleiste — ohne zweite Datei für den zweiten Fall. Die ebenfalls angebotene helle Flächenfassung wird damit überflüssig und ist nicht eingecheckt: sie wäre auf einer hellen Menüleiste unsichtbar, und eine ungenutzte Alternative im Repo lädt später zum Verwechseln ein. Der Kopierschritt für quartz.svg entfällt — die Datei liegt jetzt direkt im App-Target und wird ohne Umweg als Ressource eingebunden.
This commit is contained in:
@@ -15,6 +15,7 @@
|
|||||||
5BE38CAFCDA4B9CBE787CABA /* WeatherProvider in Frameworks */ = {isa = PBXBuildFile; productRef = D4578EB64F7A3372B49BC50C /* WeatherProvider */; };
|
5BE38CAFCDA4B9CBE787CABA /* WeatherProvider in Frameworks */ = {isa = PBXBuildFile; productRef = D4578EB64F7A3372B49BC50C /* WeatherProvider */; };
|
||||||
5EA873EC28C7EE21AC85A263 /* PlaceholderWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */; };
|
5EA873EC28C7EE21AC85A263 /* PlaceholderWidgets.swift in Sources */ = {isa = PBXBuildFile; fileRef = CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */; };
|
||||||
68EE5495435A82E20248EBC2 /* OnyxDesign in Frameworks */ = {isa = PBXBuildFile; productRef = 3D680DD645941493A7D3559E /* OnyxDesign */; };
|
68EE5495435A82E20248EBC2 /* OnyxDesign in Frameworks */ = {isa = PBXBuildFile; productRef = 3D680DD645941493A7D3559E /* OnyxDesign */; };
|
||||||
|
7CE2EDC6BC58678269BF27AD /* MenuBarIcon.svg in Resources */ = {isa = PBXBuildFile; fileRef = 24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */; };
|
||||||
9C2E419014B7E04630FDF151 /* OnyxApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */; };
|
9C2E419014B7E04630FDF151 /* OnyxApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */; };
|
||||||
A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 508DECB5C05264E6130C373E /* Localizable.xcstrings */; };
|
A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */ = {isa = PBXBuildFile; fileRef = 508DECB5C05264E6130C373E /* Localizable.xcstrings */; };
|
||||||
B6CD48B41866A468AE7A1BC7 /* OnyxMenuBar in Frameworks */ = {isa = PBXBuildFile; productRef = A7FD7A4864E5ED4B95C211AF /* OnyxMenuBar */; };
|
B6CD48B41866A468AE7A1BC7 /* OnyxMenuBar in Frameworks */ = {isa = PBXBuildFile; productRef = A7FD7A4864E5ED4B95C211AF /* OnyxMenuBar */; };
|
||||||
@@ -27,6 +28,7 @@
|
|||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
055263008CB3306A8D09E6D4 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = wrapper.icon; path = AppIcon.icon; sourceTree = "<group>"; };
|
055263008CB3306A8D09E6D4 /* AppIcon.icon */ = {isa = PBXFileReference; lastKnownFileType = wrapper.icon; path = AppIcon.icon; sourceTree = "<group>"; };
|
||||||
0804288DC4A8146DD9F3FC3E /* Onyx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Onyx.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
0804288DC4A8146DD9F3FC3E /* Onyx.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Onyx.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
|
24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */ = {isa = PBXFileReference; path = MenuBarIcon.svg; sourceTree = "<group>"; };
|
||||||
45BD2DF1B775C733C8F75635 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
|
45BD2DF1B775C733C8F75635 /* SettingsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsView.swift; sourceTree = "<group>"; };
|
||||||
508DECB5C05264E6130C373E /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
|
508DECB5C05264E6130C373E /* Localizable.xcstrings */ = {isa = PBXFileReference; lastKnownFileType = text.json.xcstrings; path = Localizable.xcstrings; sourceTree = "<group>"; };
|
||||||
50A018673EE6BD9C50F1EFA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
50A018673EE6BD9C50F1EFA0 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
|
||||||
@@ -97,6 +99,7 @@
|
|||||||
B83C4E3CB821F903F3977E88 /* AppModel.swift */,
|
B83C4E3CB821F903F3977E88 /* AppModel.swift */,
|
||||||
50A018673EE6BD9C50F1EFA0 /* Info.plist */,
|
50A018673EE6BD9C50F1EFA0 /* Info.plist */,
|
||||||
508DECB5C05264E6130C373E /* Localizable.xcstrings */,
|
508DECB5C05264E6130C373E /* Localizable.xcstrings */,
|
||||||
|
24ADD22F5CE30B27020B479B /* MenuBarIcon.svg */,
|
||||||
87597F09E971C14CF1E475DB /* Onyx.entitlements */,
|
87597F09E971C14CF1E475DB /* Onyx.entitlements */,
|
||||||
F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */,
|
F89CAC2A7DA89B8707D45D65 /* OnyxApp.swift */,
|
||||||
CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */,
|
CB5D52C0D22AE1F5E0601AF9 /* PlaceholderWidgets.swift */,
|
||||||
@@ -117,7 +120,6 @@
|
|||||||
B211CE3C0EF94A8D680E4AE0 /* Resources */,
|
B211CE3C0EF94A8D680E4AE0 /* Resources */,
|
||||||
7FF994FE5530D53BEFBE13FE /* Frameworks */,
|
7FF994FE5530D53BEFBE13FE /* Frameworks */,
|
||||||
9A7A5929B893076DEC10139E /* MediaRemote-Adapter bauen und beilegen */,
|
9A7A5929B893076DEC10139E /* MediaRemote-Adapter bauen und beilegen */,
|
||||||
F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */,
|
|
||||||
);
|
);
|
||||||
buildRules = (
|
buildRules = (
|
||||||
);
|
);
|
||||||
@@ -183,6 +185,7 @@
|
|||||||
files = (
|
files = (
|
||||||
FF97F56CE1C734E59F1B40F4 /* AppIcon.icon in Resources */,
|
FF97F56CE1C734E59F1B40F4 /* AppIcon.icon in Resources */,
|
||||||
A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */,
|
A529046C33E6B00C0E9508FF /* Localizable.xcstrings in Resources */,
|
||||||
|
7CE2EDC6BC58678269BF27AD /* MenuBarIcon.svg in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -202,32 +205,12 @@
|
|||||||
name = "MediaRemote-Adapter bauen und beilegen";
|
name = "MediaRemote-Adapter bauen und beilegen";
|
||||||
outputFileListPaths = (
|
outputFileListPaths = (
|
||||||
);
|
);
|
||||||
outputPaths = (
|
|
||||||
"$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/Vendor/mediaremote-adapter.pl",
|
|
||||||
);
|
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
|
||||||
shellPath = /bin/sh;
|
|
||||||
shellScript = "OUT=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/Vendor\" \\\n \"$SRCROOT/Scripts/build-mediaremote-adapter.sh\"\n";
|
|
||||||
};
|
|
||||||
F10EA44D021D8D6C50BEDCAA /* Glyph für die Menüleiste ins Bundle kopieren */ = {
|
|
||||||
isa = PBXShellScriptBuildPhase;
|
|
||||||
buildActionMask = 2147483647;
|
|
||||||
files = (
|
|
||||||
);
|
|
||||||
inputFileListPaths = (
|
|
||||||
);
|
|
||||||
inputPaths = (
|
|
||||||
"$(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg",
|
|
||||||
);
|
|
||||||
name = "Glyph für die Menüleiste ins Bundle kopieren";
|
|
||||||
outputFileListPaths = (
|
|
||||||
);
|
|
||||||
outputPaths = (
|
outputPaths = (
|
||||||
"$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg",
|
"$(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg",
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
shellPath = /bin/sh;
|
shellPath = /bin/sh;
|
||||||
shellScript = "SRC=\"$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg\"\nDST=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg\"\nif [ -f \"$SRC\" ]; then\n mkdir -p \"$(dirname \"$DST\")\"\n cp \"$SRC\" \"$DST\"\nelse\n echo \"warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück\"\nfi\n";
|
shellScript = "OUT=\"$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/Vendor\" \\\n \"$SRCROOT/Scripts/build-mediaremote-adapter.sh\"\n";
|
||||||
};
|
};
|
||||||
/* End PBXShellScriptBuildPhase section */
|
/* End PBXShellScriptBuildPhase section */
|
||||||
|
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
@@ -172,28 +172,26 @@ final class AppDelegate: NSObject, NSApplicationDelegate {
|
|||||||
/// Menüleiste. Dort steht sie als farbiger Klotz zwischen lauter
|
/// Menüleiste. Dort steht sie als farbiger Klotz zwischen lauter
|
||||||
/// Strichsymbolen.
|
/// Strichsymbolen.
|
||||||
///
|
///
|
||||||
/// Geladen wird dieselbe SVG-Datei, aus der auch das App-Icon gebaut wird —
|
/// **Eine eigene Konturfassung, nicht das App-Icon.**
|
||||||
/// NSImage liest sie als Vektor (`_NSSVGImageRep`), sie skaliert also
|
|
||||||
/// verlustfrei.
|
|
||||||
///
|
///
|
||||||
/// **Als Template-Bild.** Das Glyph besteht aus zehn deckenden Pfaden in
|
/// Das Glyph des App-Icons besteht aus deckenden Flächen in sehr dunklen
|
||||||
/// sehr dunklen Tönen (#1c1f1f bis #000000). Im App-Icon liegt es auf
|
/// Tönen. Auf dem blauen Verlauf des Icons liest es sich als Kristall,
|
||||||
/// blauem Verlauf und liest sich als Kristall; allein auf einer dunklen
|
/// allein auf einer dunklen Menüleiste ist es schwarz auf schwarz. Und als
|
||||||
/// Menüleiste ist es schwarz auf schwarz. macOS färbt ausschließlich
|
/// Template-Bild — der einzige Weg, macOS zum Einfärben zu bewegen —
|
||||||
/// Template-Bilder ein, und die benutzen nur den Alphakanal — die Facetten
|
/// verschmelzen die Facetten zu einer flachen Silhouette, weil dabei nur
|
||||||
/// verschmelzen dabei zu einer Silhouette.
|
/// der Alphakanal zählt.
|
||||||
///
|
///
|
||||||
/// Das ist der bewusste Tausch: erkennbare Form in hellen wie dunklen
|
/// `MenuBarIcon.svg` ist deshalb als Kontur gezeichnet: zwischen den Linien
|
||||||
/// Menüleisten statt Facetten, die man in keiner von beiden sieht. Eine
|
/// ist nichts, also bleibt beim Einfärben die Struktur erhalten. Das Symbol
|
||||||
/// Fassung mit durchsichtigen Facettenfugen behielte beides — dafür müsste
|
/// wird damit automatisch weiß auf dunkler und schwarz auf heller
|
||||||
/// das SVG entsprechend gezeichnet sein.
|
/// Menüleiste, ohne zweite Datei für den zweiten Fall.
|
||||||
///
|
///
|
||||||
/// 18 pt ist die übliche Höhe; die Leiste ist 22 pt hoch und braucht oben
|
/// 18 pt ist die übliche Höhe; die Leiste ist 22 pt hoch und braucht oben
|
||||||
/// und unten Luft.
|
/// und unten Luft.
|
||||||
private static func menuBarIcon() -> NSImage {
|
private static func menuBarIcon() -> NSImage {
|
||||||
let size = NSSize(width: 18, height: 18)
|
let size = NSSize(width: 18, height: 18)
|
||||||
|
|
||||||
if let url = Bundle.main.url(forResource: "quartz", withExtension: "svg"),
|
if let url = Bundle.main.url(forResource: "MenuBarIcon", withExtension: "svg"),
|
||||||
let glyph = NSImage(contentsOf: url) {
|
let glyph = NSImage(contentsOf: url) {
|
||||||
let image = NSImage(size: size, flipped: false) { rect in
|
let image = NSImage(size: size, flipped: false) { rect in
|
||||||
glyph.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1)
|
glyph.draw(in: rect, from: .zero, operation: .sourceOver, fraction: 1)
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="512" height="512" x="0" y="0" viewBox="0 0 512 512" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><path fill="#c3c3c3" d="m461.481 384.169-56.77-221.599a16.3 16.3 0 0 0-1.355-3.512L256.001 0 108.707 158.934a16.2 16.2 0 0 0-1.416 3.636L50.52 384.169a10.8 10.8 0 0 0 .081 5.665l126.344 121.391c1.267.507 2.631.775 4.021.775h150.07c1.389 0 2.753-.268 4.019-.774l126.292-121.217c.569-1.866.635-3.883.134-5.84" opacity="1" data-original="#a6e7f0" class=""></path><path fill="#f3f5f6" d="m461.481 384.169-56.77-221.599a16.3 16.3 0 0 0-1.355-3.512L256.001 0a10.78 10.78 0 0 0-8.035 3.584l-3.811 4.233 133.203 147.924a16.2 16.2 0 0 1 3.659 6.829l56.77 221.599a10.81 10.81 0 0 1-3.015 10.511L314.801 509.015a10.8 10.8 0 0 1-7.46 2.985h23.694c1.389 0 2.753-.268 4.019-.774l126.292-121.217c.57-1.866.636-3.883.135-5.84" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#f3f5f6" d="M401.051 155.741 264.035 3.584A10.77 10.77 0 0 0 256.001 0v188.536l62.219 54.012 85.136-83.491a15.8 15.8 0 0 0-2.305-3.316" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#d6d6d6" d="M377.357 155.741a16.2 16.2 0 0 1 3.659 6.829l3.766 14.701 18.573-18.213a15.8 15.8 0 0 0-2.305-3.317L264.035 3.584A10.77 10.77 0 0 0 256.001 0v20.972z" opacity="1" data-original="#2ed1e2" class=""></path><path fill="#d6d6d6" d="M247.966 3.584 110.95 155.741a15.9 15.9 0 0 0-2.302 3.319l85.1 83.456L256 188.537V0a10.77 10.77 0 0 0-8.034 3.584" opacity="1" data-original="#d4f2f6" class=""></path><path fill="#c3c3c3" d="M256.001 0a10.77 10.77 0 0 0-8.035 3.584l-3.811 4.233 11.846 13.155z" opacity="1" data-original="#a6e7f0" class=""></path><path fill="#f3f5f6" d="M357.937 371.972 299.07 419.94l35.985 91.286.012-.001a10.7 10.7 0 0 0 3.428-2.209L458.467 394.68a10.74 10.74 0 0 0 2.879-4.671z" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#d6d6d6" d="m461.346 390.009-23.276-4.06a10.8 10.8 0 0 1-3.298 8.731L328.891 495.587l6.163 15.639.012-.001a10.7 10.7 0 0 0 3.428-2.209L458.467 394.68a10.74 10.74 0 0 0 2.879-4.671" opacity="1" data-original="#2ed1e2" class=""></path><path fill="#f3f5f6" d="m149.944 371.907-99.298 18.091a10.8 10.8 0 0 0 2.888 4.683l119.971 114.336a10.8 10.8 0 0 0 3.439 2.209l35.965-91.22z" opacity="1" data-original="#6bd9e7" class=""></path><path fill="#a5a5a5" d="m209.819 418.393-57.237-42.83a7.57 7.57 0 0 1-2.612-8.553l42.606-122.127a10.8 10.8 0 0 1 2.969-4.468l55.387-49.932a7.57 7.57 0 0 1 10.138 0l55.257 49.814a10.8 10.8 0 0 1 3.071 4.777l38.574 122.228a7.57 7.57 0 0 1-2.482 8.183l-53.224 42.684a10.82 10.82 0 0 1-6.767 2.379h-79.203a10.8 10.8 0 0 1-6.477-2.155" opacity="1" data-original="#eaf9fa" class=""></path></g></svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.7 KiB |
12
project.yml
12
project.yml
@@ -72,18 +72,6 @@ targets:
|
|||||||
# .icns und Assets.car und legt nichts Lesbares ins Bundle — und eine
|
# .icns und Assets.car und legt nichts Lesbares ins Bundle — und eine
|
||||||
# einzelne Datei daraus lässt sich nicht als Ressource referenzieren.
|
# einzelne Datei daraus lässt sich nicht als Ressource referenzieren.
|
||||||
# Deshalb kopieren statt duplizieren: es bleibt bei einer Quelldatei.
|
# Deshalb kopieren statt duplizieren: es bleibt bei einer Quelldatei.
|
||||||
- name: Glyph für die Menüleiste ins Bundle kopieren
|
|
||||||
script: |
|
|
||||||
SRC="$SRCROOT/Onyx/AppIcon.icon/Assets/quartz.svg"
|
|
||||||
DST="$BUILT_PRODUCTS_DIR/$UNLOCALIZED_RESOURCES_FOLDER_PATH/quartz.svg"
|
|
||||||
if [ -f "$SRC" ]; then
|
|
||||||
mkdir -p "$(dirname "$DST")"
|
|
||||||
cp "$SRC" "$DST"
|
|
||||||
else
|
|
||||||
echo "warning: $SRC fehlt — Menüleiste fällt auf ein SF-Symbol zurück"
|
|
||||||
fi
|
|
||||||
inputFiles:
|
|
||||||
- $(SRCROOT)/Onyx/AppIcon.icon/Assets/quartz.svg
|
|
||||||
outputFiles:
|
outputFiles:
|
||||||
- $(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg
|
- $(BUILT_PRODUCTS_DIR)/$(UNLOCALIZED_RESOURCES_FOLDER_PATH)/quartz.svg
|
||||||
settings:
|
settings:
|
||||||
|
|||||||
Reference in New Issue
Block a user