Как автоматически помещать новую строку в конец текста в FLTK Multiline_Input? - PullRequest
2 голосов
/ 13 июля 2020

Я использую FLTK 1.3.5 и хочу использовать объект Multiline_Input. Интересно, есть ли способ автоматически ставить новую строку, когда вставленный текст достигает конца поля ввода, вместо того, чтобы делать это вручную (проверьте загруженные изображения для примера). Кроме того, перевод строки следует ставить в конце слова. Я искал здесь на SO и в Интернете, но не смог найти ничего полезного.

Input text on one line Ввод текста в несколько строк

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

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Multiline_Input.H>


int main(int argc, char **argv) {

    Fl_Window *G_win = 0;
    G_win = new Fl_Window(200,200,"Test multi input");

    Fl_Multiline_Input* in;
    in = new Fl_Multiline_Input(50,50,120,100," Test:");

    G_win->end();
    G_win->show(argc, argv);
    
    return Fl::run();
}

Ответы [ 2 ]

1 голос
/ 14 июля 2020

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

Я создал класс из исходного Fl_Multiline_Input, который в основном контролирует, что char[] в Fl_Multiline_input->value() не превышает максимальную ширину, заданную геометрией (учитывая текущую Fl_font). Может быть, это не лучшее решение, но, эй, работает! Конечно, более производительные / элегантные стратегии более чем приветствуются.

Код ниже.

#include "mymulti.hpp"

/*
   This is needed for converting a std::string 
   to a char[] (required by Fl_Input). Again, 
   maybe more performant alternative are out there...
*/
char* str2char(std::string S){
    char *out;
    out =  (char*) malloc ((S.size()+1)*sizeof(char));
    
    strcpy(out,&S[0]);
    out[S.size()] = '\0';
    
    return out;
}

mymulti::mymulti(int x, int y, int h, int l):Fl_Multiline_Input(x, y, h,l)
{}

int mymulti::handle(int event)
{
    switch (event) {
        // When a key is pressed and the widget is waiting for input
        case FL_KEYBOARD:
            return handle_key(event, Fl::event_key());
        default:
            return Fl_Multiline_Input::handle(event);
        };
}

int mymulti::handle_key(int event, int key) {

    
    if (key==FL_BackSpace)
        // Allowing Fl_Multiline_Input to handle the delection of characters
        return Fl_Multiline_Input::handle(event);
    else{
        // Converting to std::string just because manipulation is easer
        std::string s(this->value());
        std::string s2;
        /* 
           Search for the last newline char: 
           the subsequent substring must be shorter 
           than the width of the input field
        */
        std::size_t found = s.find_last_of("\n");
        if (found<std::string::npos)
            s2= s.substr (found);
        else
            s2 = s;
        
        /* 
           Mean length of a char (lower case) 
           under the current fl_font. One can add 
           uppercase letters and/or numbers and/or 
           other symbols.
        */
        double lc = fl_width("abcdefghijklmnopqrstuvwxyz")/26;
        // Maximum length for the substring
        int string_length = this->w()/lc -1;
        // if the substring is longer than the max allowed length, then add a newline
        if (s2.length()>string_length)
            s+="\n";
        // Update the input field    
        this->value(str2char(s));

        return Fl_Multiline_Input::handle(event);   
        }
}
1 голос
/ 13 июля 2020

С помощью FLTK вы всегда можете поймать события клавиатуры , например, используя (или переопределив) события клавиатуры

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

Мы планируем сделать это (летом 2020 г.) в проекте RefPerSys .

...