void ListWidget::setSelected(int item) { // HACK/FIXME: If our _listIndex has a non zero size, // we will need to look up, whether the user selected // item is present in that list if (_listIndex.size()) { int filteredItem = -1; for (uint i = 0; i < _listIndex.size(); ++i) { if (_listIndex[i] == item) { filteredItem = i; break; } } item = filteredItem; } assert(item >= -1 && item < (int)_list.size()); // We only have to do something if the widget is enabled and the selection actually changes if (isEnabled() && _selectedItem != item) { if (_editMode) abortEditMode(); _selectedItem = item; // Notify clients that the selection changed. sendCommand(kListSelectionChangedCmd, _selectedItem); _currentPos = _selectedItem - _entriesPerPage / 2; scrollToCurrent(); draw(); } }
void ConsoleDialog::historyScroll(int direction) { if (_historySize == 0) return; if (_historyLine == 0 && direction > 0) { int i; for (i = 0; i < _promptEndPos - _promptStartPos; i++) _history[_historyIndex].insertChar(buffer(_promptStartPos + i), i); } // Advance to the next line in the history int line = _historyLine + direction; if ((direction < 0 && line < 0) || (direction > 0 && line > _historySize)) return; _historyLine = line; // Hide caret if visible if (_caretVisible) drawCaret(true); // Remove the current user text _currentPos = _promptStartPos; killLine(); // ... and ensure the prompt is visible scrollToCurrent(); // Print the text from the history int idx; if (_historyLine > 0) idx = (_historyIndex - _historyLine + _historySize) % _historySize; else idx = _historyIndex; int length = _history[idx].size(); for (int i = 0; i < length; i++) printCharIntern(_history[idx][i]); _promptEndPos = _currentPos; // Ensure once more the caret is visible (in case of very long history entries) scrollToCurrent(); draw(); }
void ConsoleDialog::defaultKeyDownHandler(Common::KeyState &state) { if (state.ascii == '~' || state.ascii == '#') { slideUpAndClose(); } else if (state.hasFlags(Common::KBD_CTRL)) { specialKeys(state.keycode); } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) { for (int i = _promptEndPos - 1; i >= _currentPos; i--) buffer(i + 1) = buffer(i); _promptEndPos++; printChar((byte)state.ascii); scrollToCurrent(); } }
void ListWidget::reflowLayout() { Widget::reflowLayout(); _leftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Left", 0); _rightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Right", 0); _topPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Top", 0); _bottomPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Bottom", 0); _hlLeftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlLeftPadding", 0); _hlRightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlRightPadding", 0); _scrollBarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0); // HACK: Once we take padding into account, there are times where // integer rounding leaves a big chunk of white space in the bottom // of the list. // We do a rough rounding on the decimal places of Entries Per Page, // to add another entry even if it goes a tad over the padding. frac_t entriesPerPage = intToFrac(_h - _topPadding - _bottomPadding) / kLineHeight; // Our threshold before we add another entry is 0.9375 (0xF000 with FRAC_BITS being 16). const frac_t threshold = intToFrac(15) / 16; if ((frac_t)(entriesPerPage & FRAC_LO_MASK) >= threshold) entriesPerPage += FRAC_ONE; _entriesPerPage = fracToInt(entriesPerPage); assert(_entriesPerPage > 0); delete[] _textWidth; _textWidth = new int[_entriesPerPage]; for (int i = 0; i < _entriesPerPage; i++) _textWidth[i] = 0; if (_scrollBar) { _scrollBar->resize(_w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h); scrollBarRecalc(); scrollToCurrent(); } }
void ListWidget::reflowLayout() { Widget::reflowLayout(); _leftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Left", 0); _rightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Right", 0); _topPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Top", 0); _bottomPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.Padding.Bottom", 0); _hlLeftPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlLeftPadding", 0); _hlRightPadding = g_gui.xmlEval()->getVar("Globals.ListWidget.hlRightPadding", 0); _scrollBarWidth = g_gui.xmlEval()->getVar("Globals.Scrollbar.Width", 0); // HACK: Once we take padding into account, there are times where // integer rounding leaves a big chunk of white space in the bottom // of the list. // We do a rough rounding on the decimal places of Entries Per Page, // to add another entry even if it goes a tad over the padding. _entriesPerPage = ((_h - _topPadding - _bottomPadding) << 16) / kLineHeight; if ((uint)(_entriesPerPage & 0xFFFF) >= 0xF000) _entriesPerPage += (1 << 16); _entriesPerPage >>= 16; assert(_entriesPerPage > 0); delete[] _textWidth; _textWidth = new int[_entriesPerPage]; for (int i = 0; i < _entriesPerPage; i++) _textWidth[i] = 0; if (_scrollBar) { _scrollBar->resize(_w - _scrollBarWidth + 1, 0, _scrollBarWidth, _h); scrollBarRecalc(); scrollToCurrent(); } }
void ConsoleDialog::handleKeyDown(Common::KeyState state) { int i; if (_slideMode != kNoSlideMode) return; switch (state.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_KP_ENTER: { if (_caretVisible) drawCaret(true); nextLine(); assert(_promptEndPos >= _promptStartPos); int len = _promptEndPos - _promptStartPos; bool keepRunning = true; if (len > 0) { Common::String str; // Copy the user input to str for (i = 0; i < len; i++) str.insertChar(buffer(_promptStartPos + i), i); // Add the input to the history addToHistory(str); // Pass it to the input callback, if any if (_callbackProc) keepRunning = (*_callbackProc)(this, str.c_str(), _callbackRefCon); } print(PROMPT); _promptStartPos = _promptEndPos = _currentPos; draw(); if (!keepRunning) slideUpAndClose(); break; } case Common::KEYCODE_ESCAPE: slideUpAndClose(); break; case Common::KEYCODE_BACKSPACE: if (_caretVisible) drawCaret(true); if (_currentPos > _promptStartPos) { _currentPos--; killChar(); } scrollToCurrent(); drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_TAB: { if (_completionCallbackProc) { int len = _currentPos - _promptStartPos; assert(len >= 0); char *str = new char[len + 1]; // Copy the user input to str for (i = 0; i < len; i++) str[i] = buffer(_promptStartPos + i); str[len] = '\0'; Common::String completion; if ((*_completionCallbackProc)(this, str, completion, _callbackRefCon)) { if (_caretVisible) drawCaret(true); insertIntoPrompt(completion.c_str()); scrollToCurrent(); drawLine(pos2line(_currentPos)); } delete[] str; } break; } // Keypad & special keys // - if num lock is set, we always go to the default case // - if num lock is not set, we either fall down to the special key case // or ignore the key press in case of 0 (INSERT) or 5 case Common::KEYCODE_KP0: case Common::KEYCODE_KP5: if (state.flags & Common::KBD_NUM) defaultKeyDownHandler(state); break; case Common::KEYCODE_KP_PERIOD: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_DELETE: if (_currentPos < _promptEndPos) { killChar(); drawLine(pos2line(_currentPos)); } break; case Common::KEYCODE_KP1: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_END: if (state.hasFlags(Common::KBD_SHIFT)) { _scrollLine = _promptEndPos / kCharsPerLine; if (_scrollLine < _linesPerPage - 1) _scrollLine = _linesPerPage - 1; updateScrollBuffer(); } else { _currentPos = _promptEndPos; } draw(); break; case Common::KEYCODE_KP2: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_DOWN: historyScroll(-1); break; case Common::KEYCODE_KP3: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_PAGEDOWN: if (state.hasFlags(Common::KBD_SHIFT)) { _scrollLine += _linesPerPage - 1; if (_scrollLine > _promptEndPos / kCharsPerLine) { _scrollLine = _promptEndPos / kCharsPerLine; if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) _scrollLine = _firstLineInBuffer + _linesPerPage - 1; } updateScrollBuffer(); draw(); } break; case Common::KEYCODE_KP4: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_LEFT: if (_currentPos > _promptStartPos) _currentPos--; drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_KP6: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_RIGHT: if (_currentPos < _promptEndPos) _currentPos++; drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_KP7: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_HOME: if (state.hasFlags(Common::KBD_SHIFT)) { _scrollLine = _firstLineInBuffer + _linesPerPage - 1; updateScrollBuffer(); } else { _currentPos = _promptStartPos; } draw(); break; case Common::KEYCODE_KP8: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_UP: historyScroll(+1); break; case Common::KEYCODE_KP9: if (state.flags & Common::KBD_NUM) { defaultKeyDownHandler(state); break; } case Common::KEYCODE_PAGEUP: if (state.hasFlags(Common::KBD_SHIFT)) { _scrollLine -= _linesPerPage - 1; if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) _scrollLine = _firstLineInBuffer + _linesPerPage - 1; updateScrollBuffer(); draw(); } break; default: defaultKeyDownHandler(state); } }
bool ListWidget::handleKeyDown(Common::KeyState state) { bool handled = true; bool dirty = false; int oldSelectedItem = _selectedItem; if (!_editMode && state.keycode <= Common::KEYCODE_z && isprint((unsigned char)state.ascii)) { // Quick selection mode: Go to first list item starting with this key // (or a substring accumulated from the last couple key presses). // Only works in a useful fashion if the list entries are sorted. uint32 time = g_system->getMillis(); if (_quickSelectTime < time) { _quickSelectStr = (char)state.ascii; } else { _quickSelectStr += (char)state.ascii; } _quickSelectTime = time + 300; // TODO: Turn this into a proper constant (kQuickSelectDelay ?) if (_quickSelect) { // FIXME: This is bad slow code (it scans the list linearly each time a // key is pressed); it could be much faster. Only of importance if we have // quite big lists to deal with -- so for now we can live with this lazy // implementation :-) int newSelectedItem = 0; int bestMatch = 0; bool stop; for (StringArray::const_iterator i = _list.begin(); i != _list.end(); ++i) { const int match = matchingCharsIgnoringCase(i->c_str(), _quickSelectStr.c_str(), stop); if (match > bestMatch || stop) { _selectedItem = newSelectedItem; bestMatch = match; if (stop) break; } newSelectedItem++; } scrollToCurrent(); } else { sendCommand(_cmd, 0); } } else if (_editMode) { // Class EditableWidget handles all text editing related key presses for us handled = EditableWidget::handleKeyDown(state); } else { // not editmode switch (state.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_KP_ENTER: if (_selectedItem >= 0) { // override continuous enter keydown if (_editable && (_currentKeyDown != Common::KEYCODE_RETURN && _currentKeyDown != Common::KEYCODE_KP_ENTER)) { dirty = true; startEditMode(); } else sendCommand(kListItemActivatedCmd, _selectedItem); } break; // Keypad & special keys // - if num lock is set, we do not handle the keypress // - if num lock is not set, we either fall down to the special key case // or ignore the key press for 0, 4, 5 and 6 case Common::KEYCODE_KP_PERIOD: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_BACKSPACE: case Common::KEYCODE_DELETE: if (_selectedItem >= 0) { if (_editable) { // Ignore delete and backspace when the list item is editable } else { sendCommand(kListItemRemovalRequestCmd, _selectedItem); } } break; case Common::KEYCODE_KP1: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_END: _selectedItem = _list.size() - 1; break; case Common::KEYCODE_KP2: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_DOWN: if (_selectedItem < (int)_list.size() - 1) _selectedItem++; break; case Common::KEYCODE_KP3: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_PAGEDOWN: _selectedItem += _entriesPerPage - 1; if (_selectedItem >= (int)_list.size() ) _selectedItem = _list.size() - 1; break; case Common::KEYCODE_KP7: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_HOME: _selectedItem = 0; break; case Common::KEYCODE_KP8: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_UP: if (_selectedItem > 0) _selectedItem--; break; case Common::KEYCODE_KP9: if (state.flags & Common::KBD_NUM) { handled = false; break; } case Common::KEYCODE_PAGEUP: _selectedItem -= _entriesPerPage - 1; if (_selectedItem < 0) _selectedItem = 0; break; default: handled = false; } scrollToCurrent(); } if (dirty || _selectedItem != oldSelectedItem) draw(); if (_selectedItem != oldSelectedItem) { sendCommand(kListSelectionChangedCmd, _selectedItem); // also draw scrollbar _scrollBar->draw(); } return handled; }
void ConsoleDialog::handleKeyDown(Common::KeyState state) { int i; if (_slideMode != kNoSlideMode) return; switch (state.keycode) { case Common::KEYCODE_RETURN: case Common::KEYCODE_KP_ENTER: { if (_caretVisible) drawCaret(true); nextLine(); assert(_promptEndPos >= _promptStartPos); int len = _promptEndPos - _promptStartPos; bool keepRunning = true; if (len > 0) { // We have to allocate the string buffer with new, since VC++ sadly does not // comply to the C++ standard, so we can't use a dynamic sized stack array. char *str = new char[len + 1]; // Copy the user input to str for (i = 0; i < len; i++) str[i] = buffer(_promptStartPos + i); str[len] = '\0'; // Add the input to the history addToHistory(str); // Pass it to the input callback, if any if (_callbackProc) keepRunning = (*_callbackProc)(this, str, _callbackRefCon); // Get rid of the string buffer delete[] str; } print(PROMPT); _promptStartPos = _promptEndPos = _currentPos; draw(); if (!keepRunning) slideUpAndClose(); break; } case Common::KEYCODE_ESCAPE: slideUpAndClose(); break; case Common::KEYCODE_BACKSPACE: if (_caretVisible) drawCaret(true); if (_currentPos > _promptStartPos) { _currentPos--; killChar(); } scrollToCurrent(); drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_TAB: { if (_completionCallbackProc) { int len = _currentPos - _promptStartPos; assert(len >= 0); char *str = new char[len + 1]; // Copy the user input to str for (i = 0; i < len; i++) str[i] = buffer(_promptStartPos + i); str[len] = '\0'; Common::String completion; if ((*_completionCallbackProc)(this, str, completion, _callbackRefCon)) { if (_caretVisible) drawCaret(true); insertIntoPrompt(completion.c_str()); scrollToCurrent(); drawLine(pos2line(_currentPos)); } delete[] str; } break; } case Common::KEYCODE_DELETE: killChar(); drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_PAGEUP: if (state.flags == Common::KBD_SHIFT) { _scrollLine -= _linesPerPage - 1; if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) _scrollLine = _firstLineInBuffer + _linesPerPage - 1; updateScrollBuffer(); draw(); } break; case Common::KEYCODE_PAGEDOWN: if (state.flags == Common::KBD_SHIFT) { _scrollLine += _linesPerPage - 1; if (_scrollLine > _promptEndPos / kCharsPerLine) { _scrollLine = _promptEndPos / kCharsPerLine; if (_scrollLine < _firstLineInBuffer + _linesPerPage - 1) _scrollLine = _firstLineInBuffer + _linesPerPage - 1; } updateScrollBuffer(); draw(); } break; case Common::KEYCODE_HOME: if (state.flags == Common::KBD_SHIFT) { _scrollLine = _firstLineInBuffer + _linesPerPage - 1; updateScrollBuffer(); } else { _currentPos = _promptStartPos; } draw(); break; case Common::KEYCODE_END: if (state.flags == Common::KBD_SHIFT) { _scrollLine = _promptEndPos / kCharsPerLine; if (_scrollLine < _linesPerPage - 1) _scrollLine = _linesPerPage - 1; updateScrollBuffer(); } else { _currentPos = _promptEndPos; } draw(); break; case Common::KEYCODE_UP: historyScroll(+1); break; case Common::KEYCODE_DOWN: historyScroll(-1); break; case Common::KEYCODE_RIGHT: if (_currentPos < _promptEndPos) _currentPos++; drawLine(pos2line(_currentPos)); break; case Common::KEYCODE_LEFT: if (_currentPos > _promptStartPos) _currentPos--; drawLine(pos2line(_currentPos)); break; default: if (state.ascii == '~' || state.ascii == '#') { slideUpAndClose(); } else if (state.flags == Common::KBD_CTRL) { specialKeys(state.keycode); } else if ((state.ascii >= 32 && state.ascii <= 127) || (state.ascii >= 160 && state.ascii <= 255)) { for (i = _promptEndPos - 1; i >= _currentPos; i--) buffer(i + 1) = buffer(i); _promptEndPos++; putchar((byte)state.ascii); scrollToCurrent(); } } }
// [SLOT public] void FileManager::deleteSelectedFiles() { if (!m_view->hasFocus()) { //qDebug() << qPrintable(this->objectName()) << "NOT ACTIVE"; return; } QModelIndexList m_selection = m_selectionModel->selectedIndexes(); if (m_selection.isEmpty()) { QMessageBox::critical(m_parent, tr("Error"), tr("No file(s) selected"), QMessageBox::Ok); return; } QString msg; int count = m_selection.count(); if (count == 1) { QModelIndex index = m_view->currentIndex(); if (m_model->isDir(index)) { msg = tr("Delete Directory %1?").arg(m_model->fileName(index)); } else { msg = tr("Delete File %1?").arg(m_model->fileName(index)); } } else { msg = tr("Delete %1 Files?").arg(count); } if (QMessageBox::No == QMessageBox::warning(m_parent, "Delete", msg, QMessageBox::Yes, QMessageBox::No)) { return; } //QElapsedTimer timer; //timer.start(); // Block all selectionModel signals to avoid emission on every removed file. bool oldState = m_selectionModel->blockSignals(true); QProgressDialog progress(m_parent); progress.setRange(0, count); progress.setModal(true); for (int i = 0; i < count; ++i) { progress.setLabelText(tr("Delete %1").arg(m_model->filePath(m_selection.at(i)))); progress.setValue(i); qApp->processEvents(); if (progress.wasCanceled()) { m_selectionModel->blockSignals(oldState); return; } if (!m_model->remove(m_selection.at(i))) { QMessageBox::critical(m_parent, QObject::tr("Error"), tr("Cannot Remove '%1'").arg(m_model->filePath(m_selection.at(i))), QMessageBox::Abort); m_selectionModel->blockSignals(oldState); return; } } m_selectionModel->blockSignals(oldState); //qDebug() << "DELETE operation took" << timer.elapsed() << "milliseconds"; scrollToCurrent(); }