Refactored tabs management
This commit is contained in:
parent
38867ebb07
commit
d40a027fdc
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
},
|
||||
|
@ -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?,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -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 ->
|
||||
|
@ -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
|
||||
},
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
}
|
@ -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,
|
||||
) {
|
||||
|
@ -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,
|
||||
) {
|
||||
|
@ -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(
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() },
|
||||
)
|
||||
|
@ -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) {
|
||||
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
@ -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()
|
||||
}
|
Loading…
Reference in New Issue
Block a user