Ticket #8340: scummvm_console.patch

File scummvm_console.patch, 4.9 KB (added by wjp, 20 years ago)

scummvm_console.patch

  • gui/console.h

    RCS file: /cvsroot/scummvm/scummvm/gui/console.h,v
    retrieving revision 1.25
    diff -u -r1.25 console.h
     
    5151
    5252        int             _currentPos;
    5353        int             _scrollLine;
     54        int             _firstLineInBuffer;
    5455       
    5556        int             _promptStartPos;
    5657        int     _promptEndPos;
     
    112113        void putcharIntern(int c);
    113114        void insertIntoPrompt(const char *str);
    114115        void print(const char *str);
    115         void updateScrollBar();
     116        void updateScrollBuffer();
    116117        void scrollToCurrent();
    117118
    118119        // Line editing
  • gui/console.cpp

    RCS file: /cvsroot/scummvm/scummvm/gui/console.cpp,v
    retrieving revision 1.46
    diff -u -r1.46 console.cpp
     
    5252
    5353        _currentPos = 0;
    5454        _scrollLine = _linesPerPage - 1;
     55        _firstLineInBuffer = 0;
    5556
    5657        _caretVisible = false;
    5758        _caretTime = 0;
     
    7172        for (int i = 0; i < kHistorySize; i++)
    7273                _history[i][0] = '\0';
    7374
     75        _promptStartPos = _promptEndPos = -1;
     76
    7477        // Display greetings & prompt
    7578        print(gScummVMFullVersion);
    7679        print("\nConsole is ready\n");
    77 
    78         _promptStartPos = _promptEndPos = -1;
    7980}
    8081
    8182void ConsoleDialog::reflowLayout() {
     
    109110        // Draw text
    110111        int start = _scrollLine - _linesPerPage + 1;
    111112        int y = _y + 2;
     113
    112114        for (int line = 0; line < _linesPerPage; line++) {
    113115                int x = _x + 1;
    114116                for (int column = 0; column < _lineWidth; column++) {
     
    232234                killChar();
    233235                draw();
    234236                break;
    235 /*
    236237        case 256 + 24:  // pageup
    237                 _selectedItem -= _entriesPerPage - 1;
    238                 if (_selectedItem < 0)
    239                         _selectedItem = 0;
     238                if (modifiers == OSystem::KBD_SHIFT) {
     239                        _scrollLine -= _linesPerPage - 1;
     240                        if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1)
     241                                _scrollLine = _firstLineInBuffer + _linesPerPage - 1;
     242                        updateScrollBuffer();
     243                        draw();
     244                }
    240245                break;
    241246        case 256 + 25:  // pagedown
    242                 _selectedItem += _entriesPerPage - 1;
    243                 if (_selectedItem >= _list.size() )
    244                         _selectedItem = _list.size() - 1;
     247                if (modifiers == OSystem::KBD_SHIFT) {
     248                        _scrollLine += _linesPerPage - 1;
     249                        if (_scrollLine > _promptEndPos / _lineWidth)
     250                                _scrollLine = _promptEndPos / _lineWidth;
     251                        updateScrollBuffer();
     252                        draw();
     253                }
    245254                break;
    246 */
    247255        case 256 + 22:  // home
    248                 _scrollLine = _linesPerPage - 1;        // FIXME - this is not correct after a wrap around
    249                 updateScrollBar();
     256                if (modifiers == OSystem::KBD_SHIFT) {
     257                        _scrollLine = _firstLineInBuffer + _linesPerPage - 1;
     258                        updateScrollBuffer();
     259                } else {
     260                        _currentPos = _promptStartPos;
     261                }
    250262                draw();
    251263                break;
    252264        case 256 + 23:  // end
    253                 _scrollLine = _currentPos / _lineWidth;
    254                 updateScrollBar();
     265                if (modifiers == OSystem::KBD_SHIFT) {
     266                        _scrollLine = _promptEndPos / _lineWidth;
     267                        if (_scrollLine < _linesPerPage - 1)
     268                                _scrollLine = _linesPerPage - 1;
     269                        updateScrollBuffer();
     270                } else {
     271                        _currentPos = _promptEndPos;
     272                }
    255273                draw();
    256274                break;
    257275        case 273:       // cursor up
     
    299317void ConsoleDialog::handleCommand(CommandSender *sender, uint32 cmd, uint32 data) {
    300318        switch (cmd) {
    301319        case kSetPositionCmd:
    302                 int newPos = (int)data + _linesPerPage - 1;
     320                int newPos = (int)data + _linesPerPage - 1 + _firstLineInBuffer;
    303321                if (newPos != _scrollLine) {
    304322                        _scrollLine = newPos;
    305323                        draw();
     
    425443                _scrollLine++;
    426444        _currentPos = (line + 1) * _lineWidth;
    427445
    428         updateScrollBar();
     446        updateScrollBuffer();
    429447}
    430448
    431 void ConsoleDialog::updateScrollBar() {
    432         int line = _currentPos / _lineWidth;
    433         _scrollBar->_numEntries = (line < _linesInBuffer) ? line + 1 : _linesInBuffer;
     449
     450// Call this (at least) when the current line changes or when
     451// a new line is added
     452void ConsoleDialog::updateScrollBuffer() {
     453        int lastchar = MAX(_promptEndPos, _currentPos);
     454        int line = lastchar / _lineWidth;
     455        int numlines = (line < _linesInBuffer) ? line + 1 : _linesInBuffer;
     456        int firstline = line - numlines + 1;
     457        if (firstline > _firstLineInBuffer) {
     458                // clear old line from buffer
     459                for (int i = lastchar; i < (line+1) * _lineWidth; ++i)
     460                        buffer(i) = ' ';
     461                _firstLineInBuffer = firstline;
     462        }
     463
     464        _scrollBar->_numEntries = numlines;
    434465        _scrollBar->_currentPos = _scrollBar->_numEntries - (line - _scrollLine + _linesPerPage);
    435466        _scrollBar->_entriesPerPage = _linesPerPage;
    436467        _scrollBar->recalc();
     
    477508                _currentPos++;
    478509                if ((_scrollLine + 1) * _lineWidth == _currentPos) {
    479510                        _scrollLine++;
    480                         updateScrollBar();
     511                        updateScrollBuffer();
    481512                }
    482513        }
    483514}
     
    519550}
    520551
    521552void ConsoleDialog::scrollToCurrent() {
    522         int line = _currentPos / _lineWidth;
     553        int line = _promptEndPos / _lineWidth;
    523554
    524555        if (line + _linesPerPage <= _scrollLine) {
    525556                // TODO - this should only occur for loong edit lines, though
    526557        } else if (line > _scrollLine) {
    527558                _scrollLine = line;
    528                 updateScrollBar();
     559                updateScrollBuffer();
    529560        }
    530561}
    531562