FLTK: Как включить полосу прокрутки в деактивированном Fl_Text_Editor

В некоторых случаях мы хотели бы сделать текст в Fl_Text_Editor нередактируемым (например, когда пользователь загружает файл, доступный только для чтения. Очевидно, что в этих случаях можно использовать Fl_Text_Display)

В настоящее время мы достигаем этого, вызывая deactivate () в виджете Fl_Text_Editor, и это правильно отключает виджет, и он становится серым. Однако это также, похоже, отключает полосы прокрутки, и пользователь не может прокручивать виджет вниз, чтобы прочитать оставшуюся часть текста.

Я попытался переопределить функцию деактивации Fl_Text_Editor и затем снова активировать ее полосу прокрутки, но это не сработало. Видимо виджет активен, когда все его родители также активны.

Мы будем очень признательны за любые мысли о том, как я все еще могу использовать полосы прокрутки деактивированного Fl_Text_Editor.


person Ben    schedule 07.01.2015    source источник


Ответы (1)


Поскольку основное различие между Fl_Text_Editor и Fl_Text_Display - это функция дескриптора, проще всего создать свой собственный класс, который решает, какой дескриптор использовать. Попробуйте добавить в свой код следующее

class TextEditor: public Fl_Text_Editor
{
   bool m_readonly;
   Fl_Color grey;
   Fl_Color normal;
public:
   TextEditor(int x, int y, int w, int h, const char* l = 0)
      :Fl_Text_Editor(x, y, w, h, l)
      , m_readonly(false)
   {
      grey = FL_BACKGROUND_COLOR;
      normal = FL_BACKGROUND2_COLOR;
   }

   int handle(int e)
   {
      int rv = 0;
      if (m_readonly)
         rv = Fl_Text_Display::handle(e);
      else
         rv = Fl_Text_Editor::handle(e);
      return rv;
   }

   void Readonly(bool in_set)
   {
      m_readonly = in_set;
      color(m_readonly? grey: normal);
   }
};

Используйте TextEditor вместо Fl_Text_Editor. Если вы хотите деактивировать, просто вызовите Readonly (true);

Настройка цвета - это просто дополнительная функция, которая делает отображение недоступным для записи.

person cup    schedule 10.01.2015
comment
Отлично работает и гораздо более элегантное решение, чем мое (переопределение события handle Fl_Text_Editor и игнорирование ключевых событий). Tnx! - person Ben; 13.01.2015