Cacao:在Rust中建立本机MacOS(和iOS)应用程序

2021-06-11 14:32:40

建立普通Apple Ecosystem外的本机MacOS应用程序有时是一个不那么ExpiuTastask。 Appkit,Catalyst和Swifui的转换生态系统 - 与文档相结合,与' SSSometimes不存在,或跨越多个操作系统版本,每个操作系统版本都有自己的Nuance -Makes,它令人棘手地知道你需要融入的东西。

我' ve verst的一种语言' t对此有一个很好的解决方案却是生锈。我发布了一个初始版本的可可,这是我努力在Rust中建立麦克斯(和iOS,见下文)应用程序。这篇文章展示了一点Cacao是它的工作原理,并包括关于GUI工作的一些意见。

我应该在进一步澄清一些东西。当我说Rust Hasn' t又有一个很好的解决方案,我的意思是那里有一个优雅的方式来制造生锈的麦克斯应用程序。有一连串的事先工作 - 其中一些可可使用。

Ssheldon的Objc箱子现在已经存在了几年,并且非常好的工作提供了一种用目标-c桥的方法。可可依赖于与东西的苹果方面弥合这一点。

delisa mason写了关于锈病的麦克斯应用程序,就像2016年一样,例子存储库仍然坚持下去。

核心基础箱子通常作为" Way"在锈病中构建麦斯科斯镜头应用程序。据我所知,这最初是为了帮助Mozilla和伺服。它'是一个很好的箱子,但我感觉到它'它不如那么简单,也没有公开一些有助于制作麦斯科斯乐园的模式"右和#34;

果味和objrs都尝试与东西的目标-c互相提供更好的互操作。既不是可被下巴使用的,但我觉得他们'无论如何,他们都是体面的读数。

这些都是自己的伟大作品,但他们都没有贡献我的感受是一个"本地"麦斯科斯API样式在铁锈。

在标准中构建MacOS应用程序时,传统方式(AppKit),您的主构建块是您的应用程序委托。这有效地,您可以从OS(通知,生命周期事件)接收变化的消息,然后相应地处理它们。上面的例子Don' t提供了一种简单的方法来做到这一点,并感受到非常程序。试图对麦斯科斯开发的谷物进行反对谷物经常变得非常令人讨厌,因此我将本机定义为能够复制预期的发育模式。

Let'查看一个基本的Swift MacOS窗口示例。请注意,我们在没有故事板或界面建设者时尚中这样做,以及#39; s生锈等同代码将在做什么;它完全公平地说,如果您'重新使用界面构建器的类型,这可能会更短。

导入Cocoa Import Foundation类AppDelegate:nsobject,nsapplicationdelegate {var窗口:nswindow? Func ApplicationDidFinishlaUnching(_ Anotification:通知){让框架= CGRECT(x:10.0,y:10.0,宽度:400.0,高度:400.0)让WIN = nswindow(ContentRect:Frame,StyleMask:[。CompleSizecontentView,。fullsizeContentView。 ,。全屏,。调整大小,。unifiedTitleandtoolbar,支持:。缓冲,推迟:True)获胜。标题="你好世界"赢 。 MakeKeyAndOrderFront(nil)窗口= win}} //只是为了在没有所有Xcode @main项的情况下运行应用程序。让德语= appdelegate()nsapplication。分享。删除=委托_ = nsapplicationmain(commandline。argc,commandline。unsafeargv)

所有的事情都考虑,那个' s的漂亮简洁 - 即使是目标-c版本也会更长时间!我注意到这里特别是ApplicationDidFinishLaunching(_ :)方法:这是一个委托方法,是我在Rust中所需内容的一个主要示例。用吉兰,我觉得它相当接近:

使用cacao :: macos :: {app,appdelegate};使用Cacao :: MacOS ::窗口::窗口; #[派生(默认)] struct basicapp {window:选项< window> for BasicApp {fn did_finish_launching(& self){let window = window :: default();窗户 。 set_minimum_content_size(400.,400.);窗户 。 set_title("您好世界!");窗户 。表演 ();自己 。窗口=一些(窗口); fn main(){app :: new(" com.hello.world",basicapp :: default())。跑步 (); }

在这里,我们粗略的是我们的Swift示例的情况大致相同,尽管能够利用默认的rust,但更加简洁。 App包装NSapplication,并腕表事件和方法调用到AppDelegate特性实现。对于麦克斯来说,支持的大多数NSApplicationDelegate方法和事件 - 尽管我已经到了包裹着NSNotification并将其传递给某种方法。拉出请求欢迎。 :)

从这里,你可以继续用Cacao,或者推迟到你选择的另一个框架,并只是依靠可卡洛的" Mac"件。事实上,每个Cacao控制都公开了一个公共objc属性,您可以直接锁定和消息传递。这使得能够使用其他生锈包装(例如,金属),所以你'重新锁定在任何关于可可的人。

RUDEN' T有一个内置于语言的课程的概念,而是更多地利用具有特质实现的组合式的方法。然而,许多现有的GUI模型是沉重的,并且与他们一起工作可以感觉到锈迹偏差。 GTK-RS提供了一些公用事业公司,用于与生锈侧的子类合作,但如果我们可以保留其组成的基于组成?

可可中的吉兰支持这一点。大多数小部件类型可以被声明两种方式之一:库存,您可以在其中调用它并设置您的属性,并将其视为正常的控件 - 或委派,在其中可以提供为给定小部件实现特性的结构。例如,可以通过这种方式构建视图类型:

这有效 - 你可以从这里建立一棵树,无论你想要的地方都会拍打它。如果我们这样做是委托模式,它看起来像这样:

#[派生(debug)] pub struct myview {handle:选项<查看> } illump viewdelegate for myview {fn did_load(& mut self,查看:查看){//自定义您的视图self。把手=一些(视图); } //您可以在此处实现进一步的方法来处理丢弃和下降,等等} //其他地方... view = view :: with(myview :: default());

我的一位朋友曾经告诉过我啤酒:"如果你走了多个沉重,你已经做了一些错误"多年来,我举行了这个角度,我觉得这种方法适合那个咒语 - 它感觉像一个子类,因为你有一个定位逻辑和控制设置的地方,实现事件处理程序等等 - 但是你可以进一步进入子类地狱。

作为i'编写这一点,可可是0.2.0。它将是0.1.0,但箱子有一点蹲下问题,所以0.1.0没有真正存在。

它目前支持足够的小部件可以使用摩托斯。您可以查看示例文件夹以查看更多。

iOS支持......它的一个演示中的更多信息,但是没有什么可以阻止被移植以外的控制。

我不期待任何人都会对自己说和#34;好的,在生锈和#34中写/重写麦斯科斯应用程序的时间;我希望Cacao永远不能像能够用SWIFT和Objective-C找到的祝福层和框架一样可用,我没有看到苹果生态系统开发商和生锈开发人员之间的交叉GUI工具是巨大的。

我认为它可以想到,有基于生锈的公用事业(脚本等),可能对GUI有用,但桥接是(坦率地)无聊的工作,并且在出现问题时令人沮丧。 Cacao在这种情况下很有用,因为它可以在不必离开生锈生态系统的情况下构建本机麦斯科群岛GUI。

只针对三大(Windows,MacOS,Gnome)。其他任何东西都可以支持社区。也许iOS和/或Android,如果努力是' t太签名。

提供超过基本控件使框架不会随着时间的推移。遵循网络模型并保持厨房槽的圆线,即使它又讨厌。长期可维护性和gt;一百万个小部件。

始终在每个控件上公开一个本机钩子,以便有人知道他们想要的东西。又名,当被问到时,就会走开。

我想WinSafe,GTK-RS和Cacao的一些组合可以实现这一目标。如果发生,我很高兴为此重新努力解决炼金术并使其成为社区的事情 - 这是我在建造一个锈的跨平台GUI的原始尝试,直到我被生活事件缺席。

关于中可的一个很酷的事情是,该方法也可以在iOS(以及,概述,TVOS)上工作。虽然支持与MacOS相比,支持是非常alpha,但您可以构建一个适当的iOS应用程序并运行它:

这实现了较新的UISCENE API,这意味着您应该有一个现代应用程序,它跨IOS和iPad运行良好(并且特别支持iPad多应用功能)。

一部分为什么我想推出0.2.0是为了社区使用。我很想看看人们喜欢它,无论是采用,等等。文档不完美的任何手段(我欢迎在此方面提取请求,虽然我也会继续下去它),但是我希望反馈推动它前进的反馈推动它的&#39。

在长(长)的术语中,我认为这样的框架将淡入背景,并成为像Rustui这样的东西的构建块(类似于Appkit / Uikit的Swifui)。这很好,如果是Cacao作为UI世代之间的桥梁,我认为这是一个胜利。