View difference between Paste ID: 4auWPCSL and GmnT3Wz3
SHOW: | | - or go back to the newest paste.
1
--Width and Height of screen
2
local w, h = term.getSize()
3
--Show hidden files and directories
4
local hidden = false
5
--Current directory that is open
6-
local dir = "/data/"
6+
local dir = "/Hack/files/"
7-
local diskDir = "/disk/"
7+
local diskDir = "/disk/TEMP/files"
8
--Refers to the current selected file or directory
9
local slc = 0
10
--Indicates if program is running
11
local running = true
12
--If time is measured in 24 h time
13
local mTime = true
14
--Table with the files
15
local files = {}
16
--Scroll the files
17
local scroll = 0
18
--Name of file that is copied and if it should be moved
19
local copy = {}
20
 
21
--Set background- and text-colour
22
local function setColor(bc, tc)
23
    if not bc then bc = 32768 end
24
    if not tc then tc = 1 end
25
    term.setBackgroundColor(bc)
26
    term.setTextColor(tc)
27
end
28
 
29
--Print at left side on specific line
30
local function printLeft(y, str, bc, tc)
31
    setColor(bc, tc)
32
    term.setCursorPos(1, y)
33
    term.write(str)
34
end
35
 
36
--Print at right side of specific line
37
local function printRight(y, str, bc, tc)
38
    setColor(bc, tc)
39
    term.setCursorPos(w-#str+1, y)
40
    term.write(str)
41
end
42
 
43
--Print centred if specific line
44
local function printCentred(y, str, bc, tc)
45
    setColor(bc, tc)
46
    term.setCursorPos(w/2-#str/2, y)
47
    term.write(str)
48
end
49
 
50
--Print at specific point on screen
51
local function printHere(x, y, str, bc, tc)
52
    setColor(bc, tc)
53
    term.setCursorPos(x, y)
54
    term.write(str)
55
end
56
 
57
--Get time
58
local function getTime()
59
    return textutils.formatTime(os.time(), mTime)
60
end
61
 
62
--Draw time at point
63
local function printTime(x, y, bc, tc)
64
    local tTime = getTime()
65
    if x == "default" then x = w-#tTime+1 end
66
    printHere(x, y, tTime, bc, tc)
67
end
68
 
69
--Get the computer files
70
local function getFiles()
71
    files = {}
72
    if hidden then
73
        files = fs.list(dir)
74
    else
75
        local temp = fs.list(dir)
76
        for k, v in pairs(temp) do
77
            if v:sub(1, 1) ~= '.' then
78
                files[#files+1] = v
79
            end
80
        end
81
    end
82
end
83
 
84
--Draw message if an error or something that is not allowed occurs
85
local function drawError(msg)
86
    printCentred(h/2-1, string.rep(' ', #msg), 8)
87
    printCentred(h/2, msg, 128, 16384)
88
    printCentred(h/2+1, string.rep(' ', #msg), 8)
89
    sleep(1.5)
90
end
91
 
92
--Draw header of desktop
93
local function drawHeader()
94
    printHere(1, 1, string.rep(' ', w), 8, 8)
95
    printHere(1, h, string.rep(' ', w), 8, 8)
96
    printLeft(1, 'X', 16384, 32768)
97
    printHere(3, 1, dir, 8, 32768)
98
    printTime("default", h, 8, 32768)
99-
    if dir ~= "/data/" then
99+
    if dir ~= "/Hack/files/" then
100
        printLeft(h, "         <back> <home>", 8, 32768)
101
    end
102-
    if fs.exists("/disk/") then
102+
    if fs.exists("/H") then
103-
      if dir ~= "/disk/" then
103+
      if dir ~= "/disk/TEMP/files/" then
104
         printLeft(h, "<floppy>", 8, 32768)
105
	  end
106
	end
107
    if copy[1] then
108
        printRight(1, "copiato: "..copy[1]..copy[2], 8, 32768)
109
    end
110
    for i = 2, h-1 do
111
        if i == 2 then
112
            printRight(i, '^', 1, 32768)
113
        elseif i == h-1 then
114
            printRight(i, 'v', 1, 32768)
115
        else
116
            printRight(i, ' ', 1, 32768)
117
        end
118
    end
119
end
120
 
121
--Draw file menu
122
local function drawMenu()
123
    for i = 2, h-1 do
124
        printHere(w-11, i, "           ", 2048, 1)
125
    end
126
    if slc == 0 then
127
        if hidden then
128
            printHere(w-11, 5, "Nascondi File", 2048, 1)
129
        else
130
            printHere(w-11, 5, " Vedi File", 2048, 1)
131
        end
132
        if copy[1] then
133
            printHere(w-11, 6, " De-Copia   ", 2048, 1)
134
        end
135
        printHere(w-11, 2, " Nuovo File  ", 2048, 1)
136
        printHere(w-11, 3, " Nuova Dir   ", 2048, 1)
137
        printHere(w-11, 4, " Copia     ", 2048, 1)
138
    elseif slc > 0 then
139
        if fs.isDir(dir..files[slc]) then
140
            printHere(w-11, 2, " Apri      ", 2048, 1)
141
        else
142
            printHere(w-11, 2, " Esegui       ", 2048, 1)
143
            printHere(w-11, 8, " Modifica      ", 2048, 1)
144
        end
145
        printHere(w-11, 3, " Deseleziona  ", 2048, 1)
146
        printHere(w-11, 4, " Rinonima    ", 2048, 1)
147
        printHere(w-11, 5, " Copia      ", 2048, 1)
148
        printHere(w-11, 6, " Taglia       ", 2048, 1)
149
        printHere(w-11, 7, " Rimuovi    ", 2048, 1)
150
    end
151
end
152
 
153
--Click the options in the file menu
154
local function clickMenu(event)
155
    if slc == 0 then
156
        if event[1] == "mouse_click" then
157
            if event[3] >= w-11 and event[3] <= w-1 and event[4] == 2 then
158
                printHere(w-11, 2, "           ", 2048, 1)
159
                term.setCursorPos(w-11, 2)
160
                local nName = io.read()
161
                if nName ~= "" then
162
                    if fs.exists(dir..nName) then
163
                        drawError("Il file esiste di gia'")
164
                    else
165
                        local f = io.open(dir..nName, 'w')
166
                        f:close()
167
                    end
168
                end
169
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 3 then
170
                printHere(w-11, 3, "           ", 2048, 1)
171
                term.setCursorPos(w-11, 3)
172
                local nName = io.read()
173
                if nName ~= "" then
174
                    if fs.exists(dir..nName) then
175
                        drawError("c'e' gia la cartella")
176
                    else
177
                        fs.makeDir(dir..nName)
178
                    end
179
                end
180
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 4 then
181
                if copy[1] then
182
                    local problem = false
183
                    if dir == copy[1]..copy[2]..'/' then problem = true end
184
                    if copy[3] == "copy" and not problem then
185
                        if fs.exists(dir..copy[2]) then
186
                            drawError("il path esiste di gia")
187
                        else
188
                            fs.copy(copy[1]..copy[2], dir..copy[2])
189
                        end
190
                    elseif copy[3] == "move" and not problem then
191
                        if fs.exists(dir..copy[2]) then
192
                            drawError("Non posso spostarlo nella stessa directory")
193
                        else
194
                            fs.move(copy[1]..copy[2], dir..copy[2])
195
                            copy = {}
196
                        end
197
                    else
198
                        drawError("copy:13: Non åA8 possibile copiare una directory al suo interno")
199
                    end
200
                end
201
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 5 then
202
                if hidden then
203
                    hidden = false
204
                else
205
                    hidden = true
206
                end
207
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 6 then
208
                if copy[1] then
209
                    copy = {}
210
                end
211
            end
212
        end
213
    elseif slc > 0 then
214
        if event[1] == "mouse_click" then
215
            if event[3] >= w-11 and event[3] <= w-1 and event[4] == 2 then
216
                if fs.isDir(dir..files[slc]) then
217
                    dir = dir..files[slc].."/"
218
                    slc = 0
219
                    scroll = 0
220
                else
221
                    setColor(32768, 1)
222
                    return shell.run(dir..files[slc])
223
                end
224
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 3 then
225
                slc = 0
226
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 4 then
227
                local tc = 32768
228
                if fs.isDir(dir..files[slc]) then tc = 32 end
229
                printHere(2, 2+slc-scroll, string.rep(' ', #files[slc]), 1, tc)
230
                term.setCursorPos(2, 2+slc-scroll)
231
                local nName = io.read()
232
                if nName ~= "" then
233
                    fs.move(dir..files[slc], dir..nName)
234
                end
235
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 5 then
236
                if dir..files[slc] ~= "rom" then
237
                    copy[1] = dir
238
                    copy[2] = files[slc]
239
                    copy[3] = "copy"
240
                else
241
                    drawError("accesso negato")
242
                end
243
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 6 then
244
                if dir..files[slc] ~= "rom" and dir..files[slc] ~= "disk" then
245
                    copy[1] = dir
246
                    copy[2] = files[slc]
247
                    copy[3] = "move"
248
                else
249
                    drawError("move:13: accesso negato")
250
                end
251
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 7 then
252
                printCentred(h/2, "  Sei sicuro? ", 512, 32768)
253
                printCentred(h/2+1, " si        no ", 512, 32768)
254
                local run = true
255
                while run do
256
                    os.startTimer(0.1)
257
                    local temp = {os.pullEvent()}
258
                    if temp[1] == "timer" then
259
                        printTime("default", h, 512, 32768)
260
                    elseif temp[1] == "mouse_click" then
261
                        if temp[2] == 1 and temp[4] == math.floor(h/2+1) then
262
                            if temp[3] >= math.floor(w/2-6) and temp[3] <= math.floor(w/2-4) then
263
                                if dir..files[slc] ~= "rom" and dir..files[slc] ~= "disk" then
264
                                    fs.delete(dir..files[slc])
265
                                    slc = 0
266
                                else
267
                                    drawError("delete:9: accesso negato")
268
                                end
269
                                run = false
270
                            elseif temp[3] >= math.floor(w/2+4) and temp[3] <= math.floor(w/2+5) then
271
                                run = false
272
                            end
273
                        end
274
                    end
275
                end
276
            elseif event[3] >= w-11 and event[3] <= w-1 and event[4] == 8 then
277
                if not fs.isDir(dir..files[slc]) then
278
                    return shell.run("edit "..dir..files[slc])
279
                end
280
            end
281
        end
282
    end
283-
    if event[1] == "mouse_click" and event[2] == 1 and event[3] >= 1 and event[3] <= 8 and event[4] == h and dir ~= "/disk/" then
283+
    if event[1] == "mouse_click" and event[2] == 1 and event[3] >= 1 and event[3] <= 8 and event[4] == h and dir ~= "/disk/TEMP/files/" then
284-
        dir = "/disk/"
284+
        dir = "/disk/TEMP/files/"
285
        slc = 0
286
        scroll = 0
287-
    elseif event[1] == "mouse_click" and event[2] == 1 and event[3] >= 10 and event[3] <= 15 and event[4] == h and dir ~= "/data/" then
287+
    elseif event[1] == "mouse_click" and event[2] == 1 and event[3] >= 10 and event[3] <= 15 and event[4] == h and dir ~= "/Hack/files/" then
288-
      if dir ~= "/disk/" then
288+
      if dir ~= "/disk/TEMP/files/" then
289
        local slash = 0
290
        for i = 1, #dir-1 do
291
        if dir:sub(i, i) == '/' then
292
          slash = i
293
        end
294
     end
295-
        if slash == 0 then dir = "/data/"
295+
        if slash == 0 then dir = "/Hack/files/"
296
        else dir = dir:sub(1, slash) end
297
        slc = 0
298
        scroll = 0
299
      else
300-
      dir = "/data/"
300+
      dir = "/Hack/files/"
301
      end
302-
    elseif event[1] == "mouse_click" and event[2] == 1 and event[3] >= 17 and event[3] <= 22 and event[4] == h and dir ~= "/data/" then
302+
    elseif event[1] == "mouse_click" and event[2] == 1 and event[3] >= 17 and event[3] <= 22 and event[4] == h and dir ~= "Hack/files/" then
303-
        dir = "/data/"
303+
        dir = "/Hack/files/"
304
        slc = 0
305
        scroll = 0
306
end
307
end
308
 
309
--Draw the files and directories
310
local function drawFiles()
311
    for k, v in pairs(files) do
312
        local bc, tc = 1, 32768
313
        if fs.isDir(dir..v) then tc = 32 end
314
        if k == slc then bc = 8 end
315
        printHere(2, 2+k-scroll, v, bc, tc)
316
    end
317
    drawMenu()
318
end
319
 
320
--Scroll in a large list of files
321
local function scrollFiles(upDown)
322
    if upDown == -1 then
323
        if scroll > 0 then scroll = scroll-1 end
324
    elseif upDown == 1 then
325
        if scroll < #files-h/1.2 then scroll = scroll+1 end
326
    end
327
end
328
 
329
--Click files
330
local function clickFiles(event)
331
    if event[1] == "mouse_scroll" then
332
        scrollFiles(event[2])
333
    elseif event[1] == "mouse_click" or "mouse_drag" then
334
        if event[2] == 1 then
335
            if event[3] == 1 and event[4] == 1 then
336
                running = false
337
                return nil
338
            elseif event[3] >= w-#getTime()+1 and event[3] <= w and event[4] == h then
339
                if mTime then mTime = false
340
                else mTime = true end
341
            elseif event[3] == w and event[4] >= 2 and event[4] <= h/2 then
342
                scrollFiles(-1)
343
            elseif event[3] == w and event[4] > h/2 and event[4] <= h-1 then
344
                scrollFiles(1)
345
            end
346
            for k, v in pairs(files) do
347
                if event[3] >= 2 and event[3] <= #v+1 and event[4] == 2+k-scroll and event[4] ~= 1 and event[4] ~= h then
348
                    if slc == k and fs.isDir(dir..files[slc]) then
349
                        dir = dir..files[slc].."/"
350
                        slc = 0
351
                        scroll = 0
352
                    elseif slc == k and not fs.isDir(dir..files[slc]) then
353
                        setColor(32768, 1)
354
                        return shell.run(dir..files[slc])
355
                    else
356
                        slc = k
357
                    end
358
                end
359
            end
360
        end
361
    end
362
    clickMenu(event)
363
end
364
 
365
--Draw the desktop environment
366
local function drawDesktop()
367
    if running then
368
        setColor(1)
369
        term.clear()
370
        drawFiles()
371
        drawHeader()
372
    else
373-
        setColor(32768, 1)
373+
        shell.run("desktop")
374
    end
375-
        printCentred(1, "Thanks for using Fman!")
375+
376-
        printHere(1, 2, string.rep("-", w), 32768, 1)
376+
377-
        term.setCursorPos(1, 3)
377+
378
getFiles()
379
drawDesktop()
380
while running do
381
    os.startTimer(0.1)
382
    local event = {os.pullEvent()}
383
    if event[1] == "timer" then
384
        printTime("default", h, 512, 32768)
385
    else
386
        clickFiles(event)
387
        getFiles()
388
        drawDesktop()
389
    end
390
end