mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-10 08:14:47 -07:00
Add LineEditCompleter to Tab_Game
This commit is contained in:
parent
8c0722953f
commit
a64ea17357
7 changed files with 222 additions and 153 deletions
|
|
@ -13,12 +13,6 @@
|
|||
#include <QSystemTrayIcon>
|
||||
#include <QCompleter>
|
||||
#include <QWidget>
|
||||
#include <QTextCursor>
|
||||
#include <QAbstractItemView>
|
||||
#include <QScrollBar>
|
||||
#include <QStringListModel>
|
||||
#include <QKeyEvent>
|
||||
#include <QFocusEvent>
|
||||
#include "tab_supervisor.h"
|
||||
#include "tab_room.h"
|
||||
#include "tab_userlists.h"
|
||||
|
|
@ -28,6 +22,7 @@
|
|||
#include "gameselector.h"
|
||||
#include "settingscache.h"
|
||||
#include "main.h"
|
||||
#include "lineeditcompleter.h"
|
||||
|
||||
#include "get_pb_extension.h"
|
||||
#include "pb/room_commands.pb.h"
|
||||
|
|
@ -61,7 +56,7 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, ServerI
|
|||
connect(chatView, SIGNAL(addMentionTag(QString)), this, SLOT(addMentionTag(QString)));
|
||||
connect(settingsCache, SIGNAL(chatMentionCompleterChanged()), this, SLOT(actCompleterChanged()));
|
||||
sayLabel = new QLabel;
|
||||
sayEdit = new CustomLineEdit;
|
||||
sayEdit = new LineEditCompleter;
|
||||
sayLabel->setBuddy(sayEdit);
|
||||
connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage()));
|
||||
|
||||
|
|
@ -255,7 +250,7 @@ void TabRoom::processJoinRoomEvent(const Event_JoinRoom &event)
|
|||
userList->sortItems();
|
||||
if (!autocompleteUserList.contains("@" + QString::fromStdString(event.user_info().name()))){
|
||||
autocompleteUserList << "@" + QString::fromStdString(event.user_info().name());
|
||||
sayEdit->updateCompleterModel(autocompleteUserList);
|
||||
sayEdit->setCompletionList(autocompleteUserList);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -263,7 +258,7 @@ void TabRoom::processLeaveRoomEvent(const Event_LeaveRoom &event)
|
|||
{
|
||||
userList->deleteUser(QString::fromStdString(event.name()));
|
||||
autocompleteUserList.removeOne("@" + QString::fromStdString(event.name()));
|
||||
sayEdit->updateCompleterModel(autocompleteUserList);
|
||||
sayEdit->setCompletionList(autocompleteUserList);
|
||||
}
|
||||
|
||||
void TabRoom::processRoomSayEvent(const Event_RoomSay &event)
|
||||
|
|
@ -295,125 +290,4 @@ PendingCommand *TabRoom::prepareRoomCommand(const ::google::protobuf::Message &c
|
|||
void TabRoom::sendRoomCommand(PendingCommand *pend)
|
||||
{
|
||||
client->sendCommand(pend);
|
||||
}
|
||||
|
||||
CustomLineEdit::CustomLineEdit(QWidget *parent)
|
||||
: QLineEdit(parent)
|
||||
{
|
||||
}
|
||||
|
||||
void CustomLineEdit::focusOutEvent(QFocusEvent * e){
|
||||
QLineEdit::focusOutEvent(e);
|
||||
if (c->popup()->isVisible()){
|
||||
//Remove Popup
|
||||
c->popup()->hide();
|
||||
//Truncate the line to last space or whole string
|
||||
QString textValue = text();
|
||||
int lastIndex = textValue.length();
|
||||
int lastWordStartIndex = textValue.lastIndexOf(" ") + 1;
|
||||
int leftShift = qMin(lastIndex, lastWordStartIndex);
|
||||
setText(textValue.left(leftShift));
|
||||
//Insert highlighted line from popup
|
||||
insert(c->completionModel()->index(c->popup()->currentIndex().row(), 0).data().toString() + " ");
|
||||
//Set focus back to the textbox since tab was pressed
|
||||
setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
void CustomLineEdit::keyPressEvent(QKeyEvent * event)
|
||||
{
|
||||
switch (event->key()){
|
||||
case Qt::Key_Return:
|
||||
case Qt::Key_Enter:
|
||||
case Qt::Key_Escape:
|
||||
if (c->popup()->isVisible()){
|
||||
event->ignore();
|
||||
//Remove Popup
|
||||
c->popup()->hide();
|
||||
//Truncate the line to last space or whole string
|
||||
QString textValue = text();
|
||||
int lastIndexof = textValue.lastIndexOf(" ");
|
||||
QString finalString = textValue.left(lastIndexof);
|
||||
//Add a space if there's a word
|
||||
if (finalString != "")
|
||||
finalString += " ";
|
||||
setText(finalString);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case Qt::Key_Space:
|
||||
if (c->popup()->isVisible()){
|
||||
event->ignore();
|
||||
//Remove Popup
|
||||
c->popup()->hide();
|
||||
//Truncate the line to last space or whole string
|
||||
QString textValue = text();
|
||||
int lastIndex = textValue.length();
|
||||
int lastWordStartIndex = textValue.lastIndexOf(" ") + 1;
|
||||
int leftShift = qMin(lastIndex, lastWordStartIndex);
|
||||
setText(textValue.left(leftShift));
|
||||
//Insert highlighted line from popup
|
||||
insert(c->completionModel()->index(c->popup()->currentIndex().row(), 0).data().toString() + " ");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
QLineEdit::keyPressEvent(event);
|
||||
//Wait until the first character after @
|
||||
if (!c || text().right(1).contains("@"))
|
||||
return;
|
||||
|
||||
//Set new completion prefix
|
||||
c->setCompletionPrefix(cursorWord(text()));
|
||||
if (c->completionPrefix().length() < 1){
|
||||
c->popup()->hide();
|
||||
return;
|
||||
}
|
||||
|
||||
//Draw completion box
|
||||
QRect cr = cursorRect();
|
||||
cr.setWidth(c->popup()->sizeHintForColumn(0) + c->popup()->verticalScrollBar()->sizeHint().width());
|
||||
c->complete(cr);
|
||||
|
||||
//Select first item in the completion popup
|
||||
QItemSelectionModel* sm = new QItemSelectionModel(c->completionModel());
|
||||
c->popup()->setSelectionModel(sm);
|
||||
sm->select(c->completionModel()->index(0, 0), QItemSelectionModel::ClearAndSelect);
|
||||
sm->setCurrentIndex(c->completionModel()->index(0, 0), QItemSelectionModel::NoUpdate);
|
||||
}
|
||||
|
||||
QString CustomLineEdit::cursorWord(const QString &line) const
|
||||
{
|
||||
return line.mid(line.left(cursorPosition()).lastIndexOf(" ") + 1,
|
||||
cursorPosition() - line.left(cursorPosition()).lastIndexOf(" ") - 1);
|
||||
}
|
||||
|
||||
void CustomLineEdit::insertCompletion(QString arg)
|
||||
{
|
||||
QString s_arg = arg + " ";
|
||||
setText(text().replace(text().left(cursorPosition()).lastIndexOf(" ") + 1,
|
||||
cursorPosition() - text().left(cursorPosition()).lastIndexOf(" ") - 1, s_arg));
|
||||
}
|
||||
|
||||
void CustomLineEdit::setCompleter(QCompleter* completer)
|
||||
{
|
||||
c = completer;
|
||||
c->setWidget(this);
|
||||
connect(c, SIGNAL(activated(QString)),this, SLOT(insertCompletion(QString)));
|
||||
}
|
||||
|
||||
void CustomLineEdit::updateCompleterModel(QStringList completionList)
|
||||
{
|
||||
if (!c || c->popup()->isVisible())
|
||||
return;
|
||||
|
||||
QStringListModel *model;
|
||||
model = (QStringListModel*)(c->model());
|
||||
if (model == NULL)
|
||||
model = new QStringListModel();
|
||||
QStringList updatedList = completionList;
|
||||
model->setStringList(updatedList);
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue