2013-07-17 2 views
0

Я создал класс, который я пытаюсь сделать, чтобы имитировать 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 сотнями записей, но только верхняя часть массива будет записана (пока не дойдет до нижней части окна) без прокрутки. Нужно ли мне вручную прокручивать экран или что-то еще? из документации говорится, что она должна автоматически прокручиваться, когда курсор достигает дна, и добавляется другая строка.

+0

получил свое вид работы. очевидно, 'mvwprintw()' не перемещает курсор или что-то, поэтому мне пришлось переключиться на обычный 'wprintw()', который не является проблемой, потому что я могу добавить \ n для новой строки. Единственным недостатком является то, что моя функция 'mvchgat()' отпечатывает текст вместо того, чтобы раскрашивать определенные места. –

ответ

0

Процитирует страницу человека:

Опция scrollok контролирует то, что происходит, когда курсор окна перемещается от края окна или прокрутки области, либо в результате действия новой строки на нижняя строка или ввод последнего символа последней строки. Если отключено, (bf - FALSE), курсор остается в нижней строке. Если этот параметр включен, (БФ TRUE), окно прокручивается вверх на одну строку ...

Что происходит в вашем коде является то, что вы пытаетесь напечатать вне окна, которое является ошибкой, но ошибка, проклятия ручками, не печатая ничего.

Вы можете распечатать новую строку, когда вы дойдете до нижней части окна, или как только вы достигнете нижней части окна, вы можете вызвать @ window.scroll.

В любом случае вам нужно будет печатать на последней строке, если вы явно устанавливаете позицию.

+0

Да, я понял, что и я исправил эту часть. проблема, с которой я сейчас сталкиваюсь, заключается в том, что я не могу раскрасить определенные символы в этой строке/окне. перед тем, как он выведет '[11.23.92] , это какое-то сообщение', и обе скобки вокруг имени пользователя будут раскрашены как красные. теперь это отступы линий, а затем печать текста. я изменил вызов 'mvwprintw()' на вызов 'wprintw()' и добавил a \ n до конца строки, и теперь прокрутка выполняется. есть способ раскрасить символы в один вызов функции или мне нужно называть 'attr_on()' кучу раз просто стилизовать строку –

+0

Вам нужно вызвать 'attr_ *' функции кучу раз. – Craig

+0

Я надеялся, что это не так. хорошо, спасибо за помощь! –