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.TabsManager
import com.jetpackduba.gitnuro.ui.components.RepositoriesTabPanel import com.jetpackduba.gitnuro.ui.components.RepositoriesTabPanel
import com.jetpackduba.gitnuro.ui.components.TabInformation 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.context_menu.AppPopupMenu
import com.jetpackduba.gitnuro.ui.dialogs.settings.ProxyType import com.jetpackduba.gitnuro.ui.dialogs.settings.ProxyType
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -52,8 +51,6 @@ import javax.inject.Inject
private const val TAG = "App" private const val TAG = "App"
val LocalTabScope = compositionLocalOf { emptyTabInformation() }
class App { class App {
private val appComponent = DaggerAppComponent.create() private val appComponent = DaggerAppComponent.create()
@ -260,7 +257,7 @@ class App {
} }
) )
TabContent(currentTab) TabContent(tabs, currentTab)
} }
} }
} }
@ -314,19 +311,20 @@ class App {
} }
@Composable @Composable
private fun TabContent(currentTab: TabInformation?) { private fun TabContent(tabs: List<TabInformation>, currentTab: TabInformation?) {
Box( Box(
modifier = Modifier modifier = Modifier
.background(MaterialTheme.colors.background) .background(MaterialTheme.colors.background)
.fillMaxSize(), .fillMaxSize(),
) { ) {
if (currentTab != null) { if (currentTab != null) {
val tabScope = arrayOf(LocalTabScope provides currentTab) for (tab in tabs) {
if (tab == currentTab) {
CompositionLocalProvider(values = tabScope) {
AppTab(currentTab.tabViewModel) 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) } var showSettingsDialog by remember { mutableStateOf(false) }
if (showSettingsDialog) { if (showSettingsDialog) {
SettingsDialog( SettingsDialog(
settingsViewModel = tabViewModel.tabViewModelsProvider.settingsViewModel,
onDismiss = { showSettingsDialog = false } onDismiss = { showSettingsDialog = false }
) )
} }
@ -68,6 +69,7 @@ fun AppTab(
if (showCloneDialog) { if (showCloneDialog) {
CloneDialog( CloneDialog(
cloneViewModel = tabViewModel.tabViewModelsProvider.cloneViewModel,
onClose = { onClose = {
showCloneDialog = false showCloneDialog = false
}, },

View File

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

View File

@ -29,7 +29,6 @@ import com.jetpackduba.gitnuro.extensions.handOnHover
import com.jetpackduba.gitnuro.extensions.ignoreKeyEvents import com.jetpackduba.gitnuro.extensions.ignoreKeyEvents
import com.jetpackduba.gitnuro.git.remote_operations.PullType import com.jetpackduba.gitnuro.git.remote_operations.PullType
import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltip 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.ui.context_menu.*
import com.jetpackduba.gitnuro.viewmodels.MenuViewModel import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
@ -37,7 +36,7 @@ import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
@Composable @Composable
fun Menu( fun Menu(
modifier: Modifier, modifier: Modifier,
menuViewModel: MenuViewModel = gitnuroViewModel(), menuViewModel: MenuViewModel,
onCreateBranch: () -> Unit, onCreateBranch: () -> Unit,
onOpenAnotherRepository: () -> Unit, onOpenAnotherRepository: () -> Unit,
onStashWithMessage: () -> 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.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn 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.VerticalDraggableItem
import com.jetpackduba.gitnuro.ui.drag_sorting.rememberVerticalDragDropState import com.jetpackduba.gitnuro.ui.drag_sorting.rememberVerticalDragDropState
import com.jetpackduba.gitnuro.ui.drag_sorting.verticalDragContainer import com.jetpackduba.gitnuro.ui.drag_sorting.verticalDragContainer
@ -39,7 +38,7 @@ import com.jetpackduba.gitnuro.viewmodels.RebaseLine
@Composable @Composable
fun RebaseInteractive( fun RebaseInteractive(
rebaseInteractiveViewModel: RebaseInteractiveViewModel = gitnuroViewModel(), rebaseInteractiveViewModel: RebaseInteractiveViewModel,
) { ) {
val rebaseState = rebaseInteractiveViewModel.rebaseState.collectAsState() val rebaseState = rebaseInteractiveViewModel.rebaseState.collectAsState()
val rebaseStateValue = rebaseState.value 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.platform.LocalDensity
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppConstants import com.jetpackduba.gitnuro.AppConstants
import com.jetpackduba.gitnuro.LocalTabScope
import com.jetpackduba.gitnuro.extensions.handMouseClickable import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.git.DiffEntryType import com.jetpackduba.gitnuro.git.DiffEntryType
import com.jetpackduba.gitnuro.git.rebase.RebaseInteractiveState 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.keybindings.matchesBinding
import com.jetpackduba.gitnuro.ui.components.SecondaryButton import com.jetpackduba.gitnuro.ui.components.SecondaryButton
import com.jetpackduba.gitnuro.ui.components.TripleVerticalSplitPanel 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.dialogs.*
import com.jetpackduba.gitnuro.ui.diff.Diff import com.jetpackduba.gitnuro.ui.diff.Diff
import com.jetpackduba.gitnuro.ui.log.Log import com.jetpackduba.gitnuro.ui.log.Log
@ -97,7 +95,7 @@ fun RepositoryOpenPage(
) )
} else if (showSignOffDialog) { } else if (showSignOffDialog) {
SignOffDialog( SignOffDialog(
viewModel = gitnuroDynamicViewModel(), viewModel = tabViewModel.tabViewModelsProvider.signOffDialogViewModel,
onClose = { showSignOffDialog = false }, onClose = { showSignOffDialog = false },
) )
} }
@ -122,9 +120,9 @@ fun RepositoryOpenPage(
} }
} }
) { ) {
val currentTabInformation = LocalTabScope.current
Column(modifier = Modifier.weight(1f)) { Column(modifier = Modifier.weight(1f)) {
Menu( Menu(
menuViewModel = tabViewModel.tabViewModelsProvider.menuViewModel,
modifier = Modifier modifier = Modifier
.padding( .padding(
vertical = 4.dp vertical = 4.dp
@ -133,10 +131,10 @@ fun RepositoryOpenPage(
onCreateBranch = { showNewBranchDialog = true }, onCreateBranch = { showNewBranchDialog = true },
onStashWithMessage = { showStashWithMessageDialog = true }, onStashWithMessage = { showStashWithMessageDialog = true },
onOpenAnotherRepository = { onOpenAnotherRepository = {
val repo = tabViewModel.openDirectoryPicker() val repoToOpen = tabViewModel.openDirectoryPicker()
if (repo != null) { if (repoToOpen != null) {
tabViewModel.openAnotherRepository(repo, currentTabInformation) tabViewModel.openAnotherRepository(repoToOpen)
} }
}, },
onQuickActions = { showQuickActionsDialog = true }, onQuickActions = { showQuickActionsDialog = true },
@ -260,7 +258,11 @@ fun MainContentView(
firstWidth = if (rebaseInteractiveState is RebaseInteractiveState.AwaitingInteraction) 0f else firstWidth, firstWidth = if (rebaseInteractiveState is RebaseInteractiveState.AwaitingInteraction) 0f else firstWidth,
thirdWidth = thirdWidth, thirdWidth = thirdWidth,
first = { first = {
SidePanel() SidePanel(
tabViewModel.tabViewModelsProvider.sidePanelViewModel,
changeDefaultUpstreamBranchViewModel = { tabViewModel.tabViewModelsProvider.changeDefaultUpstreamBranchViewModel },
submoduleDialogViewModel = { tabViewModel.tabViewModelsProvider.submoduleDialogViewModel },
)
}, },
second = { second = {
Box( Box(
@ -268,7 +270,7 @@ fun MainContentView(
.fillMaxSize() .fillMaxSize()
) { ) {
if (rebaseInteractiveState == RebaseInteractiveState.AwaitingInteraction && diffSelected == null) { if (rebaseInteractiveState == RebaseInteractiveState.AwaitingInteraction && diffSelected == null) {
RebaseInteractive() RebaseInteractive(tabViewModel.tabViewModelsProvider.rebaseInteractiveViewModel)
} else if (blameState is BlameState.Loaded && !blameState.isMinimized) { } else if (blameState is BlameState.Loaded && !blameState.isMinimized) {
Blame( Blame(
filePath = blameState.filePath, filePath = blameState.filePath,
@ -282,8 +284,10 @@ fun MainContentView(
when (diffSelected) { when (diffSelected) {
null -> { null -> {
Log( Log(
logViewModel = tabViewModel.tabViewModelsProvider.logViewModel,
selectedItem = selectedItem, selectedItem = selectedItem,
repositoryState = repositoryState, repositoryState = repositoryState,
changeDefaultUpstreamBranchViewModel = { tabViewModel.tabViewModelsProvider.changeDefaultUpstreamBranchViewModel },
) )
} }
@ -321,6 +325,7 @@ fun MainContentView(
when (selectedItem) { when (selectedItem) {
SelectedItem.UncommittedChanges -> { SelectedItem.UncommittedChanges -> {
UncommittedChanges( UncommittedChanges(
statusViewModel = tabViewModel.tabViewModelsProvider.statusViewModel,
selectedEntryType = diffSelected, selectedEntryType = diffSelected,
repositoryState = repositoryState, repositoryState = repositoryState,
onStagedDiffEntrySelected = { diffEntry -> onStagedDiffEntrySelected = { diffEntry ->
@ -350,6 +355,7 @@ fun MainContentView(
is SelectedItem.CommitBasedItem -> { is SelectedItem.CommitBasedItem -> {
CommitChanges( CommitChanges(
commitChangesViewModel = tabViewModel.tabViewModelsProvider.commitChangesViewModel,
selectedItem = selectedItem, selectedItem = selectedItem,
diffSelected = diffSelected, diffSelected = diffSelected,
onDiffSelected = { diffEntry -> 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.AddSubmodulesDialog
import com.jetpackduba.gitnuro.ui.dialogs.EditRemotesDialog import com.jetpackduba.gitnuro.ui.dialogs.EditRemotesDialog
import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog
import com.jetpackduba.gitnuro.viewmodels.ChangeDefaultUpstreamBranchViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.* import com.jetpackduba.gitnuro.viewmodels.sidepanel.*
import org.eclipse.jgit.lib.Ref import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevCommit
@ -31,7 +32,9 @@ import org.eclipse.jgit.submodule.SubmoduleStatus
@Composable @Composable
fun SidePanel( fun SidePanel(
sidePanelViewModel: SidePanelViewModel = gitnuroViewModel(), sidePanelViewModel: SidePanelViewModel,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
submoduleDialogViewModel: () -> SubmoduleDialogViewModel,
branchesViewModel: BranchesViewModel = sidePanelViewModel.branchesViewModel, branchesViewModel: BranchesViewModel = sidePanelViewModel.branchesViewModel,
remotesViewModel: RemotesViewModel = sidePanelViewModel.remotesViewModel, remotesViewModel: RemotesViewModel = sidePanelViewModel.remotesViewModel,
tagsViewModel: TagsViewModel = sidePanelViewModel.tagsViewModel, tagsViewModel: TagsViewModel = sidePanelViewModel.tagsViewModel,
@ -111,7 +114,7 @@ fun SidePanel(
if (branchToChangeUpstream != null) { if (branchToChangeUpstream != null) {
SetDefaultUpstreamBranchDialog( SetDefaultUpstreamBranchDialog(
viewModel = gitnuroDynamicViewModel(), viewModel = changeDefaultUpstreamBranchViewModel(),
branch = branchToChangeUpstream, branch = branchToChangeUpstream,
onClose = { setBranchToChangeUpstream(null) } onClose = { setBranchToChangeUpstream(null) }
) )
@ -119,6 +122,7 @@ fun SidePanel(
if (showEditSubmodulesDialog) { if (showEditSubmodulesDialog) {
AddSubmodulesDialog( AddSubmodulesDialog(
viewModel = submoduleDialogViewModel(),
onCancel = { onCancel = {
showEditSubmodulesDialog = false showEditSubmodulesDialog = false
}, },

View File

@ -47,7 +47,8 @@ class TabsManager @Inject constructor(
_currentTab.value = latestSelectedTab ?: _tabsFlow.value.first() _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( val newTab = newAppTab(
tabName = mutableStateOf(""), tabName = mutableStateOf(""),
path = path, path = path,

View File

@ -53,7 +53,7 @@ import org.eclipse.jgit.lib.RepositoryState
@Composable @Composable
fun UncommittedChanges( fun UncommittedChanges(
statusViewModel: StatusViewModel = gitnuroViewModel(), statusViewModel: StatusViewModel,
selectedEntryType: DiffEntryType?, selectedEntryType: DiffEntryType?,
repositoryState: RepositoryState, repositoryState: RepositoryState,
onStagedDiffEntrySelected: (StatusEntry?) -> Unit, 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 androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.LocalTabScope
import com.jetpackduba.gitnuro.di.AppComponent import com.jetpackduba.gitnuro.di.AppComponent
import com.jetpackduba.gitnuro.di.DaggerTabComponent import com.jetpackduba.gitnuro.di.DaggerTabComponent
import com.jetpackduba.gitnuro.di.TabComponent 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.horizontalDragContainer
import com.jetpackduba.gitnuro.ui.drag_sorting.rememberHorizontalDragDropState import com.jetpackduba.gitnuro.ui.drag_sorting.rememberHorizontalDragDropState
import com.jetpackduba.gitnuro.viewmodels.TabViewModel import com.jetpackduba.gitnuro.viewmodels.TabViewModel
import com.jetpackduba.gitnuro.viewmodels.TabViewModelsHolder
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
@ -259,9 +257,6 @@ class TabInformation(
@Inject @Inject
lateinit var appStateManager: AppStateManager lateinit var appStateManager: AppStateManager
@Inject
lateinit var tabViewModelsHolder: TabViewModelsHolder
var path = initialPath var path = initialPath
private set private set
@ -299,21 +294,3 @@ class TabInformation(
} }
fun emptyTabInformation() = TabInformation(mutableStateOf(""), "", {}, null) 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.keybindings.matchesBinding
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.gitnuroDynamicViewModel
import com.jetpackduba.gitnuro.viewmodels.sidepanel.SubmoduleDialogViewModel import com.jetpackduba.gitnuro.viewmodels.sidepanel.SubmoduleDialogViewModel
@Composable @Composable
fun AddSubmodulesDialog( fun AddSubmodulesDialog(
viewModel: SubmoduleDialogViewModel = gitnuroDynamicViewModel(), viewModel: SubmoduleDialogViewModel,
onCancel: () -> Unit, onCancel: () -> Unit,
onAccept: (repository: String, directory: String) -> 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.theme.textButtonColors
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
import com.jetpackduba.gitnuro.ui.components.PrimaryButton import com.jetpackduba.gitnuro.ui.components.PrimaryButton
import com.jetpackduba.gitnuro.ui.components.gitnuroViewModel
import com.jetpackduba.gitnuro.viewmodels.CloneViewModel import com.jetpackduba.gitnuro.viewmodels.CloneViewModel
import java.io.File import java.io.File
@Composable @Composable
fun CloneDialog( fun CloneDialog(
cloneViewModel: CloneViewModel = gitnuroViewModel(), cloneViewModel: CloneViewModel,
onClose: () -> Unit, onClose: () -> Unit,
onOpenRepository: (File) -> Unit, onOpenRepository: (File) -> Unit,
) { ) {

View File

@ -17,6 +17,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.AppIcons import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.handMouseClickable import com.jetpackduba.gitnuro.extensions.handMouseClickable
import com.jetpackduba.gitnuro.extensions.handOnHover
import com.jetpackduba.gitnuro.managers.Error import com.jetpackduba.gitnuro.managers.Error
import com.jetpackduba.gitnuro.repositories.DEFAULT_UI_SCALE import com.jetpackduba.gitnuro.repositories.DEFAULT_UI_SCALE
import com.jetpackduba.gitnuro.theme.* import com.jetpackduba.gitnuro.theme.*
@ -156,7 +157,7 @@ fun Proxy(settingsViewModel: SettingsViewModel) {
@Composable @Composable
fun SettingsDialog( fun SettingsDialog(
settingsViewModel: SettingsViewModel = gitnuroViewModel(), settingsViewModel: SettingsViewModel,
onDismiss: () -> Unit, onDismiss: () -> Unit,
) { ) {
@ -560,6 +561,7 @@ fun <T> SettingDropDown(
onClick = { showThemeDropdown = true }, onClick = { showThemeDropdown = true },
colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.background), colors = ButtonDefaults.outlinedButtonColors(backgroundColor = MaterialTheme.colors.background),
modifier = Modifier.width(180.dp) modifier = Modifier.width(180.dp)
.handOnHover()
) { ) {
Text( Text(
text = currentOption.optionName, 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.SelectedItem
import com.jetpackduba.gitnuro.ui.components.AvatarImage import com.jetpackduba.gitnuro.ui.components.AvatarImage
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn 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.InstantTooltip
import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltipPosition import com.jetpackduba.gitnuro.ui.components.tooltip.InstantTooltipPosition
import com.jetpackduba.gitnuro.ui.context_menu.* 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.ResetBranchDialog
import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog import com.jetpackduba.gitnuro.ui.dialogs.SetDefaultUpstreamBranchDialog
import com.jetpackduba.gitnuro.ui.resizePointerIconEast import com.jetpackduba.gitnuro.ui.resizePointerIconEast
import com.jetpackduba.gitnuro.viewmodels.ChangeDefaultUpstreamBranchViewModel
import com.jetpackduba.gitnuro.viewmodels.LogSearch import com.jetpackduba.gitnuro.viewmodels.LogSearch
import com.jetpackduba.gitnuro.viewmodels.LogStatus import com.jetpackduba.gitnuro.viewmodels.LogStatus
import com.jetpackduba.gitnuro.viewmodels.LogViewModel 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.Ref
import org.eclipse.jgit.lib.RepositoryState import org.eclipse.jgit.lib.RepositoryState
import org.eclipse.jgit.revwalk.RevCommit import org.eclipse.jgit.revwalk.RevCommit
import kotlin.math.log
private val colors = listOf( private val colors = listOf(
Color(0xFF42a5f5), Color(0xFF42a5f5),
@ -99,16 +97,24 @@ private const val LOG_BOTTOM_PADDING = 80
) )
@Composable @Composable
fun Log( fun Log(
logViewModel: LogViewModel = gitnuroViewModel(), logViewModel: LogViewModel,
selectedItem: SelectedItem, selectedItem: SelectedItem,
repositoryState: RepositoryState, repositoryState: RepositoryState,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
) { ) {
val logStatusState = logViewModel.logStatus.collectAsState() val logStatusState = logViewModel.logStatus.collectAsState()
val logStatus = logStatusState.value val logStatus = logStatusState.value
val showLogDialog by logViewModel.logDialog.collectAsState() val showLogDialog by logViewModel.logDialog.collectAsState()
when (logStatus) { 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() LogStatus.Loading -> LogLoading()
} }
} }
@ -137,7 +143,8 @@ private fun LogLoaded(
logStatus: LogStatus.Loaded, logStatus: LogStatus.Loaded,
showLogDialog: LogDialog, showLogDialog: LogDialog,
selectedItem: SelectedItem, selectedItem: SelectedItem,
repositoryState: RepositoryState repositoryState: RepositoryState,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
) { ) {
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val hasUncommittedChanges = logStatus.hasUncommittedChanges val hasUncommittedChanges = logStatus.hasUncommittedChanges
@ -170,6 +177,7 @@ private fun LogLoaded(
logViewModel, logViewModel,
onResetShowLogDialog = { logViewModel.showDialog(LogDialog.None) }, onResetShowLogDialog = { logViewModel.showDialog(LogDialog.None) },
showLogDialog = showLogDialog, showLogDialog = showLogDialog,
changeDefaultUpstreamBranchViewModel = changeDefaultUpstreamBranchViewModel,
) )
Column( Column(
@ -584,6 +592,7 @@ fun CommitsList(
fun LogDialogs( fun LogDialogs(
logViewModel: LogViewModel, logViewModel: LogViewModel,
onResetShowLogDialog: () -> Unit, onResetShowLogDialog: () -> Unit,
changeDefaultUpstreamBranchViewModel: () -> ChangeDefaultUpstreamBranchViewModel,
showLogDialog: LogDialog, showLogDialog: LogDialog,
) { ) {
when (showLogDialog) { when (showLogDialog) {
@ -611,7 +620,7 @@ fun LogDialogs(
is LogDialog.ChangeDefaultBranch -> { is LogDialog.ChangeDefaultBranch -> {
SetDefaultUpstreamBranchDialog( SetDefaultUpstreamBranchDialog(
viewModel = gitnuroDynamicViewModel(), viewModel = changeDefaultUpstreamBranchViewModel(),
branch = showLogDialog.ref, branch = showLogDialog.ref,
onClose = { onResetShowLogDialog() }, onClose = { onResetShowLogDialog() },
) )

View File

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