Skip to content

Commit

Permalink
feat: WIP multi workspace
Browse files Browse the repository at this point in the history
  • Loading branch information
mistakenelf committed May 25, 2024
1 parent 83f2abb commit 6089da7
Show file tree
Hide file tree
Showing 8 changed files with 104 additions and 48 deletions.
2 changes: 1 addition & 1 deletion internal/tui/commands.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ var forbiddenExtensions = []string{
type statusMessageTimeoutMsg struct{}

func (m *model) openFileCmd() tea.Cmd {
selectedFile := m.filetree.GetSelectedItem()
selectedFile := m.filetree[m.activeWorkspace].GetSelectedItem()

if !selectedFile.IsDirectory {
m.resetViewports()
Expand Down
18 changes: 10 additions & 8 deletions internal/tui/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,16 @@ func (m *model) resetViewports() {
}

func (m *model) updateStatusBar() {
if m.filetree.GetSelectedItem().Name != "" {
if m.filetree[m.activeWorkspace].GetSelectedItem().Name != "" {
statusMessage :=
m.filetree.CurrentDirectory +
m.filetree[m.activeWorkspace].CurrentDirectory +
lipgloss.NewStyle().
Padding(0, 1).
Foreground(polish.Colors.Yellow500).
Render(m.filetree.GetSelectedItem().Details)
Render(m.filetree[m.activeWorkspace].GetSelectedItem().Details)

if m.filetree.StatusMessage != "" {
statusMessage = m.filetree.StatusMessage
if m.filetree[m.activeWorkspace].StatusMessage != "" {
statusMessage = m.filetree[m.activeWorkspace].StatusMessage
}

if m.code.StatusMessage != "" {
Expand Down Expand Up @@ -73,10 +73,11 @@ func (m *model) updateStatusBar() {
}

m.statusbar.SetContent(
m.filetree.GetSelectedItem().Name,
m.filetree[m.activeWorkspace].GetSelectedItem().Name,
statusMessage,
fmt.Sprintf("%d/%d", m.filetree.Cursor+1, m.filetree.GetTotalItems()),
fmt.Sprintf(m.filetree.GetSelectedItem().FileSize),
fmt.Sprintf("%d", m.activeWorkspace+1),
fmt.Sprintf("%d/%d", m.filetree[m.activeWorkspace].Cursor+1, m.filetree[m.activeWorkspace].GetTotalItems()),
fmt.Sprintf(m.filetree[m.activeWorkspace].GetSelectedItem().FileSize),
)
} else {
statusMessage := "Directory is empty"
Expand All @@ -88,6 +89,7 @@ func (m *model) updateStatusBar() {
m.statusbar.SetContent(
"N/A",
statusMessage,
fmt.Sprintf("%d", m.activeWorkspace+1),
fmt.Sprintf("%d/%d", 0, 0),
"FM",
)
Expand Down
2 changes: 1 addition & 1 deletion internal/tui/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
// Init intializes the UI.
func (m model) Init() tea.Cmd {
return tea.Batch(
m.filetree.Init(),
m.filetree[m.activeWorkspace].Init(),
m.secondaryFiletree.Init(),
textinput.Blink,
tea.SetWindowTitle("FM"),
Expand Down
14 changes: 12 additions & 2 deletions internal/tui/model.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ type Config struct {
}

type model struct {
filetree filetree.Model
filetree []filetree.Model
secondaryFiletree filetree.Model
csv csv.Model
help help.Model
Expand All @@ -60,6 +60,10 @@ type model struct {
directoryBeforeMove string
statusMessageLifetime time.Duration
statusMessageTimer *time.Timer
workspaces []int
activeWorkspace int
width int
height int
}

// New creates a new instance of the UI.
Expand Down Expand Up @@ -97,6 +101,10 @@ func New(cfg Config) model {
Foreground: cfg.Theme.StatusBarBarForegroundColor,
Background: cfg.Theme.StatusBarBarBackgroundColor,
},
statusbar.ColorConfig{
Foreground: cfg.Theme.StatusBarSelectedFileForegroundColor,
Background: cfg.Theme.StatusBarBarBackgroundColor,
},
statusbar.ColorConfig{
Foreground: cfg.Theme.StatusBarTotalFilesForegroundColor,
Background: cfg.Theme.StatusBarTotalFilesBackgroundColor,
Expand Down Expand Up @@ -151,7 +159,7 @@ func New(cfg Config) model {
helpModel.SetViewportDisabled(true)

return model{
filetree: filetreeModel,
filetree: []filetree.Model{filetreeModel},
secondaryFiletree: secondaryFiletree,
help: helpModel,
code: codeModel,
Expand All @@ -165,5 +173,7 @@ func New(cfg Config) model {
textinput: textinput.New(),
statusMessageLifetime: time.Second,
csv: csv.New(),
workspaces: []int{1},
activeWorkspace: 0,
}
}
78 changes: 49 additions & 29 deletions internal/tui/update.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {

return m, nil
case tea.WindowSizeMsg:
m.width = msg.Width
m.height = msg.Height
halfSize := msg.Width / 2
height := msg.Height - statusbar.Height

cmds = append(cmds, m.image.SetSizeCmd(halfSize, height))
cmds = append(cmds, m.markdown.SetSizeCmd(halfSize, height))
cmds = append(cmds, m.csv.SetSizeCmd(halfSize, height))

m.filetree.SetSize(halfSize, height-3)
m.filetree[m.activeWorkspace].SetSize(halfSize, height-3)
m.secondaryFiletree.SetSize(halfSize, height-3)
m.code.SetSize(halfSize, height)
m.pdf.SetSize(halfSize, height)
Expand All @@ -41,7 +43,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
case key.Matches(msg, m.keyMap.ForceQuit):
return m, tea.Quit
case key.Matches(msg, m.keyMap.Quit):
if m.filetree.State == filetree.IdleState {
if m.filetree[m.activeWorkspace].State == filetree.IdleState {
return m, tea.Quit
}
case key.Matches(msg, m.keyMap.OpenFile):
Expand All @@ -50,16 +52,16 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
case key.Matches(msg, m.keyMap.ResetState):
if m.state == showMoveState {
cmds = append(cmds, m.filetree.GetDirectoryListingCmd(m.directoryBeforeMove))
cmds = append(cmds, m.filetree[m.activeWorkspace].GetDirectoryListingCmd(m.directoryBeforeMove))
}

m.state = idleState
m.showTextInput = false
m.disableAllViewports()
m.resetViewports()
m.filetree.SetDisabled(false)
m.filetree[m.activeWorkspace].SetDisabled(false)
m.textinput.Blur()
m.filetree.State = filetree.IdleState
m.filetree[m.activeWorkspace].State = filetree.IdleState
m.secondaryFiletree.SetDisabled(true)
m.activePane = 0

Expand All @@ -68,17 +70,17 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {

m.textinput.Reset()
case key.Matches(msg, m.keyMap.MoveDirectoryItem):
if m.activePane == 0 && m.filetree.State == filetree.IdleState {
if m.activePane == 0 && m.filetree[m.activeWorkspace].State == filetree.IdleState {
m.activePane = (m.activePane + 1) % 2
m.directoryBeforeMove = m.filetree.CurrentDirectory
m.directoryBeforeMove = m.filetree[m.activeWorkspace].CurrentDirectory
m.state = showMoveState
m.filetree.State = filetree.MoveState
m.filetree.SetDisabled(true)
m.filetree[m.activeWorkspace].State = filetree.MoveState
m.filetree[m.activeWorkspace].SetDisabled(true)
m.secondaryFiletree.SetDisabled(false)
cmds = append(cmds, m.secondaryFiletree.GetDirectoryListingCmd(m.filetree.CurrentDirectory))
cmds = append(cmds, m.secondaryFiletree.GetDirectoryListingCmd(m.filetree[m.activeWorkspace].CurrentDirectory))
}
case key.Matches(msg, m.keyMap.ShowTextInput):
if m.activePane == 0 && m.filetree.State == filetree.IdleState {
if m.activePane == 0 && m.filetree[m.activeWorkspace].State == filetree.IdleState {
m.showTextInput = true
m.textinput.Focus()
m.disableAllViewports()
Expand All @@ -90,23 +92,23 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
case key.Matches(msg, m.keyMap.Submit):
switch {
case m.filetree.State == filetree.CreateFileState:
cmds = append(cmds, m.filetree.CreateFileCmd(m.textinput.Value()))
case m.filetree.State == filetree.CreateDirectoryState:
cmds = append(cmds, m.filetree.CreateDirectoryCmd(m.textinput.Value()))
case m.filetree.State == filetree.MoveState:
case m.filetree[m.activeWorkspace].State == filetree.CreateFileState:
cmds = append(cmds, m.filetree[m.activeWorkspace].CreateFileCmd(m.textinput.Value()))
case m.filetree[m.activeWorkspace].State == filetree.CreateDirectoryState:
cmds = append(cmds, m.filetree[m.activeWorkspace].CreateDirectoryCmd(m.textinput.Value()))
case m.filetree[m.activeWorkspace].State == filetree.MoveState:
cmds = append(
cmds,
m.filetree.MoveDirectoryItemCmd(
m.filetree.GetSelectedItem().Path,
m.secondaryFiletree.CurrentDirectory+"/"+m.filetree.GetSelectedItem().Name,
m.filetree[m.activeWorkspace].MoveDirectoryItemCmd(
m.filetree[m.activeWorkspace].GetSelectedItem().Path,
m.secondaryFiletree.CurrentDirectory+"/"+m.filetree[m.activeWorkspace].GetSelectedItem().Name,
),
)
case m.filetree.State == filetree.RenameState:
case m.filetree[m.activeWorkspace].State == filetree.RenameState:
cmds = append(cmds,
m.filetree.RenameDirectoryItemCmd(
m.filetree.GetSelectedItem().Path,
m.filetree.CurrentDirectory+"/"+m.textinput.Value(),
m.filetree[m.activeWorkspace].RenameDirectoryItemCmd(
m.filetree[m.activeWorkspace].GetSelectedItem().Path,
m.filetree[m.activeWorkspace].CurrentDirectory+"/"+m.textinput.Value(),
),
)
default:
Expand All @@ -123,11 +125,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.activePane = (m.activePane + 1) % 2

if m.activePane == 0 {
m.filetree.SetDisabled(false)
m.filetree[m.activeWorkspace].SetDisabled(false)
m.secondaryFiletree.SetDisabled(true)
m.disableAllViewports()
} else {
m.filetree.SetDisabled(true)
m.filetree[m.activeWorkspace].SetDisabled(true)

switch m.state {
case idleState:
Expand Down Expand Up @@ -163,17 +165,35 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
m.help.GotoBottom()
m.image.GotoBottom()
}
case key.Matches(msg, m.keyMap.WorkspaceOne):
m.workspaces = []int{1}
m.activeWorkspace = 0

return m, tea.Batch(cmds...)
case key.Matches(msg, m.keyMap.WorkspaceTwo):
filetreeModel := filetree.New(m.config.StartDir)
filetreeModel.SetTheme(m.config.Theme.SelectedTreeItemColor, m.config.Theme.UnselectedTreeItemColor)
filetreeModel.SetSelectionPath(m.config.SelectionPath)
filetreeModel.SetShowIcons(m.config.ShowIcons)

m.workspaces = append(m.workspaces, 2)
m.activeWorkspace = 1
m.filetree = append(m.filetree, filetreeModel)

cmds = append(cmds, m.filetree[m.activeWorkspace].Init())
m.filetree[m.activeWorkspace].SetSize(m.width/2, m.height-3)
return m, tea.Batch(cmds...)
}
}

if m.filetree.State == filetree.CreateDirectoryState ||
m.filetree.State == filetree.CreateFileState ||
m.filetree.State == filetree.RenameState {
if m.filetree[m.activeWorkspace].State == filetree.CreateDirectoryState ||
m.filetree[m.activeWorkspace].State == filetree.CreateFileState ||
m.filetree[m.activeWorkspace].State == filetree.RenameState {
m.textinput, cmd = m.textinput.Update(msg)
cmds = append(cmds, cmd)
}

m.filetree, cmd = m.filetree.Update(msg)
m.filetree[m.activeWorkspace], cmd = m.filetree[m.activeWorkspace].Update(msg)
cmds = append(cmds, cmd)

m.secondaryFiletree, cmd = m.secondaryFiletree.Update(msg)
Expand Down
2 changes: 1 addition & 1 deletion internal/tui/view.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import (

// View returns a string representation of the UI.
func (m model) View() string {
leftBox := m.filetree.View()
leftBox := m.filetree[m.activeWorkspace].View()
rightBox := m.help.View()

switch m.state {
Expand Down
4 changes: 4 additions & 0 deletions keys/keys.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type KeyMap struct {
GotoBottom key.Binding
MoveDirectoryItem key.Binding
RenameDirectoryItem key.Binding
WorkspaceOne key.Binding
WorkspaceTwo key.Binding
}

func DefaultKeyMap() KeyMap {
Expand Down Expand Up @@ -69,5 +71,7 @@ func DefaultKeyMap() KeyMap {
CreateFile: key.NewBinding(key.WithKeys("N"), key.WithHelp("N", "Create new file")),
CreateDirectory: key.NewBinding(key.WithKeys("M"), key.WithHelp("M", "Create new directory")),
RenameDirectoryItem: key.NewBinding(key.WithKeys("R"), key.WithHelp("R", "Rename directory items")),
WorkspaceOne: key.NewBinding(key.WithKeys("1"), key.WithHelp("1", "Switch To Workspace 1")),
WorkspaceTwo: key.NewBinding(key.WithKeys("2"), key.WithHelp("2", "Switch To Workspace 2")),
}
}
Loading

0 comments on commit 6089da7

Please sign in to comment.