规范 - 使用 ctrl-S(或 cmd+s)保存文本输入

Spec - use ctrl-S (or cmd+s) to save text entry

SpTextPresenterSpTextInputFieldPresenter中有没有办法使用ctrl+S(或mac中的cmd+S)来保存文本输入?

旧的 pharo 组件(特别是旧规范,但这是从以前开始的,当组件构建在普通形态上时)允许通过按 <meta+S>(并使用 [=13 取消版本)来“接受”内容=]).
有没有办法在当前规范中复制此行为?

规范允许定义“默认”submit/reset 事件以提供旧行为。 好吧,这是一个简单的答案,但对某些用户来说有点复杂,因为他们期望旧的行为,而这不再像那样工作了。
所以首先我需要解释为什么旧行为不再可用:)
事实是,旧组件混合了不同的东西:它们是普通的 UI 小部件,同时也本着旧 MVC(模型视图控制器)的精神对容器进行建模。所以他们混合了模型(状态的保持)和视图(组件的显示)。出于这个原因,旧组件有一个初始状态,您需要 接受 该状态(您得到它,使用 <meta+S>)才能将其转移到模型部件。
这种责任组合导致不同的解决方法,例如添加 autoAccept 属性 以使组件复制其值并更改它。
在设计新版本的 Spec 时,我们决定不保留这种看起来很怪异并导致 API 不一致的行为,因此任何想要旧行为的人都需要在他们自己的组件中明确地实现它。

那么,如何改变旧行为?
毕竟这是个问题!

我们添加了两种方法以实现某种相同的功能:whenSubmitDo:whenResetDo:。这可以与 whenTextChangedDo: 组合到 mark/unmark 脏 属性.
这是一个示例,有点冗长,但也很容易创建您自己的具有预定义行为的组件并在您的应用程序中重用它们:

app := SpApplication new.

"If using Morphic"
app addStyleSheetFromString: '.application [
    .dirty [ Container { #borderColor: #red, #borderWidth: 1 } ],
    .notDirty [ Container { #borderColor: #transparent, #borderWidth: 1 } ]
]'.

"If using GTK (you need to choose one, both options are not possible at the same time)"
app useBackend: #Gtk.
app addCSSProviderFromString: '
.dirty { 
    border-color: red; 
    border-width: 1px; }
'.
 
presenter := SpPresenter new.
presenter application: app.

presenter layout: (SpBoxLayout newTopToBottom
    add: (textPresenter := presenter newTextInput) expand: false;
    yourself).

text := ''.
textPresenter 
    text: text;
    whenTextChangedDo: [ :aString | 
        aString = text
            ifTrue: [ textPresenter removeStyle: 'dirty'; addStyle: 'notDirty' ]
            ifFalse: [ textPresenter removeStyle: 'notDirty'; addStyle: 'dirty' ] ];
    whenSubmitDo: [ 
        text := textPresenter text.
        ('Submitted ', text) crTrace.
        textPresenter 
            removeStyle: 'dirty'; 
            addStyle: 'notDirty' ];
    whenResetDo: [ 
        textPresenter 
            text: text;
            removeStyle: 'dirty';
            addStyle: 'notDirty' ]. 

presenter asWindow 
    title: 'Example submit/reset text component';
    open

这将产生(使用 Gtk3 后端)此输出: