Refactored tabs management

This commit is contained in:
Abdelilah El Aissaoui 2024-06-14 23:59:42 +02:00
parent 38867ebb07
commit d40a027fdc
No known key found for this signature in database
GPG Key ID: 7587FC860F594869
18 changed files with 130 additions and 118 deletions

View File

@ -38,7 +38,6 @@ import com.jetpackduba.gitnuro.ui.AppTab
import com.jetpackduba.gitnuro.ui.TabsManager
import com.jetpackduba.gitnuro.ui.components.RepositoriesTabPanel
import com.jetpackduba.gitnuro.ui.components.TabInformation
import com.jetpackduba.gitnuro.ui.components.emptyTabInformation
import com.jetpackduba.gitnuro.ui.context_menu.AppPopupMenu
import com.jetpackduba.gitnuro.ui.dialogs.settings.ProxyType
import kotlinx.coroutines.launch
@ -52,8 +51,6 @@ import javax.inject.Inject
private const val TAG = "App"
val LocalTabScope = compositionLocalOf { emptyTabInformation() }
class App {
private val appComponent = DaggerAppComponent.create()
@ -260,7 +257,7 @@ class App {
}
)
TabContent(currentTab)
TabContent(tabs, currentTab)
}
}
}
@ -314,18 +311,19 @@ class App {
}
@Composable
private fun TabContent(currentTab: TabInformation?) {
private fun TabContent(tabs: List<TabInformation>, currentTab: TabInformation?) {
Box(
modifier = Modifier
.background(MaterialTheme.colors.background)
.fillMaxSize(),
) {
if (currentTab != null) {
val tabScope = arrayOf(LocalTabScope provides currentTab)
CompositionLocalProvider(values = tabScope) {
AppTab(currentTab.tabViewModel)
for (tab in tabs) {
if (tab == currentTab) {
AppTab(currentTab.tabViewModel)
}
}
}
}
}

View File

@ -0,0 +1,10 @@
package com.jetpackduba.gitnuro.git
import org.eclipse.jgit.api.Git
import javax.inject.Inject
class GetWorkspacePathUseCase @Inject constructor() {
operator fun invoke(git: Git): String {
return git.repository.workTree.absolutePath
}
}

View File

@ -60,6 +60,7 @@ fun AppTab(
var showSettingsDialog by remember { mutableStateOf(false) }
if (showSettingsDialog) {
SettingsDialog(
settingsViewModel = tabViewModel.tabViewModelsProvider.settingsViewModel,
onDismiss = { showSettingsDialog = false }
)
}
@ -68,6 +69,7 @@ fun AppTab(
if (showCloneDialog) {
CloneDialog(
cloneViewModel = tabViewModel.tabViewModelsProvider.cloneViewModel,
onClose = {
showCloneDialog = false
},

View File

@ -42,7 +42,7 @@ import org.eclipse.jgit.revwalk.RevCommit
@Composable
fun CommitChanges(
commitChangesViewModel: CommitChangesViewModel = gitnuroViewModel(),
commitChangesViewModel: CommitChangesViewModel,
selectedItem: SelectedItem.CommitBasedItem,
onDiffSelected: (DiffEntry) -> Unit,
diffSelected: DiffEntryType?,

View File

@ -29,7 +29,6 @@ import com.jetpackduba.gitnuro.extensions.handOnHover
import com.jetpackduba.gitnuro.extensions.ignoreKeyEvents
import com.jetpackduba.gitnuro.git.remote_operations.PullType
import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltip
import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel
import com.jetpackduba.gitnuro.ui.context_menu.*
import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
@ -37,7 +36,7 @@ import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
@Composable
fun Menu(
modifier: Modifier,
menuViewModel: MenuViewModel = gitnuroViewModel(),
menuViewModel: MenuViewModel,
onCreateBranch: () -> Unit,
onOpenAnotherRepository: () -> Unit,
onStashWithMessage: () -> Unit,

View File

@ -28,7 +28,6 @@ import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn
import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel
import com.jetpackduba.gitnuro.ui.drag_sorting.VerticalDraggableItem
import com.jetpackduba.gitnuro.ui.drag_sorting.rememberVerticalDragDropState
import com.jetpackduba.gitnuro.ui.drag_sorting.verticalDragContainer
@ -39,7 +38,7 @@ import com.jetpackduba.gitnuro.viewmodels.RebaseLine
@Composable
fun RebaseInteractive(
rebaseInteractiveViewModel: RebaseInteractiveViewModel = gitnuroViewModel(),
rebaseInteractiveViewModel: RebaseInteractiveViewModel,
) {
val rebaseState = rebaseInteractiveViewModel.rebaseState.collectAsState()
val rebaseStateValue = rebaseState.value

View File

@ -16,7 +16,6 @@ import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppConstants
import com.jetpackduba.gitnuro.LocalTabScope
import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.git.DiffEntryType
import com.jetpackduba.gitnuro.git.rebase.RebaseInteractiveState
@ -24,7 +23,6 @@ import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.ui.components.SecondaryButton
import com.jetpackduba.gitnuro.ui.components.TripleVerticalSplitPanel
import com.jetpackduba.gitnuro.ui.components.gitnuroDynamicViewModel
import com.jetpackduba.gitnuro.ui.dialogs.*
import com.jetpackduba.gitnuro.ui.diff.Diff
import com.jetpackduba.gitnuro.ui.log.Log
@ -97,7 +95,7 @@ fun RepositoryOpenPage(
)
} else if (showSignOffDialog) {
SignOffDialog(
viewModel = gitnuroDynamicViewModel(),
viewModel = tabViewModel.tabViewModelsProvider.signOffDialogViewModel,
onClose = { showSignOffDialog = false },
)
}
@ -122,9 +120,9 @@ fun RepositoryOpenPage(
}
}
) {
val currentTabInformation = LocalTabScope.current
Column(modifier = Modifier.weight(1f)) {
Menu(
menuViewModel = tabViewModel.tabViewModelsProvider.menuViewModel,
modifier = Modifier
.padding(
vertical = 4.dp
@ -133,10 +131,10 @@ fun RepositoryOpenPage(
onCreateBranch = { showNewBranchDialog = true },
onStashWithMessage = { showStashWithMessageDialog = true },
onOpenAnotherRepository = {
val repo = tabViewModel.openDirectoryPicker()
val repoToOpen = tabViewModel.openDirectoryPicker()
if (repo != null) {
tabViewModel.openAnotherRepository(repo, currentTabInformation)
if (repoToOpen != null) {
tabViewModel.openAnotherRepository(repoToOpen)
}
},
onQuickActions = { showQuickActionsDialog = true },
@ -257,10 +255,14 @@ fun MainContentView(
TripleVerticalSplitPanel(
modifier = Modifier.fillMaxSize(),
firstWidth = if(rebaseInteractiveState is RebaseInteractiveState.AwaitingInteraction) 0f else firstWidth,
firstWidth = if (rebaseInteractiveState is RebaseInteractiveState.AwaitingInteraction) 0f else firstWidth,
thirdWidth = thirdWidth,
first = {
SidePanel()
SidePanel(
tabViewModel.tabViewModelsProvider.sidePanelViewModel,
changeDefaultUpstreamBranchViewModel = { tabViewModel.tabViewModelsProvider.changeDefaultUpstreamBranchViewModel },
submoduleDialogViewModel = { tabViewModel.tabViewModelsProvider.submoduleDialogViewModel },
)
},
second = {
Box(
@ -268,7 +270,7 @@ fun MainContentView(
.fillMaxSize()
) {
if (rebaseInteractiveState == RebaseInteractiveState.AwaitingInteraction && diffSelected == null) {
RebaseInteractive()
RebaseInteractive(tabViewModel.tabViewModelsProvider.rebaseInteractiveViewModel)
} else if (blameState is BlameState.Loaded && !blameState.isMinimized) {
Blame(
filePath = blameState.filePath,
@ -282,8 +284,10 @@ fun MainContentView(
when (diffSelected) {
null -> {
Log(
logViewModel = tabViewModel.tabViewModelsProvider.logViewModel,
selectedItem = selectedItem,
repositoryState = repositoryState,
changeDefaultUpstreamBranchViewModel = { tabViewModel.tabViewModelsProvider.changeDefaultUpstreamBranchViewModel },
)
}
@ -321,6 +325,7 @@ fun MainContentView(
when (selectedItem) {
SelectedItem.UncommittedChanges -> {
UncommittedChanges(
statusViewModel = tabViewModel.tabViewModelsProvider.statusViewModel,
selectedEntryType = diffSelected,
repositoryState = repositoryState,
onStagedDiffEntrySelected = { diffEntry ->
@ -350,6 +355,7 @@ fun MainContentView(
is SelectedItem.CommitBasedItem -> {
CommitChanges(
commitChangesViewModel = tabViewModel.tabViewModelsProvider.commitChangesViewModel,
selectedItem = selectedItem,
diffSelected = diffSelected,
onDiffSelected = { diffEntry ->

View File

@ -24,6 +24,7 @@ import com.jetpackduba.gitnuro.ui.context_menu.*
import com.jetpackduba.gitnuro.ui.dialogs.AddSubmodulesDialog
import com.jetpackduba.gitnuro.ui.dialogs.EditRemotesDialog
import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog
import com.jetpackduba.gitnuro.viewmodels.ChangeDefaultUpstreamBranchViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.*
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.revwalk.RevCommit
@ -31,7 +32,9 @@ import org.eclipse.jgit.submodule.SubmoduleStatus
@Composable
fun SidePanel(
sidePanelViewModel: SidePanelViewModel = gitnuroViewModel(),
sidePanelViewModel: SidePanelViewModel,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
submoduleDialogViewModel: () -> SubmoduleDialogViewModel,
branchesViewModel: BranchesViewModel = sidePanelViewModel.branchesViewModel,
remotesViewModel: RemotesViewModel = sidePanelViewModel.remotesViewModel,
tagsViewModel: TagsViewModel = sidePanelViewModel.tagsViewModel,
@ -111,7 +114,7 @@ fun SidePanel(
if (branchToChangeUpstream != null) {
SetDefaultUpstreamBranchDialog(
viewModel = gitnuroDynamicViewModel(),
viewModel = changeDefaultUpstreamBranchViewModel(),
branch = branchToChangeUpstream,
onClose = { setBranchToChangeUpstream(null) }
)
@ -119,6 +122,7 @@ fun SidePanel(
if (showEditSubmodulesDialog) {
AddSubmodulesDialog(
viewModel = submoduleDialogViewModel(),
onCancel = {
showEditSubmodulesDialog = false
},

View File

@ -47,7 +47,8 @@ class TabsManager @Inject constructor(
_currentTab.value = latestSelectedTab ?: _tabsFlow.value.first()
}
fun addNewTabFromPath(path: String, selectTab: Boolean, tabToBeReplaced: TabInformation? = null) {
fun addNewTabFromPath(path: String, selectTab: Boolean, tabToBeReplacedPath: String? = null) {
val tabToBeReplaced = tabsFlow.value.firstOrNull { it.path == tabToBeReplacedPath }
val newTab = newAppTab(
tabName = mutableStateOf(""),
path = path,

View File

@ -53,7 +53,7 @@ import org.eclipse.jgit.lib.RepositoryState
@Composable
fun UncommittedChanges(
statusViewModel: StatusViewModel = gitnuroViewModel(),
statusViewModel: StatusViewModel,
selectedEntryType: DiffEntryType?,
repositoryState: RepositoryState,
onStagedDiffEntrySelected: (StatusEntry?) -> Unit,

View File

@ -23,7 +23,6 @@ import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.LocalTabScope
import com.jetpackduba.gitnuro.di.AppComponent
import com.jetpackduba.gitnuro.di.DaggerTabComponent
import com.jetpackduba.gitnuro.di.TabComponent
@ -37,7 +36,6 @@ import com.jetpackduba.gitnuro.ui.drag_sorting.HorizontalDraggableItem
import com.jetpackduba.gitnuro.ui.drag_sorting.horizontalDragContainer
import com.jetpackduba.gitnuro.ui.drag_sorting.rememberHorizontalDragDropState
import com.jetpackduba.gitnuro.viewmodels.TabViewModel
import com.jetpackduba.gitnuro.viewmodels.TabViewModelsHolder
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import javax.inject.Inject
@ -259,9 +257,6 @@ class TabInformation(
@Inject
lateinit var appStateManager: AppStateManager
@Inject
lateinit var tabViewModelsHolder: TabViewModelsHolder
var path = initialPath
private set
@ -299,21 +294,3 @@ class TabInformation(
}
fun emptyTabInformation() = TabInformation(mutableStateOf(""), "", {}, null)
@Composable
inline fun <reified T> gitnuroViewModel(): T {
val tab = LocalTabScope.current
return remember(tab) {
tab.tabViewModelsHolder.viewModels[T::class] as T
}
}
@Composable
inline fun <reified T> gitnuroDynamicViewModel(): T {
val tab = LocalTabScope.current
return remember(tab) {
tab.tabViewModelsHolder.dynamicViewModel(T::class) as T
}
}

View File

@ -29,12 +29,11 @@ import com.jetpackduba.gitnuro.keybindings.KeybindingOption
import com.jetpackduba.gitnuro.keybindings.matchesBinding
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.gitnuroDynamicViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SubmoduleDialogViewModel
@Composable
fun AddSubmodulesDialog(
viewModel: SubmoduleDialogViewModel = gitnuroDynamicViewModel(),
viewModel: SubmoduleDialogViewModel,
onCancel: () -> Unit,
onAccept: (repository: String, directory: String) -> Unit,
) {

View File

@ -27,13 +27,12 @@ import com.jetpackduba.gitnuro.theme.outlinedTextFieldColors
import com.jetpackduba.gitnuro.theme.textButtonColors
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel
import com.jetpackduba.gitnuro.viewmodels.CloneViewModel
import java.io.File
@Composable
fun CloneDialog(
cloneViewModel: CloneViewModel = gitnuroViewModel(),
cloneViewModel: CloneViewModel,
onClose: () -> Unit,
onOpenRepository: (File) -> Unit,
) {

View File

@ -17,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.extensions.handOnHover
import com.jetpackduba.gitnuro.managers.Error
import com.jetpackduba.gitnuro.repositories.DEFAULT_UI_SCALE
import com.jetpackduba.gitnuro.theme.*
@ -156,7 +157,7 @@ fun Proxy(settingsViewModel: SettingsViewModel) {
@Composable
fun SettingsDialog(
settingsViewModel: SettingsViewModel = gitnuroViewModel(),
settingsViewModel: SettingsViewModel,
onDismiss: () -> Unit,
) {
@ -560,6 +561,7 @@ fun <T> SettingDropDown(
onClick = { showThemeDropdown = true },
colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.background),
modifier = Modifier.width(180.dp)
.handOnHover()
) {
Text(
text = currentOption.optionName,
@ -591,7 +593,6 @@ fun <T> SettingDropDown(
}
}
}
}
}
}

View File

@ -50,8 +50,6 @@ import com.jetpackduba.gitnuro.theme.*
import com.jetpackduba.gitnuro.ui.SelectedItem
import com.jetpackduba.gitnuro.ui.components.AvatarImage
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn
import com.jetpackduba.gitnuro.ui.components.gitnuroDynamicViewModel
import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel
import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltip
import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltipPosition
import com.jetpackduba.gitnuro.ui.context_menu.*
@ -60,6 +58,7 @@ import com.jetpackduba.gitnuro.ui.dialogs.NewTagDialog
import com.jetpackduba.gitnuro.ui.dialogs.ResetBranchDialog
import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog
import com.jetpackduba.gitnuro.ui.resizePointerIconEast
import com.jetpackduba.gitnuro.viewmodels.ChangeDefaultUpstreamBranchViewModel
import com.jetpackduba.gitnuro.viewmodels.LogSearch
import com.jetpackduba.gitnuro.viewmodels.LogStatus
import com.jetpackduba.gitnuro.viewmodels.LogViewModel
@ -67,7 +66,6 @@ import kotlinx.coroutines.launch
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.lib.RepositoryState
import org.eclipse.jgit.revwalk.RevCommit
import kotlin.math.log
private val colors = listOf(
Color(0xFF42a5f5),
@ -99,16 +97,24 @@ private const val LOG_BOTTOM_PADDING = 80
)
@Composable
fun Log(
logViewModel: LogViewModel = gitnuroViewModel(),
logViewModel: LogViewModel,
selectedItem: SelectedItem,
repositoryState: RepositoryState,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
) {
val logStatusState = logViewModel.logStatus.collectAsState()
val logStatus = logStatusState.value
val showLogDialog by logViewModel.logDialog.collectAsState()
when (logStatus) {
is LogStatus.Loaded -> LogLoaded(logViewModel, logStatus, showLogDialog, selectedItem, repositoryState)
is LogStatus.Loaded -> LogLoaded(
logViewModel = logViewModel,
logStatus = logStatus,
showLogDialog = showLogDialog,
selectedItem = selectedItem,
repositoryState = repositoryState,
changeDefaultUpstreamBranchViewModel = changeDefaultUpstreamBranchViewModel,
)
LogStatus.Loading -> LogLoading()
}
}
@ -137,7 +143,8 @@ private fun LogLoaded(
logStatus: LogStatus.Loaded,
showLogDialog: LogDialog,
selectedItem: SelectedItem,
repositoryState: RepositoryState
repositoryState: RepositoryState,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
) {
val scope = rememberCoroutineScope()
val hasUncommittedChanges = logStatus.hasUncommittedChanges
@ -170,6 +177,7 @@ private fun LogLoaded(
logViewModel,
onResetShowLogDialog = { logViewModel.showDialog(LogDialog.None) },
showLogDialog = showLogDialog,
changeDefaultUpstreamBranchViewModel = changeDefaultUpstreamBranchViewModel,
)
Column(
@ -584,6 +592,7 @@ fun CommitsList(
fun LogDialogs(
logViewModel: LogViewModel,
onResetShowLogDialog: () -> Unit,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
showLogDialog: LogDialog,
) {
when (showLogDialog) {
@ -611,7 +620,7 @@ fun LogDialogs(
is LogDialog.ChangeDefaultBranch -> {
SetDefaultUpstreamBranchDialog(
viewModel = gitnuroDynamicViewModel(),
viewModel = changeDefaultUpstreamBranchViewModel(),
branch = showLogDialog.ref,
onClose = { onResetShowLogDialog() },
)

View File

@ -24,7 +24,6 @@ import com.jetpackduba.gitnuro.system.OpenUrlInBrowserUseCase
import com.jetpackduba.gitnuro.system.PickerType
import com.jetpackduba.gitnuro.ui.SelectedItem
import com.jetpackduba.gitnuro.ui.TabsManager
import com.jetpackduba.gitnuro.ui.components.TabInformation
import com.jetpackduba.gitnuro.updates.Update
import com.jetpackduba.gitnuro.updates.UpdatesRepository
import kotlinx.coroutines.*
@ -54,6 +53,7 @@ class TabViewModel @Inject constructor(
private val initLocalRepositoryUseCase: InitLocalRepositoryUseCase,
private val openRepositoryUseCase: OpenRepositoryUseCase,
private val openSubmoduleRepositoryUseCase: OpenSubmoduleRepositoryUseCase,
private val getWorkspacePathUseCase: GetWorkspacePathUseCase,
private val diffViewModelProvider: Provider<DiffViewModel>,
private val historyViewModelProvider: Provider<HistoryViewModel>,
private val authorViewModelProvider: Provider<AuthorViewModel>,
@ -70,6 +70,7 @@ class TabViewModel @Inject constructor(
private val sharedRepositoryStateManager: SharedRepositoryStateManager,
private val tabsManager: TabsManager,
private val tabScope: CoroutineScope,
val tabViewModelsProvider: TabViewModelsProvider,
) {
var firstPaneWidth = 220f
var thirdPaneWidth = 360f
@ -141,8 +142,11 @@ class TabViewModel @Inject constructor(
* instead of opening the repo in the same ViewModel we simply create a new tab with a new TabViewModel
* replacing the current tab
*/
fun openAnotherRepository(directory: String, current: TabInformation) {
tabsManager.addNewTabFromPath(directory, true, current)
fun openAnotherRepository(directory: String) = tabState.runOperation(
showError = true,
refreshType = RefreshType.NONE,
) { git ->
tabsManager.addNewTabFromPath(directory, true, getWorkspacePathUseCase(git))
}
fun openRepository(directory: String) {

View File

@ -1,51 +0,0 @@
package com.jetpackduba.gitnuro.viewmodels
import com.jetpackduba.gitnuro.di.TabScope
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SidePanelViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SubmoduleDialogViewModel
import javax.inject.Inject
import javax.inject.Provider
import kotlin.reflect.KClass
@TabScope
class TabViewModelsHolder @Inject constructor(
logViewModel: LogViewModel,
statusViewModel: StatusViewModel,
menuViewModel: MenuViewModel,
commitChangesViewModel: CommitChangesViewModel,
cloneViewModel: CloneViewModel,
settingsViewModel: SettingsViewModel,
sidePanelViewModel: SidePanelViewModel,
rebaseInteractiveViewModel: RebaseInteractiveViewModel,
// Dynamic VM
private val diffViewModelProvider: Provider<DiffViewModel>,
private val historyViewModelProvider: Provider<HistoryViewModel>,
private val authorViewModelProvider: Provider<AuthorViewModel>,
private val changeDefaultUpstreamBranchViewModelProvider: Provider<ChangeDefaultUpstreamBranchViewModel>,
private val submoduleDialogViewModelProvider: Provider<SubmoduleDialogViewModel>,
private val signOffDialogViewModelProvider: Provider<SignOffDialogViewModel>,
) {
val viewModels = mapOf(
logViewModel::class to logViewModel,
sidePanelViewModel::class to sidePanelViewModel,
statusViewModel::class to statusViewModel,
menuViewModel::class to menuViewModel,
commitChangesViewModel::class to commitChangesViewModel,
cloneViewModel::class to cloneViewModel,
settingsViewModel::class to settingsViewModel,
rebaseInteractiveViewModel::class to rebaseInteractiveViewModel,
)
// TODO Call this when required
fun dynamicViewModel(type: KClass<*>): Any {
return when (type) {
DiffViewModel::class -> diffViewModelProvider.get()
HistoryViewModel::class -> historyViewModelProvider.get()
AuthorViewModel::class -> authorViewModelProvider.get()
ChangeDefaultUpstreamBranchViewModel::class -> changeDefaultUpstreamBranchViewModelProvider.get()
SubmoduleDialogViewModel::class -> submoduleDialogViewModelProvider.get()
SignOffDialogViewModel::class -> signOffDialogViewModelProvider.get()
else -> throw NotImplementedError("View model provider not implemented")
}
}
}

View File

@ -0,0 +1,55 @@
package com.jetpackduba.gitnuro.viewmodels
import com.jetpackduba.gitnuro.di.TabScope
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SidePanelViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SubmoduleDialogViewModel
import javax.inject.Inject
import javax.inject.Provider
interface ITabViewModelsProvider {
val logViewModel: LogViewModel
val statusViewModel: StatusViewModel
val menuViewModel: MenuViewModel
val commitChangesViewModel: CommitChangesViewModel
val cloneViewModel: CloneViewModel
val settingsViewModel: SettingsViewModel
val sidePanelViewModel: SidePanelViewModel
val rebaseInteractiveViewModel: RebaseInteractiveViewModel
val diffViewModel: DiffViewModel
val historyViewModel: HistoryViewModel
val authorViewModel: AuthorViewModel
val changeDefaultUpstreamBranchViewModel: ChangeDefaultUpstreamBranchViewModel
val submoduleDialogViewModel: SubmoduleDialogViewModel
val signOffDialogViewModel: SignOffDialogViewModel
}
@TabScope
class TabViewModelsProvider @Inject constructor(
override val logViewModel: LogViewModel,
override val statusViewModel: StatusViewModel,
override val menuViewModel: MenuViewModel,
override val commitChangesViewModel: CommitChangesViewModel,
override val cloneViewModel: CloneViewModel,
override val settingsViewModel: SettingsViewModel,
override val sidePanelViewModel: SidePanelViewModel,
override val rebaseInteractiveViewModel: RebaseInteractiveViewModel,
private val diffViewModelProvider: Provider<DiffViewModel>,
private val historyViewModelProvider: Provider<HistoryViewModel>,
private val authorViewModelProvider: Provider<AuthorViewModel>,
private val changeDefaultUpstreamBranchViewModelProvider: Provider<ChangeDefaultUpstreamBranchViewModel>,
private val submoduleDialogViewModelProvider: Provider<SubmoduleDialogViewModel>,
private val signOffDialogViewModelProvider: Provider<SignOffDialogViewModel>,
) : ITabViewModelsProvider {
override val diffViewModel: DiffViewModel
get() = diffViewModelProvider.get()
override val historyViewModel: HistoryViewModel
get() = historyViewModelProvider.get()
override val authorViewModel: AuthorViewModel
get() = authorViewModelProvider.get()
override val changeDefaultUpstreamBranchViewModel: ChangeDefaultUpstreamBranchViewModel
get() = changeDefaultUpstreamBranchViewModelProvider.get()
override val submoduleDialogViewModel: SubmoduleDialogViewModel
get() = submoduleDialogViewModelProvider.get()
override val signOffDialogViewModel: SignOffDialogViewModel
get() = signOffDialogViewModelProvider.get()
}