From 3ddedff978679f3688f794d36adb78300fbfde93 Mon Sep 17 00:00:00 2001 From: Louis Pontoise Date: Wed, 26 Aug 2020 23:39:03 +0900 Subject: [PATCH] feat: improve the 3 colored buttons when hovering (closes #516) --- alt-tab-macos.xcodeproj/project.pbxproj | 26 +++++++++++++--- resources/SF-Pro-Text-Regular.otf | Bin 13688 -> 13392 bytes resources/icons/window-controls/close@2x.png | Bin 0 -> 1507 bytes .../icons/window-controls/fullscreen@2x.png | Bin 0 -> 1235 bytes .../icons/window-controls/minimize@2x.png | Bin 0 -> 1146 bytes ...con_to_image.sh => convert_font_to_png.sh} | 0 scripts/convert_svg_to_png.sh | 27 +++++++++++++++++ scripts/subset_font.sh | 7 +++++ scripts/subset_fonticon.sh | 7 ----- src/api-wrappers/HelperExtensions.swift | 13 ++++++++ src/logic/Screen.swift | 2 +- .../main-window/ThumbnailFontIconView.swift | 3 -- src/ui/main-window/ThumbnailView.swift | 28 +++++++++++++----- src/ui/main-window/WindowControlView.swift | 24 +++++++++++++++ 14 files changed, 115 insertions(+), 22 deletions(-) create mode 100644 resources/icons/window-controls/close@2x.png create mode 100644 resources/icons/window-controls/fullscreen@2x.png create mode 100644 resources/icons/window-controls/minimize@2x.png rename scripts/{fonticon_to_image.sh => convert_font_to_png.sh} (100%) create mode 100755 scripts/convert_svg_to_png.sh create mode 100755 scripts/subset_font.sh delete mode 100755 scripts/subset_fonticon.sh create mode 100644 src/ui/main-window/WindowControlView.swift diff --git a/alt-tab-macos.xcodeproj/project.pbxproj b/alt-tab-macos.xcodeproj/project.pbxproj index 3a28697b..2cad4212 100644 --- a/alt-tab-macos.xcodeproj/project.pbxproj +++ b/alt-tab-macos.xcodeproj/project.pbxproj @@ -15,8 +15,12 @@ BF0C829583ED47E458528F3A /* accessibility@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C889529FF19620EDAC295 /* accessibility@2x.png */; }; BF0C83E902F75A97E8FD374A /* menubar-2@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C8D3333653ACAEF730DD8 /* menubar-2@2x.png */; }; BF0C8406805BDEC5B69E8803 /* screen-recording@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C8E25373671B528AD448D /* screen-recording@2x.png */; }; + BF0C8477850829E15FD4DD43 /* close@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C8F9CE1699644A22EAF2C /* close@2x.png */; }; BF0C852D28E458CDD6FA3E44 /* app.icns in Resources */ = {isa = PBXBuildFile; fileRef = BF0C84E11784B3B0900D0963 /* app.icns */; }; + BF0C89DF22C7B7D0C27DA2A4 /* WindowControlView.swift in Sources */ = {isa = PBXBuildFile; fileRef = BF0C884157B87BF0E17EF7F8 /* WindowControlView.swift */; }; BF0C8C9CA44285E493918A74 /* menubar-3@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C8E54658B4DAEA0528200 /* menubar-3@2x.png */; }; + BF0C8CB668FFABBCA23880B6 /* minimize@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C817D9C335EE4A0536601 /* minimize@2x.png */; }; + BF0C8F80281B50D57C95ECCF /* fullscreen@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = BF0C83BD867F6A874F9953C9 /* fullscreen@2x.png */; }; BF0C8FA2D756D3258E3A16B6 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = BF0C81DF55C6B0A279CE0FE1 /* Localizable.strings */; }; D04BA004884A273D4D2D3EF1 /* HelperExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = D04BAD91161791D42FEC4A60 /* HelperExtensions.swift */; }; D04BA0182F4734A5C8BB63DC /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = D04BA5461DAEE9B5350C3020 /* Localizable.strings */; }; @@ -124,13 +128,17 @@ 481FE54624D2D387001032F1 /* alt-tab-macos-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "alt-tab-macos-Bridging-Header.h"; sourceTree = ""; }; 59DD4BE63D42EEFF1182BA7F /* Pods-alt-tab-macos.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-alt-tab-macos.release.xcconfig"; path = "Target Support Files/Pods-alt-tab-macos/Pods-alt-tab-macos.release.xcconfig"; sourceTree = ""; }; 672F94799CC7C90282AEB3EA /* Pods-alt-tab-macos.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-alt-tab-macos.debug.xcconfig"; path = "Target Support Files/Pods-alt-tab-macos/Pods-alt-tab-macos.debug.xcconfig"; sourceTree = ""; }; + BF0C817D9C335EE4A0536601 /* minimize@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "minimize@2x.png"; sourceTree = ""; }; BF0C81B8A30416D774B5B60E /* fullscreen.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = fullscreen.svg; sourceTree = ""; }; BF0C81C1B55A0519C3272B09 /* close.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = close.svg; sourceTree = ""; }; BF0C828AF7BCC4F47E70B28F /* menubar-2.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = "menubar-2.svg"; sourceTree = ""; }; BF0C833D471343CEA3DEFE56 /* icon_512x512@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "icon_512x512@2x.png"; sourceTree = ""; }; + BF0C83BD867F6A874F9953C9 /* fullscreen@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "fullscreen@2x.png"; sourceTree = ""; }; BF0C843C2EDF4EF3A7A2C64A /* app.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = app.svg; sourceTree = ""; }; BF0C84E11784B3B0900D0963 /* app.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = app.icns; sourceTree = ""; }; + BF0C86370093A080DD5974D8 /* convert_svg_to_png.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = convert_svg_to_png.sh; sourceTree = ""; }; BF0C87B913292EE53EDE4220 /* menubar-1.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = "menubar-1.svg"; sourceTree = ""; }; + BF0C884157B87BF0E17EF7F8 /* WindowControlView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WindowControlView.swift; sourceTree = ""; }; BF0C889529FF19620EDAC295 /* accessibility@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "accessibility@2x.png"; sourceTree = ""; }; BF0C88BF67CF4D71002A60EB /* menubar-1@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menubar-1@2x.png"; sourceTree = ""; }; BF0C88D6043B83B535BEAAA2 /* no */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = no; path = Localizable.strings; sourceTree = ""; }; @@ -140,6 +148,7 @@ BF0C8E54658B4DAEA0528200 /* menubar-3@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "menubar-3@2x.png"; sourceTree = ""; }; BF0C8F0D1F5E9980C2E1A073 /* no */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = no; path = InfoPlist.strings; sourceTree = ""; }; BF0C8F88F4326C82F16FD738 /* minimize.svg */ = {isa = PBXFileReference; lastKnownFileType = file.svg; path = minimize.svg; sourceTree = ""; }; + BF0C8F9CE1699644A22EAF2C /* close@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "close@2x.png"; sourceTree = ""; }; C0712B3BEA2B3780398C0999 /* Pods_alt_tab_macos.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_alt_tab_macos.framework; sourceTree = BUILT_PRODUCTS_DIR; }; D04BA015A45DE7AFDC9794FE /* Window.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Window.swift; sourceTree = ""; }; D04BA03200F5A8FC0CD03607 /* CGWindowID.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CGWindowID.swift; sourceTree = ""; }; @@ -162,7 +171,7 @@ D04BA123744B0C27E9F54B05 /* codesign_sparkle_embedded_apps.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = codesign_sparkle_embedded_apps.sh; sourceTree = ""; }; D04BA18724DC58FA95DB33DB /* Podfile.lock */ = {isa = PBXFileReference; lastKnownFileType = file.lock; path = Podfile.lock; sourceTree = ""; }; D04BA18B55AA6C9EE41985D0 /* Contributing.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Contributing.md; sourceTree = ""; }; - D04BA19E22F2B73DB785E5DB /* subset_fonticon.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = subset_fonticon.sh; sourceTree = ""; }; + D04BA19E22F2B73DB785E5DB /* subset_font.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = subset_font.sh; sourceTree = ""; }; D04BA1B438BF3E65044D1138 /* ControlsTab.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ControlsTab.swift; sourceTree = ""; }; D04BA1D80F4EEF2A91BAD29C /* release.config.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = release.config.js; sourceTree = ""; }; D04BA1DF8CAB2FAB7FE9244B /* ThumbnailFontIconView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThumbnailFontIconView.swift; sourceTree = ""; }; @@ -297,7 +306,7 @@ D04BACE22DC907F03D193075 /* GeneralTab.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GeneralTab.swift; sourceTree = ""; }; D04BACEE8D430B8CAAD8C4CD /* BoldLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BoldLabel.swift; sourceTree = ""; }; D04BAD1297730B191E96E7FE /* ThumbnailTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ThumbnailTitleView.swift; sourceTree = ""; }; - D04BAD19B495AC18AC782A39 /* fonticon_to_image.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = fonticon_to_image.sh; sourceTree = ""; }; + D04BAD19B495AC18AC782A39 /* convert_font_to_png.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = convert_font_to_png.sh; sourceTree = ""; }; D04BAD215A8F61F2D9952181 /* Introduction.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = Introduction.md; sourceTree = ""; }; D04BAD241A6928F45355B315 /* es */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.strings; name = es; path = Localizable.strings; sourceTree = ""; }; D04BAD2A5EFA477F1BC436B4 /* import_certificate_into_new_keychain.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = import_certificate_into_new_keychain.sh; sourceTree = ""; }; @@ -418,6 +427,9 @@ BF0C81C1B55A0519C3272B09 /* close.svg */, BF0C8F88F4326C82F16FD738 /* minimize.svg */, BF0C81B8A30416D774B5B60E /* fullscreen.svg */, + BF0C8F9CE1699644A22EAF2C /* close@2x.png */, + BF0C817D9C335EE4A0536601 /* minimize@2x.png */, + BF0C83BD867F6A874F9953C9 /* fullscreen@2x.png */, ); path = "window-controls"; sourceTree = ""; @@ -699,6 +711,7 @@ D04BA1DF8CAB2FAB7FE9244B /* ThumbnailFontIconView.swift */, D04BA258B56193958D60978A /* ThumbnailView.swift */, D04BAA998119CAA8B70A2B67 /* ThumbnailsView.swift */, + BF0C884157B87BF0E17EF7F8 /* WindowControlView.swift */, ); path = "main-window"; sourceTree = ""; @@ -723,7 +736,7 @@ D04BAD6700415D6F7C8B2BEE /* travis.sh */, D04BA81B25C166EFB3223639 /* extract_l10n_strings.sh */, D04BA4FB0047656BEA21F1BE /* codesign */, - D04BA19E22F2B73DB785E5DB /* subset_fonticon.sh */, + D04BA19E22F2B73DB785E5DB /* subset_font.sh */, D04BA48E6F24E0948C4CB4F7 /* import_l10n_strings_from_poeditor.sh */, D04BAA5ECAE8BB8F8656DEDF /* update_contributors.sh */, D04BAD65AA870A49D2F89DBC /* ensure_generated_files_are_up_to_date.sh */, @@ -731,8 +744,9 @@ D04BAAE6E6823304D66B74F8 /* update_website.sh */, D04BA7A758026814667273DC /* convert_iconset_to_icns.sh */, D04BA6ED38651224DB117A5A /* upload_symbols_to_appcenter.sh */, - D04BAD19B495AC18AC782A39 /* fonticon_to_image.sh */, + D04BAD19B495AC18AC782A39 /* convert_font_to_png.sh */, D04BA59FD487D0DEBBA66A94 /* createicns */, + BF0C86370093A080DD5974D8 /* convert_svg_to_png.sh */, ); path = scripts; sourceTree = ""; @@ -1120,6 +1134,9 @@ BF0C8C9CA44285E493918A74 /* menubar-3@2x.png in Resources */, BF0C829583ED47E458528F3A /* accessibility@2x.png in Resources */, BF0C8406805BDEC5B69E8803 /* screen-recording@2x.png in Resources */, + BF0C8477850829E15FD4DD43 /* close@2x.png in Resources */, + BF0C8CB668FFABBCA23880B6 /* minimize@2x.png in Resources */, + BF0C8F80281B50D57C95ECCF /* fullscreen@2x.png in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1252,6 +1269,7 @@ D04BADA3F2DAB820D6FC6E75 /* AppCenterApplication.m in Sources */, D04BAA16F21AC41A23DDA63D /* ControlsTab.swift in Sources */, D04BADE4DDF7597749FB13BD /* PreferencesWindow.swift in Sources */, + BF0C89DF22C7B7D0C27DA2A4 /* WindowControlView.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/resources/SF-Pro-Text-Regular.otf b/resources/SF-Pro-Text-Regular.otf index 010702f500093a5331bec617ee04d62c5af3c6aa..f8a76a751502a26bd310cd1707b3520207a5c56e 100644 GIT binary patch delta 3858 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 X1DgYEgzK=H9Ly4ctdM>je&+uHY`qqW delta 4142 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 YO8}u>@Hc?t_vX6&R{g&pZ4GMpKlm)8IRF3v diff --git a/resources/icons/window-controls/close@2x.png b/resources/icons/window-controls/close@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ad115dbee853cc376dab2e82f238dddd97a98708 GIT binary patch literal 1507 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 literal 0 HcmV?d00001 diff --git a/resources/icons/window-controls/minimize@2x.png b/resources/icons/window-controls/minimize@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4065bd44783a698dc62c4b597ba3683744a85961 GIT binary patch literal 1146 zcmV-=1cm#FP)v0dGPIlT;!6k33?Re2(Sy-07L=>g*(8o;%>yz z-1V;0_kz_tSDv)s?{9kc8mH$$PXNhe5_}&#D;T4wgE$uA7%CMdiU266$mMF%|M>Zn zw`TvBfvGD8vq92c0M1$~$!u0hr3KHdY&eRbTvkd&a7rGP3p?(PelF*5t2Qvd>+g-H zM>?}YrVZqYv1-OSC>Co*6s`qQd2|2U;}4%`U}B)>Wi{?mxr{>TJu+9UwS?++e2Q6Cq8 zdtdiPoV%HKkn!oz1A?WrT=yjm5Zg4vYrW9 zEGc1#!{~eUu|`L{G} zK>#z;3h3a@zR^z>&NY2zY&|(vQX3tMBK>)CvX(4QOR=Qn^NLd)4E_zzES_Js3;FZY zeZIfZ|5D&oIwN#;)NZe}5QZ>2t5hl|$oZXpqvw`e_t-W_6}dln=!7B{Mc9{4*E*R- zGqDWL)r!pATqAlvV0eGwJ72YdI=_7JQetbSaz@azKu^7yunENos0vPNwY^%c`B0G| zqg<*VwUt;?BRDb8eE{PfRiPJU56}+8z$`GX%5V~IX#1&=$<;pdKaU8O{#-jKN&o-= M07*qoM6N<$f|LpxmjD0& literal 0 HcmV?d00001 diff --git a/scripts/fonticon_to_image.sh b/scripts/convert_font_to_png.sh similarity index 100% rename from scripts/fonticon_to_image.sh rename to scripts/convert_font_to_png.sh diff --git a/scripts/convert_svg_to_png.sh b/scripts/convert_svg_to_png.sh new file mode 100755 index 00000000..c377b284 --- /dev/null +++ b/scripts/convert_svg_to_png.sh @@ -0,0 +1,27 @@ +#!/usr/bin/env bash + +set -exu + +# needed because of macOS SIP (see https://stackoverflow.com/a/35570229) +export DYLD_LIBRARY_PATH="$MAGICK_HOME/lib" + +currentDir="$(pwd)" +size=16 + +function convert() { + # magick convert \ + # -background none \ + # -density 144 \ + # -resize 24x24 \ + # "resources/icons/window-controls/$1.svg" \ + # "resources/icons/window-controls/$1-magik.png" + /Applications/Inkscape.app/Contents/Resources/bin/inkscape \ + -z \ + -w "$((size * 2))" -h "$((size * 2))" \ + "$currentDir/resources/icons/window-controls/$1.svg" \ + -e "$currentDir/resources/icons/window-controls/$1@2x.png" +} + +convert "close" +convert "fullscreen" +convert "minimize" diff --git a/scripts/subset_font.sh b/scripts/subset_font.sh new file mode 100755 index 00000000..6fdb5ed0 --- /dev/null +++ b/scripts/subset_font.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -exu + +"$(pipenv --venv)"/bin/pyftsubset resources/SF-Pro-Text-Regular-Full.otf \ + --output-file=resources/SF-Pro-Text-Regular.otf \ + --text="􀀁􀁎􀁌􀕧􀀸􀀺􀀼􀀾􀁀􀁂􀁄􀑱􀁆􀁈􀁊􀑳􀓵􀓶􀓷􀓸􀓹􀓺􀓻􀓼􀓽􀓾􀓿􀔀􀔁􀔂􀔃􀔄􀔅􀔆􀔇􀔈􀔉􀕬􀀹􀀻􀀽􀀿􀁁􀘘􀁃􀁅􀑲􀁇􀁉􀁋􀑴􀔔􀔕􀔖􀔗􀔘􀔙􀔚􀔛􀔜􀔝􀔞􀔟􀔠􀔡􀔢􀔣􀔤􀔥􀔦􀔧􀔨􀕭" diff --git a/scripts/subset_fonticon.sh b/scripts/subset_fonticon.sh deleted file mode 100755 index 42c5b168..00000000 --- a/scripts/subset_fonticon.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -exu - -"$(pipenv --venv)"/bin/pyftsubset resources/SF-Pro-Text-Regular-Full.otf \ - --output-file=resources/SF-Pro-Text-Regular.otf \ - --text="􀀁􀁑􀁏􀁍􀁎􀁌􀕧􀕬􀀸􀀺􀀼􀀾􀁀􀁂􀁄􀑱􀁆􀁈􀁊􀑳􀓵􀓶􀓷􀓸􀓹􀓺􀓻􀓼􀓽􀓾􀓿􀔀􀔁􀔂􀔃􀔄􀔅􀔆􀔇􀔈􀔉􀀹􀀻􀀽􀀿􀁁􀘘􀁃􀁅􀑲􀁇􀁉􀁋􀑴􀔔􀔕􀔖􀔗􀔘􀔙􀔚􀔛􀔜􀔝􀔞􀔟􀔠􀔡􀔢􀔣􀔤􀔥􀔦􀔧􀔨􀕭" diff --git a/src/api-wrappers/HelperExtensions.swift b/src/api-wrappers/HelperExtensions.swift index 91bb9f0c..50b2e885 100644 --- a/src/api-wrappers/HelperExtensions.swift +++ b/src/api-wrappers/HelperExtensions.swift @@ -158,4 +158,17 @@ extension NSImage { img.unlockFocus() return img } + + func tinted(_ tint: NSColor) -> NSImage { + let dimmed = copy() as! NSImage + let scaling = Screen.withMouse()?.backingScaleFactor ?? 1 + let scaledSize = NSSize(width: (size.width * scaling).rounded(), height: (size.height * scaling).rounded()) + dimmed.size = scaledSize + dimmed.lockFocus() + tint.set() + let imageRect = NSRect(origin: .zero, size: scaledSize) + imageRect.fill(using: .sourceAtop) + dimmed.unlockFocus() + return dimmed + } } diff --git a/src/logic/Screen.swift b/src/logic/Screen.swift index 7b196727..fd8efd02 100644 --- a/src/logic/Screen.swift +++ b/src/logic/Screen.swift @@ -14,7 +14,7 @@ class Screen { } } - private static func withMouse() -> NSScreen? { + static func withMouse() -> NSScreen? { return NSScreen.screens.first { NSMouseInRect(NSEvent.mouseLocation, $0.frame, false) } } diff --git a/src/ui/main-window/ThumbnailFontIconView.swift b/src/ui/main-window/ThumbnailFontIconView.swift index a45f4072..029f525f 100644 --- a/src/ui/main-window/ThumbnailFontIconView.swift +++ b/src/ui/main-window/ThumbnailFontIconView.swift @@ -9,9 +9,6 @@ enum Symbols: String { case circledStar = "􀕬" case filledCircledStar = "􀕭" case filledCircled = "􀀁" - case filledCircledMultiplySign = "􀁑" - case filledCircledMinusSign = "􀁏" - case filledCircledPlusSign = "􀁍" case filledCircledNumber0 = "􀀹" case filledCircledNumber10 = "􀔔" } diff --git a/src/ui/main-window/ThumbnailView.swift b/src/ui/main-window/ThumbnailView.swift index 860c1933..0601d0b8 100644 --- a/src/ui/main-window/ThumbnailView.swift +++ b/src/ui/main-window/ThumbnailView.swift @@ -10,9 +10,9 @@ class ThumbnailView: NSStackView { var hiddenIcon = ThumbnailFontIconView(.circledSlashSign) var spaceIcon = ThumbnailFontIconView(.circledNumber0) var dockLabelIcon = ThumbnailFilledFontIconView(ThumbnailFontIconView(.filledCircledNumber0, (Preferences.fontIconSize * 0.7).rounded(), NSColor(srgbRed: 1, green: 0.30, blue: 0.25, alpha: 1), nil), NSColor.white, true) - var closeIcon = ThumbnailFilledFontIconView(ThumbnailFontIconView(.filledCircledMultiplySign, Preferences.fontIconSize, NSColor(srgbRed: 1, green: 0.35, blue: 0.32, alpha: 1), nil), NSColor(srgbRed: 0.64, green: 0.03, blue: 0.02, alpha: 1)) - var minimizeIcon = ThumbnailFilledFontIconView(ThumbnailFontIconView(.filledCircledMinusSign, Preferences.fontIconSize, NSColor(srgbRed: 0.91, green: 0.75, blue: 0.16, alpha: 1), nil), NSColor(srgbRed: 0.71, green: 0.55, blue: 0.09, alpha: 1)) - var maximizeIcon = ThumbnailFilledFontIconView(ThumbnailFontIconView(.filledCircledPlusSign, Preferences.fontIconSize, NSColor(srgbRed: 0.32, green: 0.76, blue: 0.17, alpha: 1), nil), NSColor(srgbRed: 0.04, green: 0.39, blue: 0.02, alpha: 1)) + var closeIcon = WindowControlView("close", 16) + var minimizeIcon = WindowControlView("minimize", 16) + var maximizeIcon = WindowControlView("fullscreen", 16) var hStackView: NSStackView! var mouseUpCallback: (() -> Void)! var mouseMovedCallback: (() -> Void)! @@ -54,11 +54,11 @@ class ThumbnailView: NSStackView { thumbnail.addSubview(closeIcon, positioned: .above, relativeTo: nil) thumbnail.addSubview(minimizeIcon, positioned: .above, relativeTo: nil) thumbnail.addSubview(maximizeIcon, positioned: .above, relativeTo: nil) - let windowsControlSpacing = CGFloat(3) [closeIcon, minimizeIcon, maximizeIcon].forEach { - $0.topAnchor.constraint(equalTo: thumbnail.topAnchor, constant: 1).isActive = true + $0.topAnchor.constraint(equalTo: thumbnail.topAnchor, constant: 2).isActive = true } - closeIcon.leftAnchor.constraint(equalTo: thumbnail.leftAnchor).isActive = true + closeIcon.leftAnchor.constraint(equalTo: thumbnail.leftAnchor, constant: 3).isActive = true + let windowsControlSpacing = CGFloat(6) minimizeIcon.leftAnchor.constraint(equalTo: closeIcon.rightAnchor, constant: windowsControlSpacing).isActive = true maximizeIcon.leftAnchor.constraint(equalTo: minimizeIcon.rightAnchor, constant: windowsControlSpacing).isActive = true [closeIcon, minimizeIcon, maximizeIcon].forEach { $0.isHidden = true } @@ -192,11 +192,25 @@ class ThumbnailView: NSStackView { if !isHighlighted { mouseMovedCallback() } + hoverWindowControls() + } + + func hoverWindowControls() { + let controls = [closeIcon, minimizeIcon, maximizeIcon] + if let target = thumbnail.hitTest(convert(window!.convertPoint(fromScreen: NSEvent.mouseLocation), from: nil)), + target is NSImageView { + if let control = (controls.first { $0 == target }) { + control.hovered(true) + controls.filter { $0 != control }.forEach { $0.hovered(false) } + } else { + controls.forEach { $0.hovered(false) } + } + } } override func mouseUp(with event: NSEvent) { if event.clickCount >= 1 { - let target = thumbnail.hitTest(convert(event.locationInWindow, from: nil))?.superview + let target = thumbnail.hitTest(convert(event.locationInWindow, from: nil)) if target == closeIcon { window_!.close() } else if target == minimizeIcon { diff --git a/src/ui/main-window/WindowControlView.swift b/src/ui/main-window/WindowControlView.swift new file mode 100644 index 00000000..be5312cb --- /dev/null +++ b/src/ui/main-window/WindowControlView.swift @@ -0,0 +1,24 @@ +import Cocoa + +class WindowControlView: NSImageView { + var originalImage: NSImage! + var hoveredImage: NSImage! + var size: NSSize! + + convenience init(_ imageName: String, _ size_: Int) { + self.init() + translatesAutoresizingMaskIntoConstraints = false + size = NSSize(width: size_, height: size_) + let image = NSImage.initCopy(imageName) + image.size = size + originalImage = image + hoveredImage = image.tinted(.init(white: 0, alpha: 0.25)) + hovered(false) + } + + func hovered(_ isHovered: Bool) { + image = isHovered ? hoveredImage : originalImage + image!.size = size + frame.size = size + } +}