Я создал класс, который я пытаюсь сделать, чтобы имитировать richtextbox, вроде, на окнах. это означает, что когда вы добавляете новые данные в форму/richtextbox, она добавляется к нижней части окна/окна, а остальная часть прокручивается на одну строку.прокручиваемое окно ncurses ruby
ive попытался включить scrollok()
, но, похоже, он не хочет прокручиваться. я не уверен, что это прослушивание или мой способ его реализации ошибочен.
class Textpad
attr_accessor :data, :name, :window
def initialize(name, height, width, startx, starty)
@data = []
@name = name
@height = height
@width = width
@startx = startx
@starty = starty
Ncurses.refresh
@window = Ncurses.newwin(height, width, starty, startx)
@window.scrollok true
@window.wrefresh
end
def add(packetid, username, message)
@data.push [Time.new.strftime('[%T]'), packetid, username, message]
@data.shift if @data.length > 500
end
def draw
Ncurses.init_pair(1, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK)
Ncurses.init_pair(2, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK)
Ncurses.init_pair(3, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK)
Ncurses.init_pair(4, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK)
@window.wclear
position = 0
@data.each do |timestamp, packetid, username, message|
case packetid
when '1005'
@window.mvwprintw(1*position, 1, "#{timestamp} «#{username}» #{message}")
@window.mvchgat(1*position, timestamp.length+2, 1, Ncurses::A_NORMAL, 3, NIL)
@window.mvchgat(1*position, timestamp.length+3+username.length, 1, Ncurses::A_NORMAL, 3, NIL) #colorize the symboles around the username
end
position += 1
end
@window.wrefresh
end
end
проблема будет в моем методе рисования класса Textpad. Я могу заполнить массив данных для класса Textpad сотнями записей, но только верхняя часть массива будет записана (пока не дойдет до нижней части окна) без прокрутки. Нужно ли мне вручную прокручивать экран или что-то еще? из документации говорится, что она должна автоматически прокручиваться, когда курсор достигает дна, и добавляется другая строка.
получил свое вид работы. очевидно, 'mvwprintw()' не перемещает курсор или что-то, поэтому мне пришлось переключиться на обычный 'wprintw()', который не является проблемой, потому что я могу добавить \ n для новой строки. Единственным недостатком является то, что моя функция 'mvchgat()' отпечатывает текст вместо того, чтобы раскрашивать определенные места. –