From d40a027fdcaf5dfca810fa218743e75436f011cb Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Fri, 14 Jun 2024 23:59:42 +0200 Subject: [PATCH] Refactored tabs management --- .../kotlin/com/jetpackduba/gitnuro/App.kt | 16 +++--- .../gitnuro/git/GetWorkspacePathUseCase.kt | 10 ++++ .../com/jetpackduba/gitnuro/ui/AppTab.kt | 2 + .../jetpackduba/gitnuro/ui/CommitChanges.kt | 2 +- .../kotlin/com/jetpackduba/gitnuro/ui/Menu.kt | 3 +- .../gitnuro/ui/RebaseInteractive.kt | 3 +- .../jetpackduba/gitnuro/ui/RepositoryOpen.kt | 26 +++++---- .../com/jetpackduba/gitnuro/ui/SidePanel.kt | 8 ++- .../com/jetpackduba/gitnuro/ui/TabsManager.kt | 3 +- .../gitnuro/ui/UncommitedChanges.kt | 2 +- .../ui/components/RepositoriesTabPanel.kt | 23 -------- .../gitnuro/ui/dialogs/AddSubmoduleDialog.kt | 3 +- .../gitnuro/ui/dialogs/CloneDialog.kt | 3 +- .../ui/dialogs/settings/SettingsDialog.kt | 5 +- .../com/jetpackduba/gitnuro/ui/log/Log.kt | 23 +++++--- .../gitnuro/viewmodels/TabViewModel.kt | 10 +++- .../gitnuro/viewmodels/TabViewModelsHolder.kt | 51 ----------------- .../viewmodels/TabViewModelsProvider.kt | 55 +++++++++++++++++++ 18 files changed, 130 insertions(+), 118 deletions(-) create mode 100644 src/main/kotlin/com/jetpackduba/gitnuro/git/GetWorkspacePathUseCase.kt delete mode 100644 src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt create mode 100644 src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsProvider.kt diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/App.kt b/src/main/kotlin/com/jetpackduba/gitnuro/App.kt index 5aee98c..b698f76 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/App.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/App.kt @@ -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, 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) + } } + } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/git/GetWorkspacePathUseCase.kt b/src/main/kotlin/com/jetpackduba/gitnuro/git/GetWorkspacePathUseCase.kt new file mode 100644 index 0000000..75e475d --- /dev/null +++ b/src/main/kotlin/com/jetpackduba/gitnuro/git/GetWorkspacePathUseCase.kt @@ -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 + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt index c886a5b..e634f92 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/AppTab.kt @@ -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 }, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/CommitChanges.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/CommitChanges.kt index 5dbec6b..6cb67d5 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/CommitChanges.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/CommitChanges.kt @@ -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?, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Menu.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Menu.kt index d49816d..571cce2 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/Menu.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/Menu.kt @@ -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, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt index b4093b7..21c6fdc 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RebaseInteractive.kt @@ -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 diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RepositoryOpen.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RepositoryOpen.kt index 765b405..23239ba 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/RepositoryOpen.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/RepositoryOpen.kt @@ -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 -> diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt index 176a7c9..ff4f8eb 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/SidePanel.kt @@ -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 }, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/TabsManager.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/TabsManager.kt index 0f6ae0f..bf475c2 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/TabsManager.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/TabsManager.kt @@ -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, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt index 0e1bbe8..88e92e7 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/UncommitedChanges.kt @@ -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, diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/RepositoriesTabPanel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/RepositoriesTabPanel.kt index d5685f2..9236bf4 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/RepositoriesTabPanel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/components/RepositoriesTabPanel.kt @@ -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 gitnuroViewModel(): T { - val tab = LocalTabScope.current - - return remember(tab) { - tab.tabViewModelsHolder.viewModels[T::class] as T - } -} - -@Composable -inline fun gitnuroDynamicViewModel(): T { - val tab = LocalTabScope.current - - return remember(tab) { - tab.tabViewModelsHolder.dynamicViewModel(T::class) as T - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/AddSubmoduleDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/AddSubmoduleDialog.kt index e726229..654b1e1 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/AddSubmoduleDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/AddSubmoduleDialog.kt @@ -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, ) { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt index 247e232..14063e2 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/CloneDialog.kt @@ -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, ) { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/settings/SettingsDialog.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/settings/SettingsDialog.kt index c443cb6..31cf936 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/settings/SettingsDialog.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/dialogs/settings/SettingsDialog.kt @@ -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 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 SettingDropDown( } } } - } } } diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt b/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt index c1a8556..e30e47e 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/ui/log/Log.kt @@ -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() }, ) diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt index fb53fb4..09095fd 100644 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModel.kt @@ -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, private val historyViewModelProvider: Provider, private val authorViewModelProvider: Provider, @@ -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) { diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt deleted file mode 100644 index c517cac..0000000 --- a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsHolder.kt +++ /dev/null @@ -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, - private val historyViewModelProvider: Provider, - private val authorViewModelProvider: Provider, - private val changeDefaultUpstreamBranchViewModelProvider: Provider, - private val submoduleDialogViewModelProvider: Provider, - private val signOffDialogViewModelProvider: Provider, -) { - 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") - } - } -} \ No newline at end of file diff --git a/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsProvider.kt b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsProvider.kt new file mode 100644 index 0000000..b86f9b5 --- /dev/null +++ b/src/main/kotlin/com/jetpackduba/gitnuro/viewmodels/TabViewModelsProvider.kt @@ -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, + private val historyViewModelProvider: Provider, + private val authorViewModelProvider: Provider, + private val changeDefaultUpstreamBranchViewModelProvider: Provider, + private val submoduleDialogViewModelProvider: Provider, + private val signOffDialogViewModelProvider: Provider, +) : 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() +} \ No newline at end of file