View difference between Paste ID: PrgrRhjW and xPS4uajm
SHOW: | | - or go back to the newest paste.
1
local frame = 1;
2
3
local tArgs = { ... }
4
if #tArgs == 0 then
5
	print( "Usage: powerpoint <folder path>" )
6
	return
7
end
8
9
local sPath = shell.resolve( tArgs[1] )
10
local bReadOnly = fs.isReadOnly( sPath )
11
if fs.exists( sPath ) and fs.isDir( sPath ) == false then
12
	print( "Cannot edit a frame" )
13
	return
14
elseif fs.exists( sPath ) == false then
15
	fs.makeDir( sPath )
16
end
17
18
local w,h = term.getSize()
19
local x,y = 1,1
20
local scrollX, scrollY = 0,0
21
22
local bMenu = false
23
local nMenuItem = 1
24
25
local sStatus = ""
26
local tLines = {}
27
28
local function load()
29
	tLines = {}
30
	if fs.exists( sPath.. "/Frame" ..frame ) then
31
		local file = io.open( sPath.. "/Frame" ..frame, "r" )
32
		local sLine = file:read()
33
		while sLine do
34
			table.insert( tLines, sLine )
35
			sLine = file:read()
36
		end
37
		file:close()
38
	else
39
		table.insert( tLines, "" )
40
	end
41
end
42
43
local function save()
44
	local file = io.open( sPath.. "/Frame" ..frame, "w" )
45
	if file then
46
		for n, sLine in ipairs( tLines ) do
47
			file:write( sLine .. "\n" )
48
		end
49
		file:close()
50
		return true
51
	end
52
	return false
53
end
54
55
local function redrawText()
56
	for y=1,h-1 do
57
		term.setCursorPos( 1 - scrollX, y )
58
		term.clearLine()
59
60
		local sLine = tLines[ y + scrollY ]
61
		if sLine ~= nil then
62
			term.write( sLine )
63
		end
64
	end
65
	term.setCursorPos( x - scrollX, y - scrollY )
66
end
67
68
local function redrawLine()
69
	local sLine = tLines[y]
70
	term.setCursorPos( 1 - scrollX, y - scrollY )
71
	term.clearLine()
72
	term.write( sLine )
73
	term.setCursorPos( x - scrollX, y - scrollY )
74
	if frame == 6 then
75
		error("Please purchase for more details and remove this frame limit!")
76
end
77
78
local tMenuItems = { "Save", "Exit", "Next", "Back" }
79
80
local function redrawMenu()
81
    term.setCursorPos( 1, h )
82
	term.clearLine()
83
84
	if not bMenu then
85
		term.write( sStatus )
86
	elseif frame == 6 then
87
		error("Please purchase for more details and remove this frame limit!")
88
	else
89
		for n,sItem in ipairs( tMenuItems ) do
90
			if n == nMenuItem then
91
				term.write( "["..sItem.."]" )
92
			else
93
				term.write( " "..sItem.." " )
94
			end
95
		end
96
	end
97
	
98
    term.setCursorPos( x - scrollX, y - scrollY )
99
end
100
101
local function setStatus( _sText )
102
	sStatus = _sText
103
	redrawMenu()
104
	if frame == 6 then
105
			error("Please purchase for more details and remove this frame limit!")
106
	end
107
end
108
109
local function setCursor( x, y )
110
	local screenX = x - scrollX
111
	local screenY = y - scrollY
112
	
113
	local bRedraw = false
114
	if screenX < 1 then
115
		scrollX = x - 1
116
		screenX = 1
117
		bRedraw = true
118
	elseif screenX > w then
119
		scrollX = x - w
120
		screenX = w
121
		bRedraw = true
122
	elseif frame == 6 then
123
		error("Please purchase for more details and remove this frame limit!")
124
	end
125
	
126
	if screenY < 1 then
127
		scrollY = y - 1
128
		screenY = 1
129
		bRedraw = true
130
	elseif screenY > h-1 then
131
		scrollY = y - (h-1)
132
		screenY = h-1
133
		bRedraw = true
134
	end
135
	
136
	if bRedraw then
137
		redrawText()
138
	end
139
	term.setCursorPos( screenX, screenY )
140
end
141
142
load()
143
144
term.clear()
145
term.setCursorPos(x,y)
146
term.setCursorBlink( true )
147
148
redrawText()
149
setStatus( "Press Ctrl to access menu (Frame " ..frame.. ")" )
150
151
local bRunning = true
152
local tMenuFunctions = {
153
	["Exit"] = function()
154
		bRunning = false
155
	end,
156
	["Save"] = function()
157
		if save() then
158
			setStatus( "Saved to "..sPath.." (Frame " ..frame..")" )
159
		else
160
			setStatus( "Access denied" )
161
		end
162
	end,
163
	["Next"] = function()
164
		if frame+1 == 6 then
165
			error("Please purchase for more details and remove this frame limit!")
166
		else
167
			frame = frame +1
168
			load()
169
			redrawText()
170
			setStatus( "Press Ctrl to access menu (Frame " ..frame.. ")" )
171
			x = 1
172
			y = 1
173
		end
174
	end,
175
	["Back"] = function()
176
		if frame-1 == 0 then
177
		else
178
			frame = frame-1
179
			load()
180
			redrawText()
181
			setStatus( "Press Ctrl to access menu (Frame " ..frame.. ")" )
182
			x = 1
183
			y = 1
184
		end
185
	end,
186
}
187
188
local function doMenuItem( _n )
189
	local fnMenu = tMenuFunctions[ tMenuItems[_n] ]
190
	if fnMenu then
191
		fnMenu()
192
	end
193
194
	bMenu = false
195
	term.setCursorBlink( true )
196
	redrawMenu()
197
end
198
199
while bRunning do
200
  local sEvent, param = os.pullEvent()
201
  if sEvent == "key" then
202
    if param == 200 then
203
		-- Up
204
		if not bMenu then
205
			-- Move cursor up
206
			if y > 1 then
207
				y = y - 1
208
				x = math.min( x, string.len( tLines[y] ) + 1 )
209
				setCursor( x, y )
210
			end
211
		end
212
		
213
	elseif param == 208 then
214
		-- Down
215
		if not bMenu then
216
			-- Move cursor down
217
			if y < #tLines then
218
				y = y + 1
219
				x = math.min( x, string.len( tLines[y] ) + 1 )
220
				setCursor( x, y )
221
			end
222
		end
223
	
224
	elseif param == 203 then
225
		-- Left
226
		if not bMenu then
227
			-- Move cursor left
228
			if x > 1 then
229
				x = x - 1
230
				setCursor( x, y )
231
			end
232
		else
233
			-- Move menu left
234
			nMenuItem = nMenuItem - 1
235
			if nMenuItem < 1 then
236
				nMenuItem = #tMenuItems
237
			end
238
			redrawMenu()
239
		end
240
			
241
		
242
	elseif param == 205 then
243
		-- Right
244
		if not bMenu then
245
			-- Move cursor right
246
   		 	if x < string.len( tLines[y] ) + 1 then
247
				x = x + 1
248
				setCursor( x, y )
249
		  	end
250
		else
251
			-- Move menu right
252
			nMenuItem = nMenuItem + 1
253
		  	if nMenuItem > #tMenuItems then
254
				nMenuItem = 1
255
		  	end
256
		  	redrawMenu()
257
		end
258
		
259
	elseif param == 14 then
260
		-- Backspace
261
		if not bMenu then
262
   		 	if x > 1 then
263
				-- Remove character
264
				local sLine = tLines[y]
265
				tLines[y] = string.sub(sLine,1,x-2) .. string.sub(sLine,x)
266
				redrawLine()
267
		
268
				x = x - 1
269
				setCursor( x, y )
270
			
271
			elseif y > 1 then
272
				-- Remove newline
273
				local sPrevLen = string.len( tLines[y-1] )
274
				tLines[y-1] = tLines[y-1] .. tLines[y]
275
				table.remove( tLines, y )
276
				redrawText()
277
			
278
				x = sPrevLen + 1
279
				y = y - 1
280
				setCursor( x, y )
281
		  	end
282
		end
283
		
284
	elseif param == 28 then
285
		-- Enter
286
		if not bMenu then
287
			-- Newline
288
			local sLine = tLines[y]
289
			tLines[y] = string.sub(sLine,1,x-1)
290
			table.insert( tLines, y+1, string.sub(sLine,x) )
291
			redrawText()
292
		
293
			x = 1
294
			y = y + 1
295
			setCursor( x, y )		
296
			
297
		else
298
			-- Menu selection
299
			doMenuItem( nMenuItem )
300
		end
301
		
302
	elseif param == 29 then
303
		-- Menu toggle
304
		bMenu = not bMenu
305
		if bMenu then
306
			term.setCursorBlink( false )
307
			nMenuItem = 1
308
		else
309
			term.setCursorBlink( true )
310
		end
311
		redrawMenu()
312
	
313
	end
314
		
315
  elseif sEvent == "redstone" then
316
		frame = frame +1
317
		load()
318
		redrawText()
319
		setStatus( "Press Ctrl to access menu (Frame " ..frame.. ")" )
320
		x = 1
321
		y = 1
322
		sleep(1.2)
323
  elseif sEvent == "char" then
324
	if not bMenu then
325
    	-- Input text
326
		local sLine = tLines[y]
327
		tLines[y] = string.sub(sLine,1,x-1) .. param .. string.sub(sLine,x)
328
		redrawLine()
329
	
330
		x = x + string.len( param )
331
		setCursor( x, y )
332
	
333
	else
334
		-- Select menu items
335
		for n,sMenuItem in ipairs( tMenuItems ) do
336
			if string.lower(string.sub(sMenuItem,1,1)) == string.lower(param) then
337
				doMenuItem( n )
338
				break
339
			end
340
		end
341
	end
342
  end
343
end
344
345
term.clear()
346
term.setCursorBlink( false )
347
term.setCursorPos( 1, 1 )