From ff97ef7b94b5ccfda1d8b98b0a7e21a779309fcc Mon Sep 17 00:00:00 2001 From: Jesse Duffield Date: Mon, 18 Mar 2019 20:44:33 +1100 Subject: support discarding unstaged changes --- pkg/gui/files_panel.go | 91 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 62 insertions(+), 29 deletions(-) (limited to 'pkg/gui/files_panel.go') diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index 843286e9e..deaffb83b 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -259,35 +259,6 @@ func (gui *Gui) handleAddPatch(g *gocui.Gui, v *gocui.View) error { return gui.Errors.ErrSubProcess } -func (gui *Gui) handleFileRemove(g *gocui.Gui, v *gocui.View) error { - file, err := gui.getSelectedFile(g) - if err != nil { - if err == gui.Errors.ErrNoFiles { - return nil - } - return err - } - var deleteVerb string - if file.Tracked { - deleteVerb = gui.Tr.SLocalize("checkout") - } else { - deleteVerb = gui.Tr.SLocalize("delete") - } - message := gui.Tr.TemplateLocalize( - "SureTo", - Teml{ - "deleteVerb": deleteVerb, - "fileName": file.Name, - }, - ) - return gui.createConfirmationPanel(g, v, strings.Title(deleteVerb)+" file", message, func(g *gocui.Gui, v *gocui.View) error { - if err := gui.GitCommand.RemoveFile(file); err != nil { - return gui.createErrorPanel(gui.g, err.Error()) - } - return gui.refreshFiles() - }, nil) -} - func (gui *Gui) handleIgnoreFile(g *gocui.Gui, v *gocui.View) error { file, err := gui.getSelectedFile(g) if err != nil { @@ -521,3 +492,65 @@ func (gui *Gui) handleSoftReset(g *gocui.Gui, v *gocui.View) error { return gui.refreshFiles() }, nil) } + +type discardOption struct { + handler func(fileName *commands.File) error + description string +} + +type discardOptionValue int + +// GetDisplayStrings is a function. +func (r *discardOption) GetDisplayStrings(isFocused bool) []string { + return []string{r.description} +} + +func (gui *Gui) handleCreateDiscardMenu(g *gocui.Gui, v *gocui.View) error { + file, err := gui.getSelectedFile(g) + if err != nil { + if err != gui.Errors.ErrNoFiles { + return err + } + return nil + } + + options := []*discardOption{ + { + description: gui.Tr.SLocalize("discardAllChanges"), + handler: func(file *commands.File) error { + if err := gui.GitCommand.DiscardAllFileChanges(file); err != nil { + return err + } + + return gui.refreshFiles() + }, + }, + { + description: gui.Tr.SLocalize("cancel"), + handler: func(file *commands.File) error { + return nil + }, + }, + } + + if file.HasStagedChanges && file.HasUnstagedChanges { + discardUnstagedChanges := &discardOption{ + description: gui.Tr.SLocalize("discardUnstagedChanges"), + handler: func(file *commands.File) error { + if err := gui.GitCommand.DiscardUnstagedFileChanges(file); err != nil { + return err + } + + return gui.refreshFiles() + }, + } + + options = append(options[:1], append([]*discardOption{discardUnstagedChanges}, options[1:]...)...) + } + + handleMenuPress := func(index int) error { + return options[index].handler(file) + } + + return gui.createMenu(file.Name, options, handleMenuPress) +} -- cgit v1.2.3