diff --git a/uppsrc/CtrlCore/cocotodo.txt b/uppsrc/CtrlCore/cocotodo.txt index 3f86a86dd..04bc70c80 100644 --- a/uppsrc/CtrlCore/cocotodo.txt +++ b/uppsrc/CtrlCore/cocotodo.txt @@ -1,8 +1,12 @@ sooner: +- .iml editor image kind switch + +- Ctrl+O does not work + - tooltip in package organizer is too small -- Esc does not work to close console area in theide +- Esc does not work to close console area in theide, nor Assist popup - lineedit d&d leaves artifacts (at I cursor) @@ -29,7 +33,7 @@ sooner: - Delete CocoDnD.cpp -> crash - bool SystemDraw::IsPaintingOp(const Rect& r) const -- download .scd files +- download .scd files (or put to bundle) * apple debugger diff --git a/uppsrc/ide/Builders/Builders.h b/uppsrc/ide/Builders/Builders.h index 9b513d0c7..41484ecfb 100644 --- a/uppsrc/ide/Builders/Builders.h +++ b/uppsrc/ide/Builders/Builders.h @@ -72,6 +72,7 @@ struct GccBuilder : CppBuilder { String CompilerName() const; String CmdLine(const String& package, const Package& pkg); void BinaryToObject(String objfile, CParser& binscript, String basedir, const String& package, const Package& pkg); + void CocoaAppBundle(); String Info_plist; // apple bundle Info.plist }; diff --git a/uppsrc/ide/Builders/Builders.upp b/uppsrc/ide/Builders/Builders.upp index 67d722b30..098175bc1 100644 --- a/uppsrc/ide/Builders/Builders.upp +++ b/uppsrc/ide/Builders/Builders.upp @@ -18,6 +18,7 @@ file MscBuilder.cpp, JavaBuilder.cpp, ScriptBuilder.cpp, + Cocoa.cpp, Android readonly separator, Android.h, AndroidProject.cpp, diff --git a/uppsrc/ide/Builders/Cocoa.cpp b/uppsrc/ide/Builders/Cocoa.cpp new file mode 100644 index 000000000..7225cdcc1 --- /dev/null +++ b/uppsrc/ide/Builders/Cocoa.cpp @@ -0,0 +1,88 @@ +#include "Builders.h" +#include +#include + +void GccBuilder::CocoaAppBundle() +{ + if(!HasFlag("OSX") || !HasFlag("GUI")) + return; + + String icns = GetFileFolder(GetFileFolder(target)) + "/Resources/icons.icns"; + RealizePath(icns); + Time icns_tm = Nvl(GetFileTime(icns), Time::Low()); + bool convert_icons = false; + + SortedVectorMap imgs; + for(FindFile ff(PackageDirectory(mainpackage) + "/icon*.png"); ff; ff.Next()) { + Image m = StreamRaster::LoadFileAny(ff.GetPath()); + Size sz = m.GetSize(); + if(sz.cx == sz.cy) { + imgs.Add(sz.cx, m); + PutVerbose("Found icon " << ff.GetName()); + if((Time)ff.GetLastWriteTime() >= icns_tm) + convert_icons = true; + } + } + if(imgs.GetCount() && convert_icons) { + String icons = AppendFileName(outdir, "icons.iconset"); + RealizeDir(icons); + PutConsole("Exporting bundle icons to " + icons); + + bool icons_dirty = false; + + for(String fn : { + "icon_16x16.png", + "icon_16x16@2x.png", + "icon_32x32.png", + "icon_32x32@2x.png", + "icon_128x128.png", + "icon_128x128@2x.png", + "icon_256x256.png", + "icon_256x256@2x.png", + "icon_512x512.png", + "icon_512x512@2x.png", + }) { + int n = atoi(~fn + strlen("icon_")); + if(fn.Find("@2x") >= 0) + n *= 2; + int q = imgs.FindLowerBound(n); + Image img = q >= 0 && q < imgs.GetCount() ? imgs[q] : imgs[imgs.GetCount() - 1]; + PutVerbose(String() << "Exporting " << fn << " from " + << img.GetSize().cx << "x" << img.GetSize().cx); + PNGEncoder().SaveFile(AppendFileName(icons, fn), Rescale(img, n, n)); + } + + Execute(String() << "iconutil --convert icns --output " << icns << " " << icons); + } + + if(IsNull(Info_plist)) { + Info_plist + << "\n" + << "\n" + << "\n" + << "\n" + << " CFBundleExecutable\n" + << " " << GetFileName(target) << "\n" + << " NSHighResolutionCapable\n" + << " True\n" + << " LSMinimumSystemVersion\n" + << " 10.13\n" + ; + if(imgs.GetCount()) + Info_plist + << " CFBundleIconFile\n" + << " icons.icns\n" + ; + Info_plist + << "\n" + << "\n" + ; + } + String Info_plist_path = GetFileFolder(GetFileFolder(target)) + "/Info.plist"; + if(LoadFile(Info_plist_path) != Info_plist) { + if(FileExists(Info_plist_path)) + Execute("defaults delete " + Info_plist_path); // Force MacOS to reload plist + SaveFile(Info_plist_path, Info_plist); + PutConsole("Saving " << Info_plist_path); + } +} diff --git a/uppsrc/ide/Builders/GccBuilder.cpp b/uppsrc/ide/Builders/GccBuilder.cpp index 0845a94da..86dbaeb5a 100644 --- a/uppsrc/ide/Builders/GccBuilder.cpp +++ b/uppsrc/ide/Builders/GccBuilder.cpp @@ -465,6 +465,7 @@ bool GccBuilder::Link(const Vector& linkfile, const String& linkoptions, return false; PutLinking(); int time = msecs(); + CocoaAppBundle(); for(int i = 0; i < linkfile.GetCount(); i++) if(GetFileTime(linkfile[i]) > targettime) { Vector lib; @@ -561,30 +562,6 @@ bool GccBuilder::Link(const Vector& linkfile, const String& linkoptions, bool error = false; CustomStep(".pre-link", Null, error); if(!error && Execute(lnk) == 0) { - if(HasFlag("OSX") && HasFlag("GUI")) { - if(IsNull(Info_plist)) - Info_plist - << "\n" - << "\n" - << "\n" - << "\n" - << " CFBundleExecutable\n" - << " " << GetFileName(target) << "\n" - << " NSHighResolutionCapable\n" - << " True\n" - << " LSMinimumSystemVersion\n" - << " 10.13\n" - << "\n" - << "\n" - ; - String Info_plist_path = GetFileFolder(GetFileFolder(target)) + "/Info.plist"; - if(LoadFile(Info_plist_path) != Info_plist) { - if(FileExists(Info_plist_path)) - Execute("defaults delete " + Info_plist_path); // Force MacOS to reload plist - SaveFile(Info_plist_path, Info_plist); - PutConsole("Saving " << Info_plist_path); - } - } CustomStep(".post-link", Null, error); PutConsole(String().Cat() << GetHostPath(target) << " (" << GetFileInfo(target).length << " B) linked in " << GetPrintTime(time)); @@ -595,6 +572,7 @@ bool GccBuilder::Link(const Vector& linkfile, const String& linkoptions, return false; } } + PutConsole(String().Cat() << GetHostPath(target) << " (" << GetFileInfo(target).length << " B) is up to date."); return true;