Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
[TOY] 行単位のスクリーンテキストエディタ
/**
簡易テキストエディタ
* hspの画面の擬似スクロールがしたかった
* ファイルの入出力は簡単にできる
* 行の挿入ができないという致命的欠陥がある
* 水平スクロールも同様に可能
* 論理的折り返しを実装するには結構直すことが多い
//*/
#define AppName "tiny_text_editor"
#packopt name AppName
#const SizeX_Ruler 40
#enum WindowId_Main = 0
//screen
title AppName
onclick gosub *LOnClick
onkey gosub *LOnKey
font msgothic, 13
line_height = 13 + 1 // font height + padding
view_lines = ginfo_winy / line_height //余りは?
current_cursor_y = 0
editing_line = -1 // 編集中の絶対行番号 or 負(編集中でない)
sdim input_buf, 120
sdim buf, 1000
notesel buf
//テスト用データ
repeat 30
noteadd "hot\nsoup\nprocessor"
loop
gsel WindowId_Main, 1
mainloop_counter = 0
goto *LMainLoop
*LMainLoop
//スクロール検知
mousew_value = mousew
if ( mousew_value != 0 ) {
scroll_line (- (mousew_value / 40))
}
//再描画
if (mainloop_counter & 0x10) {
redraw 2
hsvcolor ,, 255 : boxf
color
repeat view_lines
physical_line = visible_top_line + cnt
// 末尾
if (physical_line >= notemax) { hsvcolor ,, 127 : mes "[EOS]" : break }
noteget line_string, physical_line
pos 0, cnt * line_height
mes strf("%4d| %s", physical_line, line_string)
loop
redraw
}
await 7
mainloop_counter ++
goto *LMainLoop
//キー検知
*LOnKey
switch (wparam)
case 13: // Enter
if ( editing_line >= 0 ) { gosub *LCompleteEditingLine }
swbreak
case 38: scroll_line (-1) : swbreak // ↑
case 40: scroll_line ( 1) : swbreak // ↓
swend
return
#deffunc scroll_line int move_lines
//inputボックスの移動の実装がめんどくさいので、編集中はスクロールしないことにする
if ( editing_line < 0 ) {
visible_top_line = limit(visible_top_line + move_lines, 0, notemax - 1)
}
return
//クリック検知
*LOnClick
if ( iparam == 6 ) { return } // wheel click
mouse_pos = mousex, mousey
//マウスの位置からクリックされた相対行を判断
clicked_line = mouse_pos(1) / line_height
if ( editing_line >= 0 ) {
gosub *LCompleteEditingLine
}
//クリックされた行の編集を開始
if (iparam == 0 && (mouse_pos(0) >= SizeX_Ruler)) {
editing_line = visible_top_line + clicked_line
if ( 0 <= editing_line && editing_line < notemax ) {
//行の文字列の取り込み
noteget input_buf, editing_line
//クリックされた行に input を表示
objmode 2
pos SizeX_Ruler, (line_height * clicked_line) - 2
input input_buf, ginfo_winx - SizeX_Ruler, line_height + 4
id_line_input_box = stat
objsel id_line_input_box
}
}
return
*LCompleteEditingLine
assert (editing_line >= 0)
//実際のデータに上書き
noteadd input_buf, editing_line, 1
//編集モード終了
clrobj id_line_input_box, id_line_input_box
editing_line = -1
return
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment