This repository has been archived by the owner on Oct 11, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 4
/
file_undo_manager.go
122 lines (100 loc) · 3.22 KB
/
file_undo_manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* Copyright (C) 2015 Deepin Technology Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
**/
package operations
import (
"sync"
)
type CommandType int32
var _FileUndoManager *FileUndoManager = nil
var _FileUndoManagerCreator sync.Once
// TODO: compact command type
const (
CommandCopy CommandType = iota
CommandMove
CommandRename
CommandLink
CommandMkdir
CommandTrash
CommandPut
)
type FileUndoManager struct {
*SignalManager
}
const (
_UndoManagerSignalAvailable string = "available"
_UndoManagerSignalUndoJobFinished = "undo-job-finished"
_UndoManagerSignalUndoTextChanged = "undo-text-changed"
_UndoManagerSignalJobRecordingStarted = "job-recording-started"
_UndoManagerSignalJobRecordingFinished = "job-recording-finished"
)
func (m *FileUndoManager) emitAvailable(available bool) {
m.Emit(_UndoManagerSignalAvailable, func(f interface{}, args ...interface{}) {
fn := f.(func(bool))
fn(available)
})
}
func (m *FileUndoManager) ListenAvaiable(fn func(bool)) (func(), error) {
return m.ListenSignal(_UndoManagerSignalAvailable, fn)
}
func (m *FileUndoManager) emitUndoJobFinished() {
m.Emit(_UndoManagerSignalUndoJobFinished, func(f interface{}, args ...interface{}) {
fn := f.(func())
fn()
})
}
func (m *FileUndoManager) ListenUndoJobFinished(fn func()) (func(), error) {
return m.ListenSignal(_UndoManagerSignalUndoJobFinished, fn)
}
func (m *FileUndoManager) emitUndoJobTextChanged(text string) {
m.Emit(_UndoManagerSignalUndoTextChanged, func(f interface{}, args ...interface{}) {
fn := f.(func(string))
fn(text)
})
}
func (m *FileUndoManager) ListenUndoJobTextChanged(fn func(string)) (func(), error) {
return m.ListenSignal(_UndoManagerSignalUndoTextChanged, fn)
}
func (m *FileUndoManager) emitJobRecordingStarted(op CommandType) {
m.Emit(_UndoManagerSignalJobRecordingStarted, func(f interface{}, args ...interface{}) {
fn := f.(func(CommandType))
fn(op)
})
}
func (m *FileUndoManager) ListenJobRecordingStarted(fn func(CommandType)) (func(), error) {
return m.ListenSignal(_UndoManagerSignalJobRecordingStarted, fn)
}
func (m *FileUndoManager) emitJobRecordingFinished(op CommandType) {
m.Emit(_UndoManagerSignalJobRecordingFinished, func(f interface{}, args ...interface{}) {
fn := f.(func(CommandType))
fn(op)
})
}
func (m *FileUndoManager) ListenJobRecordingFinished(fn func(CommandType)) (func(), error) {
return m.ListenSignal(_UndoManagerSignalJobRecordingFinished, fn)
}
func (*FileUndoManager) RecordJob(op CommandType, srcURLs []string, destURL string, job interface{}) {
switch op {
case CommandMove, CommandCopy:
copyMoveJob := job.(*CopyMoveJob)
copyMoveJob.ListenCopyingMovingDone(func(srcURL string, destURL string) {
})
}
}
func (*FileUndoManager) Undo() {
}
func newFileUndoManager() *FileUndoManager {
undoManager := &FileUndoManager{}
return undoManager
}
func FileUndoManagerInstance() *FileUndoManager {
_FileUndoManagerCreator.Do(func() {
_FileUndoManager = newFileUndoManager()
})
return _FileUndoManager
}