Skip to content

Commit 6514811

Browse files
committed
refactor: implements QuickBarStateMachine to drive UI update of QuickBar
1 parent 1ccb23c commit 6514811

File tree

2 files changed

+62
-15
lines changed

2 files changed

+62
-15
lines changed

app/src/main/java/com/osfans/trime/ime/bar/QuickBar.kt

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -93,21 +93,17 @@ class QuickBar(
9393
TabUi(context)
9494
}
9595

96-
override fun onInputContextUpdate(ctx: RimeProto.Context) {
97-
if (ctx.composition.length > 0) {
98-
switchUiByState(State.Candidate)
99-
} else {
100-
switchUiByState(State.Always)
101-
}
96+
private val barStateMachine = QuickBarStateMachine.new {
97+
switchUiByState(it)
10298
}
10399

104-
enum class State {
105-
Always,
106-
Candidate,
107-
Tab,
100+
override fun onInputContextUpdate(ctx: RimeProto.Context) {
101+
barStateMachine.push(
102+
QuickBarStateMachine.TransitionEvent.CandidatesUpdated,
103+
QuickBarStateMachine.BooleanKey.CandidateEmpty to ctx.menu.candidates.isEmpty())
108104
}
109105

110-
private fun switchUiByState(state: State) {
106+
private fun switchUiByState(state: QuickBarStateMachine.State) {
111107
val index = state.ordinal
112108
if (view.displayedChild == index) return
113109
val new = view.getChildAt(index)
@@ -176,13 +172,11 @@ class QuickBar(
176172
override fun onWindowAttached(window: BoardWindow) {
177173
if (window is BoardWindow.BarBoardWindow) {
178174
window.onCreateBarView()?.let { tabUi.addExternal(it) }
179-
switchUiByState(State.Tab)
180-
} else {
181-
switchUiByState(State.Always)
175+
barStateMachine.push(QuickBarStateMachine.TransitionEvent.BarBoardWindowAttached)
182176
}
183177
}
184178

185179
override fun onWindowDetached(window: BoardWindow) {
186-
switchUiByState(State.Candidate)
180+
barStateMachine.push(QuickBarStateMachine.TransitionEvent.WindowDetached)
187181
}
188182
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* SPDX-License-Identifier: LGPL-2.1-or-later
3+
* SPDX-FileCopyrightText: Copyright 2021-2023 Fcitx5 for Android Contributors
4+
*/
5+
package com.osfans.trime.ime.bar
6+
7+
import com.osfans.trime.ime.bar.QuickBarStateMachine.BooleanKey.CandidateEmpty
8+
import com.osfans.trime.ime.bar.QuickBarStateMachine.State.Always
9+
import com.osfans.trime.ime.bar.QuickBarStateMachine.State.Candidate
10+
import com.osfans.trime.ime.bar.QuickBarStateMachine.State.Tab
11+
import com.osfans.trime.util.BuildTransitionEvent
12+
import com.osfans.trime.util.EventStateMachine
13+
import com.osfans.trime.util.TransitionBuildBlock
14+
15+
object QuickBarStateMachine {
16+
enum class State {
17+
Always,
18+
Candidate,
19+
Tab,
20+
}
21+
22+
enum class BooleanKey : EventStateMachine.BooleanStateKey {
23+
CandidateEmpty,
24+
}
25+
26+
enum class TransitionEvent(val builder: TransitionBuildBlock<State, BooleanKey>) :
27+
EventStateMachine.TransitionEvent<State, BooleanKey> by BuildTransitionEvent(builder) {
28+
CandidatesUpdated({
29+
from(Always) transitTo Candidate on (CandidateEmpty to false)
30+
from(Candidate) transitTo Always on (CandidateEmpty to true)
31+
}),
32+
BarBoardWindowAttached({
33+
from(Always) transitTo Tab
34+
from(Candidate) transitTo Tab
35+
}),
36+
WindowDetached({
37+
// candidate state has higher priority so here it goes first
38+
from(Tab) transitTo Candidate on (CandidateEmpty to false)
39+
from(Tab) transitTo Always
40+
}),
41+
}
42+
43+
fun new(block: (State) -> Unit) =
44+
EventStateMachine<State, TransitionEvent, BooleanKey>(
45+
initialState = Always,
46+
externalBooleanStates =
47+
mutableMapOf(
48+
CandidateEmpty to true,
49+
),
50+
).apply {
51+
onNewStateListener = block
52+
}
53+
}

0 commit comments

Comments
 (0)