From 5bd215448d3f55518d816eeb0220a14326576ea3 Mon Sep 17 00:00:00 2001 From: Anton Litvinov Date: Thu, 21 Oct 2021 18:03:15 +0300 Subject: [PATCH] UI improvements (#11) * New layout to improve UX * Progress indicators for installation dialogue * Refine: runnable state and view related code, install step state and view related code --- .github/workflows/release.yml | 8 +- codesign.sh | 4 +- gobridge/go.sum | 13 +- gobridge/gobridge.go | 8 +- gobridge/interface.h | 23 ++- launcher.xcodeproj/project.pbxproj | 46 +++-- launcher/Indicator/StateView.h | 17 ++ launcher/Indicator/StateView.m | 65 ++++++ launcher/Indicator/StateView2.h | 19 ++ launcher/Indicator/StateView2.m | 74 +++++++ launcher/Label/Label.h | 2 +- launcher/Label/Label.m | 5 +- launcher/MainWindow.xib | 307 +++++++++++++++++------------ launcher/MainWindowDelegate.h | 30 ++- launcher/MainWindowDelegate.m | 103 ++++++---- launcher/Model.h | 2 + launcher/Model.m | 8 + launcher/NetworkingModal.xib | 16 ++ launcher/NetworkingModalDelegate.h | 1 + launcher/NetworkingModalDelegate.m | 18 +- launcher/utils.h | 3 + launcher/utils.m | 85 ++++++-- 22 files changed, 628 insertions(+), 229 deletions(-) create mode 100644 launcher/Indicator/StateView.h create mode 100644 launcher/Indicator/StateView.m create mode 100644 launcher/Indicator/StateView2.h create mode 100644 launcher/Indicator/StateView2.m diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7996583..877da18 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -24,7 +24,7 @@ jobs: git clone https://github.com/mysteriumnetwork/myst-launcher pushd myst-launcher git fetch --all --tags - git checkout tags/1.0.17 + git checkout tags/1.0.18 popd popd @@ -62,11 +62,11 @@ jobs: # security find-identity -p codesigning -s $KEY_CHAIN echo "Codesign" - /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp ./build/MysteriumLauncher/Mysterium\ Launcher.app/Contents/MacOS/Mysterium\ Launcher + /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp ./build/MysteriumLauncher/Mysterium\ Node\ Launcher.app/Contents/MacOS/Mysterium\ Node\ Launcher echo "Codesign dylib" - /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Launcher.app/Contents/Frameworks/gobridge.dylib + /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Node\ Launcher.app/Contents/Frameworks/gobridge.dylib echo "Codesign whole build" - /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Launcher.app/ + /usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Node\ Launcher.app/ # dmg hdiutil create -format UDZO -srcfolder build/MysteriumLauncher mysterium_launcher_macos_amd64.dmg diff --git a/codesign.sh b/codesign.sh index feec73e..0f0a30f 100755 --- a/codesign.sh +++ b/codesign.sh @@ -1,6 +1,6 @@ MACOS_CERTIFICATE_ID="(KPKW2HX458)" -/usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp ./build/MysteriumLauncher/Mysterium\ Launcher.app/Contents/MacOS/Mysterium\ Launcher -/usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Launcher.app/Contents/Frameworks/gobridge.dylib +/usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp ./build/MysteriumLauncher/Mysterium\ Node\ Launcher.app/Contents/MacOS/Mysterium\ Node\ Launcher +/usr/bin/codesign --force -s "$MACOS_CERTIFICATE_ID" --timestamp -o runtime ./build/MysteriumLauncher/Mysterium\ Node\ Launcher.app/Contents/Frameworks/gobridge.dylib #hdiutil create -format UDZO -srcfolder build/MysteriumLauncher mysterium_launcher_macos_amd64.dmg diff --git a/gobridge/go.sum b/gobridge/go.sum index b98ec6e..9db301f 100644 --- a/gobridge/go.sum +++ b/gobridge/go.sum @@ -63,7 +63,6 @@ github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAE github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= -github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= @@ -92,8 +91,6 @@ github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx2 github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= -github.com/cavaliercoder/grab v2.0.0+incompatible h1:wZHbBQx56+Yxjx2TCGDcenhh3cJn7cCLMfkEPmySTSE= -github.com/cavaliercoder/grab v2.0.0+incompatible/go.mod h1:tTBkfNqSBfuMmMBFaO2phgyhdYhiZQ/+iXCZDzcDsMI= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -328,6 +325,7 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/gonutz/w32 v1.0.0/go.mod h1:Rc/YP5K9gv0FW4p6X9qL3E7Y56lfMflEol1fLElfMW4= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -371,7 +369,6 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgf github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/hallazzang/syso v0.0.0-20190816135029-43d74b8c1725/go.mod h1:ux1CNzSbAGjD7eLxQxZ1IXHo9IRCJLJpydrUSwi4/+I= github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= @@ -390,7 +387,6 @@ github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6t github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/josephspurrier/goversioninfo v1.2.0/go.mod h1:AGP2a+Y/OVJZ+s6XM4IwFUpkETwvn0orYurY8qpw1+0= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= @@ -414,6 +410,7 @@ github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/lxn/walk v0.0.0-20210112085537-c389da54e794 h1:NVRJ0Uy0SOFcXSKLsS65OmI1sgCCfiDUPj+cwnH7GZw= github.com/lxn/walk v0.0.0-20210112085537-c389da54e794/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc= github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk= @@ -454,6 +451,7 @@ github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+ github.com/mysteriumnetwork/go-fileversion v1.0.0-fix1 h1:5hXvl45QKdd+IY9rVbFLnZJ7sVvzzhkvZHMcxQ16HKo= github.com/mysteriumnetwork/go-fileversion v1.0.0-fix1/go.mod h1:VM+SiWjSJROa/fvPsFV24bWoHcCvyXnI0mmwKv9dVjc= github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= +github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -584,9 +582,12 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= +github.com/tc-hib/winres v0.1.5/go.mod h1:pe6dOR40VOrGz8PkzreVKNvEKnlE8t4yR8A8naL+t7A= github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tryor/gdiplus v0.0.0-20200830101413-c570de9579b3/go.mod h1:TrDGUugAfbUWjSKyYBuUWpjK/A7pwedAB8x+cZWobzs= +github.com/tryor/winapi v0.0.0-20200525040926-cd87d62e2f9b/go.mod h1:NUZCLXgdFgm/L5ovQjuZxttpvHVGcRL+9lZ8N/KeBls= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= @@ -651,6 +652,7 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/image v0.0.0-20201208152932-35266b937fa6/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -916,6 +918,7 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= diff --git a/gobridge/gobridge.go b/gobridge/gobridge.go index 2e2aba9..ab1f68c 100644 --- a/gobridge/gobridge.go +++ b/gobridge/gobridge.go @@ -95,10 +95,10 @@ func sendState() { st.containerRunning = C.int(mod.StateContainer) // instllation state - st.checkVirt = C.bool(mod.CheckVirt) - st.checkDocker = C.bool(mod.CheckDocker) - st.downloadFiles = C.bool(mod.DownloadFiles) - st.installDocker = C.bool(mod.InstallDocker) + st.checkVirt = C.int(mod.CheckVirt) + st.checkDocker = C.int(mod.CheckDocker) + st.downloadFiles = C.int(mod.DownloadFiles) + st.installDocker = C.int(mod.InstallDocker) C.macSendState(&st) } diff --git a/gobridge/interface.h b/gobridge/interface.h index 949131b..6e51f57 100644 --- a/gobridge/interface.h +++ b/gobridge/interface.h @@ -9,10 +9,11 @@ typedef struct _NSState { int dockerRunning; int containerRunning; - bool checkVirt; - bool checkDocker; - bool downloadFiles; - bool installDocker; + // install steps + int checkVirt; + int checkDocker; + int downloadFiles; + int installDocker; } NSState; typedef struct _NSConfig { @@ -77,3 +78,17 @@ typedef enum { UIState_InstallError = -4, } UI_STATE; +typedef enum { + RunnableState_Unknown = 0, + RunnableState_Starting = 1, + RunnableState_Running = 2, + RunnableState_Installing = 3, +} RUNNABLE_STATE; + +// install step state +typedef enum { + StepState_None = 0, + StepState_Progress = 1, + StepState_Finished = 2, + StepState_Failed = 3, +} STEP_STATE; diff --git a/launcher.xcodeproj/project.pbxproj b/launcher.xcodeproj/project.pbxproj index a31aea1..b7418b9 100644 --- a/launcher.xcodeproj/project.pbxproj +++ b/launcher.xcodeproj/project.pbxproj @@ -21,6 +21,8 @@ 9A93390526EF6856004D9F30 /* Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 9AC8756F26C919D400A99070 /* Info.plist */; }; 9AAC6F7D27045B1400907866 /* UpgradeModal.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9AAC6F7C27045B1400907866 /* UpgradeModal.xib */; }; 9AAC6F8027045D3C00907866 /* UpgradeModalDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AAC6F7F27045D3C00907866 /* UpgradeModalDelegate.m */; }; + 9AC2415C2716C4F5008BB768 /* StateView.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AC2415B2716C4F5008BB768 /* StateView.m */; }; + 9AC2415F27181CD8008BB768 /* StateView2.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AC2415E27181CD8008BB768 /* StateView2.m */; }; 9AC8756B26C919D400A99070 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 9AC8756A26C919D400A99070 /* Assets.xcassets */; }; 9AC8756E26C919D400A99070 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = 9AC8756C26C919D400A99070 /* MainMenu.xib */; }; 9AC8757126C919D400A99070 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 9AC8757026C919D400A99070 /* main.m */; }; @@ -81,7 +83,11 @@ 9AAC6F7C27045B1400907866 /* UpgradeModal.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = UpgradeModal.xib; sourceTree = ""; }; 9AAC6F7E27045CF600907866 /* UpgradeModalDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UpgradeModalDelegate.h; sourceTree = ""; }; 9AAC6F7F27045D3C00907866 /* UpgradeModalDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UpgradeModalDelegate.m; sourceTree = ""; }; - 9AC8756426C919CB00A99070 /* Mysterium Launcher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mysterium Launcher.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + 9AC2415A2716C4F4008BB768 /* StateView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StateView.h; sourceTree = ""; }; + 9AC2415B2716C4F5008BB768 /* StateView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StateView.m; sourceTree = ""; }; + 9AC2415D27181C61008BB768 /* StateView2.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = StateView2.h; sourceTree = ""; }; + 9AC2415E27181CD8008BB768 /* StateView2.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = StateView2.m; sourceTree = ""; }; + 9AC8756426C919CB00A99070 /* Mysterium Node Launcher.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Mysterium Node Launcher.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 9AC8756726C919CC00A99070 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 9AC8756826C919CC00A99070 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 9AC8756A26C919D400A99070 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; @@ -144,6 +150,17 @@ path = Label; sourceTree = ""; }; + 9AC241522716C3AF008BB768 /* Indicator */ = { + isa = PBXGroup; + children = ( + 9AC2415A2716C4F4008BB768 /* StateView.h */, + 9AC2415B2716C4F5008BB768 /* StateView.m */, + 9AC2415D27181C61008BB768 /* StateView2.h */, + 9AC2415E27181CD8008BB768 /* StateView2.m */, + ); + path = Indicator; + sourceTree = ""; + }; 9AC8755B26C919CB00A99070 = { isa = PBXGroup; children = ( @@ -160,7 +177,7 @@ 9AC8756526C919CB00A99070 /* Products */ = { isa = PBXGroup; children = ( - 9AC8756426C919CB00A99070 /* Mysterium Launcher.app */, + 9AC8756426C919CB00A99070 /* Mysterium Node Launcher.app */, 9AC8757726C919D400A99070 /* launcherTests.xctest */, 9AC8758226C919D400A99070 /* launcherUITests.xctest */, ); @@ -170,6 +187,8 @@ 9AC8756626C919CB00A99070 /* launcher */ = { isa = PBXGroup; children = ( + 9AC241522716C3AF008BB768 /* Indicator */, + 9A8BE56826E8E62C0097A8A9 /* Label */, 9A725ABD26F0CC6C00E0A64A /* com.mysterium.launcher.plist */, 9AC8757026C919D400A99070 /* main.m */, 9A16EF8C26EA5EF20036447D /* utils.h */, @@ -191,7 +210,6 @@ 9AAC6F7C27045B1400907866 /* UpgradeModal.xib */, 9AAC6F7E27045CF600907866 /* UpgradeModalDelegate.h */, 9AAC6F7F27045D3C00907866 /* UpgradeModalDelegate.m */, - 9A8BE56826E8E62C0097A8A9 /* Label */, ); path = launcher; sourceTree = ""; @@ -217,9 +235,9 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 9AC8756326C919CB00A99070 /* Mysterium Launcher */ = { + 9AC8756326C919CB00A99070 /* Mysterium Node Launcher */ = { isa = PBXNativeTarget; - buildConfigurationList = 9AC8758B26C919D400A99070 /* Build configuration list for PBXNativeTarget "Mysterium Launcher" */; + buildConfigurationList = 9AC8758B26C919D400A99070 /* Build configuration list for PBXNativeTarget "Mysterium Node Launcher" */; buildPhases = ( 9AC8756026C919CB00A99070 /* Sources */, 9AC8756226C919CB00A99070 /* Resources */, @@ -230,9 +248,9 @@ ); dependencies = ( ); - name = "Mysterium Launcher"; + name = "Mysterium Node Launcher"; productName = launcher; - productReference = 9AC8756426C919CB00A99070 /* Mysterium Launcher.app */; + productReference = 9AC8756426C919CB00A99070 /* Mysterium Node Launcher.app */; productType = "com.apple.product-type.application"; }; 9AC8757626C919D400A99070 /* launcherTests */ = { @@ -306,7 +324,7 @@ projectDirPath = ""; projectRoot = ""; targets = ( - 9AC8756326C919CB00A99070 /* Mysterium Launcher */, + 9AC8756326C919CB00A99070 /* Mysterium Node Launcher */, 9AC8757626C919D400A99070 /* launcherTests */, 9AC8758126C919D400A99070 /* launcherUITests */, ); @@ -358,7 +376,9 @@ 9A16EF8B26EA5EB00036447D /* utils.m in Sources */, 9A63DEDB26E5D86E00594C0B /* NetworkingModalDelegate.m in Sources */, 9AAC6F8027045D3C00907866 /* UpgradeModalDelegate.m in Sources */, + 9AC2415F27181CD8008BB768 /* StateView2.m in Sources */, 9A63DEE026E605A800594C0B /* MainWindowDelegate.m in Sources */, + 9AC2415C2716C4F5008BB768 /* StateView.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -383,12 +403,12 @@ /* Begin PBXTargetDependency section */ 9AC8757926C919D400A99070 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 9AC8756326C919CB00A99070 /* Mysterium Launcher */; + target = 9AC8756326C919CB00A99070 /* Mysterium Node Launcher */; targetProxy = 9AC8757826C919D400A99070 /* PBXContainerItemProxy */; }; 9AC8758426C919D400A99070 /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = 9AC8756326C919CB00A99070 /* Mysterium Launcher */; + target = 9AC8756326C919CB00A99070 /* Mysterium Node Launcher */; targetProxy = 9AC8758326C919D400A99070 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ @@ -538,7 +558,7 @@ "$(PROJECT_DIR)/gobridge", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 1.0.17; + MARKETING_VERSION = 1.0.18; PRODUCT_BUNDLE_IDENTIFIER = com.mysterium.launcher; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -566,7 +586,7 @@ "$(PROJECT_DIR)/gobridge", "$(PROJECT_DIR)", ); - MARKETING_VERSION = 1.0.14; + MARKETING_VERSION = 1.0.18; PRODUCT_BUNDLE_IDENTIFIER = com.mysterium.launcher; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; @@ -657,7 +677,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 9AC8758B26C919D400A99070 /* Build configuration list for PBXNativeTarget "Mysterium Launcher" */ = { + 9AC8758B26C919D400A99070 /* Build configuration list for PBXNativeTarget "Mysterium Node Launcher" */ = { isa = XCConfigurationList; buildConfigurations = ( 9AC8758C26C919D400A99070 /* Debug */, diff --git a/launcher/Indicator/StateView.h b/launcher/Indicator/StateView.h new file mode 100644 index 0000000..82db103 --- /dev/null +++ b/launcher/Indicator/StateView.h @@ -0,0 +1,17 @@ +#import + + +// show color circle +@interface StateColorView : NSView { + NSRect originalBounds; + + // 0 clear + // 1 red + // 2 orange + // 3 green + int state; +} + +- (void)setState: (int)state; + +@end diff --git a/launcher/Indicator/StateView.m b/launcher/Indicator/StateView.m new file mode 100644 index 0000000..859b4da --- /dev/null +++ b/launcher/Indicator/StateView.m @@ -0,0 +1,65 @@ +#import "StateView.h" + + +@implementation StateColorView + +- (void)awakeFromNib +{ + originalBounds = [self bounds]; + [super awakeFromNib]; +} + +- (id)init +{ + [super init]; + return self; +} + +- (id)initWithFrame:(NSRect)frame { + self = [super initWithFrame:frame]; + if (self) { + originalBounds = [self bounds]; + } + return self; +} + +- (void)setFrameSize:(NSSize)newSize +{ + [super setFrameSize:newSize]; + originalBounds = [self bounds]; +} + +- (void)setState: (int)st { + state = st; + [self setNeedsDisplay:YES]; +} + +- (void)drawRect:(NSRect)rect { + + [NSGraphicsContext saveGraphicsState]; + + if (state != 0) { + NSRect r = NSMakeRect(originalBounds.origin.x, originalBounds.origin.y, originalBounds.size.width, originalBounds.size.height); + NSBezierPath* circlePath = [NSBezierPath bezierPath]; + [circlePath appendBezierPathWithOvalInRect: r]; + + switch (state) { + case 1: + [[NSColor systemRedColor] set]; + break; + case 2: + [[NSColor systemOrangeColor] set]; + break; + case 3: + [[NSColor systemGreenColor] set]; + break; + + default: + break; + } + [circlePath fill]; + } + [NSGraphicsContext restoreGraphicsState]; +} + +@end diff --git a/launcher/Indicator/StateView2.h b/launcher/Indicator/StateView2.h new file mode 100644 index 0000000..9453a7b --- /dev/null +++ b/launcher/Indicator/StateView2.h @@ -0,0 +1,19 @@ +#import + + +// show color circle or spinner +@interface StateView2 : NSView { + NSRect originalBounds; + + // 0 clear + // 1 red + // 2 orange + // 3 green + // -1 spinner + int state; + NSView *v; +} + +- (void)setState: (int)state; + +@end diff --git a/launcher/Indicator/StateView2.m b/launcher/Indicator/StateView2.m new file mode 100644 index 0000000..8c8170e --- /dev/null +++ b/launcher/Indicator/StateView2.m @@ -0,0 +1,74 @@ +#import "StateView2.h" +#import "StateView.h" + +@implementation StateView2 + +- (void)awakeFromNib +{ + originalBounds = [self bounds]; + [super awakeFromNib]; +} + +- (id)init +{ + return self; +} + +- (id)initWithFrame:(NSRect)frame { + self = [super initWithFrame:frame]; + if (self) { + originalBounds = [self bounds]; + } + return self; +} + +- (void)setFrameSize:(NSSize)newSize +{ + [super setFrameSize:newSize]; + [self setBounds:originalBounds]; +} + +- (void)setState: (int)st { + + if (state == st) { + return; + } + + state = st; + if (v != nil) { + [v removeFromSuperview]; + [v release]; + } + + switch (st) { + case -1: + { + NSRect r = NSMakeRect(0,0,16,16); + NSProgressIndicator *p = [[NSProgressIndicator alloc] initWithFrame:r]; + + [p startAnimation:p]; + [p setStyle:(NSProgressIndicatorStyle)1]; + [self addSubview:p]; + v = p; + }; + break; + + case 0: + case 1: + case 2: + case 3: + { + NSRect r = NSMakeRect(0,2,14,14); + StateColorView *vs = [[StateColorView alloc] initWithFrame:r]; + [self addSubview:vs]; + + [vs setState:st]; + v = vs; + }; + break; + + } + +} + +@end diff --git a/launcher/Label/Label.h b/launcher/Label/Label.h index 11dc6fe..dfa856e 100644 --- a/launcher/Label/Label.h +++ b/launcher/Label/Label.h @@ -9,7 +9,7 @@ @property (nonatomic, strong) NSCursor *cursor; -@property (retain)NSColor *color; +@property (retain) NSColor *color; //- (void) setHyperlinkText; @end diff --git a/launcher/Label/Label.m b/launcher/Label/Label.m index a1a6124..a3523b9 100644 --- a/launcher/Label/Label.m +++ b/launcher/Label/Label.m @@ -10,8 +10,11 @@ @implementation Label - (void)awakeFromNib { - self.color = [NSColor colorWithRed:0 green:0.4 blue:238.0/255 alpha:1]; [super awakeFromNib]; + + self.color = self.textColor; + self.cursor = [NSCursor pointingHandCursor]; + [self setObjectValue: self.objectValue]; } - (id)initWithFrame:(NSRect)frame diff --git a/launcher/MainWindow.xib b/launcher/MainWindow.xib index 784f0f0..7e96c27 100644 --- a/launcher/MainWindow.xib +++ b/launcher/MainWindow.xib @@ -9,20 +9,21 @@ - - - - + + + + - + + @@ -36,164 +37,196 @@ - + - - - - - - - - - - - + - + - + - + - + - + - + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - + - + - - + + - - + + - - + + - + + + + + + + + + + + + + + + + + + + + + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - - - + @@ -204,9 +237,45 @@ - + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + @@ -221,75 +290,59 @@ - - + - + - + - - - - - @@ -300,9 +353,9 @@ - + - + @@ -311,7 +364,7 @@ @@ -99,6 +103,18 @@ Gw + + + + + + + + + + + + diff --git a/launcher/NetworkingModalDelegate.h b/launcher/NetworkingModalDelegate.h index 8a21631..9591665 100644 --- a/launcher/NetworkingModalDelegate.h +++ b/launcher/NetworkingModalDelegate.h @@ -16,5 +16,6 @@ - (IBAction)cancelPressed:(id)sender; - (IBAction)okPressed:(id)sender; +- (IBAction)checkPressed:(id)sender; @end diff --git a/launcher/NetworkingModalDelegate.m b/launcher/NetworkingModalDelegate.m index 7154d88..36ba720 100644 --- a/launcher/NetworkingModalDelegate.m +++ b/launcher/NetworkingModalDelegate.m @@ -24,6 +24,7 @@ - (id)init [self.editPortRangeEnd setStringValue:[NSString stringWithFormat:@"%@", mod.portEnd]]; [self.checkBox setState: [mod.enablePortForwarding boolValue]]; + [self checkPressed:nil]; return self; } @@ -36,6 +37,14 @@ -(void)windowWillClose:(NSNotification *)notification [NSApp stopModalWithCode:NSModalResponseCancel]; } +- (IBAction)checkPressed:(id)sender +{ + BOOL y = (self.checkBox.state == NSControlStateValueOn); + + [self.editPortRangeBegin setEnabled:y]; + [self.editPortRangeEnd setEnabled:y]; +} + - (IBAction)cancelPressed:(id)sender { [self close]; @@ -60,8 +69,9 @@ - (IBAction)okPressed:(id)sender { int portBegin = [self.editPortRangeBegin intValue]; int portEnd = [self.editPortRangeEnd intValue]; - - if ([self.checkBox isEnabled]) { + BOOL y = (self.checkBox.state == NSControlStateValueOn); + + if (y) { bool valid = [self validatePortRange:portBegin :portEnd]; if (!valid) { NSAlert *alert = [[NSAlert alloc] init]; @@ -82,4 +92,8 @@ - (IBAction)okPressed:(id)sender [NSApp stopModalWithCode:NSModalResponseOK]; } +- (IBAction)linkInfoPressed:(id)sender +{ + [[NSWorkspace sharedWorkspace] openURL:[NSURL URLWithString: @"https://docs.mysterium.network/node-runners/troubleshooting/#port-forwarding"]]; +} @end diff --git a/launcher/utils.h b/launcher/utils.h index 75d6e96..c7d7a3f 100644 --- a/launcher/utils.h +++ b/launcher/utils.h @@ -8,4 +8,7 @@ @interface Utils : NSObject + (NSString*)getRunStateString:(NSNumber*)state; ++ (int)getStateViewStatus:(NSNumber*)state; ++ (int)getStateView2Status:(NSNumber*)state; + @end diff --git a/launcher/utils.m b/launcher/utils.m index 4bd8337..a38fe77 100644 --- a/launcher/utils.m +++ b/launcher/utils.m @@ -8,29 +8,88 @@ #import #import "utils.h" +#import "../gobridge/interface.h" @implementation Utils: NSObject -NSString *const RunState0 = @"-"; -NSString *const RunState1 = @"Starting.."; -NSString *const RunState2 = @"Running [OK]"; -NSString *const RunState3 = @"Installing.."; +NSString *const RunState0 = @"OFFLINE"; +NSString *const RunState1 = @"STARTING.."; +NSString *const RunState2 = @"ONLINE"; +NSString *const RunState3 = @"INSTALLING.."; NSString *const RunState_ = @"?"; + (NSString*)getRunStateString:(NSNumber*)state { switch ([state intValue]) { - case 0: - return RunState0; break; - case 1: - return RunState1; break; - case 2: - return RunState2; break; - case 3: - return RunState3; break; + case RunnableState_Unknown: + return RunState0; + break; + + case RunnableState_Starting: + return RunState1; + break; + + case RunnableState_Running: + return RunState2; + break; + + case RunnableState_Installing: + return RunState3; + break; + default: - return RunState_; break; + return RunState_; + break; } } + ++ (int)getStateViewStatus:(NSNumber*)state { + switch ([state intValue]) { + case RunnableState_Unknown: + return 1; + break; + + case RunnableState_Starting: + return 2; + break; + + case RunnableState_Running: + return 3; + break; + + case RunnableState_Installing: + return 2; + break; + + default: + return 0; + break; + } +} + ++ (int)getStateView2Status:(NSNumber*)state { + switch ([state intValue]) { + case StepState_None: + return 0; + break; + + case StepState_Progress: + return -1; + break; + + case StepState_Finished: + return 3; + break; + + case StepState_Failed: + return 1; + break; + + default: + return 0; + break; + } +} + @end