mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-22 07:41:20 -04:00
Added a custom context menu for pasting RS-links to the base class MimeTextEdit and removed the custom context menu from derived classes.
Updated english translation. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@6977 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
dddc4356f1
commit
abd6b46ca0
17 changed files with 206 additions and 374 deletions
|
@ -21,20 +21,24 @@
|
|||
|
||||
#include <QMimeData>
|
||||
#include <QTextDocumentFragment>
|
||||
#include "MimeTextEdit.h"
|
||||
#include "util/HandleRichText.h"
|
||||
#include <QCompleter>
|
||||
#include <QAbstractItemView>
|
||||
#include <QKeyEvent>
|
||||
#include <QScrollBar>
|
||||
#include <QMenu>
|
||||
|
||||
#include "MimeTextEdit.h"
|
||||
#include "util/HandleRichText.h"
|
||||
#include "gui/RetroShareLink.h"
|
||||
|
||||
#include <retroshare/rspeers.h>
|
||||
|
||||
MimeTextEdit::MimeTextEdit(QWidget *parent)
|
||||
: QTextEdit(parent), mCompleter(0)
|
||||
: QTextEdit(parent), mCompleter(0)
|
||||
{
|
||||
mCompleterKeyModifiers=Qt::ControlModifier;
|
||||
mCompleterKey=Qt::Key_Space;
|
||||
mForceCompleterShowNextKeyEvent=false;
|
||||
mCompleterStartString="";
|
||||
mCompleterKeyModifiers = Qt::ControlModifier;
|
||||
mCompleterKey = Qt::Key_Space;
|
||||
mForceCompleterShowNextKeyEvent = false;
|
||||
}
|
||||
|
||||
bool MimeTextEdit::canInsertFromMimeData(const QMimeData* source) const
|
||||
|
@ -63,7 +67,7 @@ void MimeTextEdit::insertFromMimeData(const QMimeData* source)
|
|||
QString encodedImage;
|
||||
if (RsHtml::makeEmbeddedImage(image, encodedImage, 640*480)) {
|
||||
QTextDocumentFragment fragment = QTextDocumentFragment::fromHtml(encodedImage);
|
||||
this->textCursor().insertFragment(fragment);
|
||||
textCursor().insertFragment(fragment);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -76,136 +80,183 @@ void MimeTextEdit::insertFromMimeData(const QMimeData* source)
|
|||
|
||||
void MimeTextEdit::setCompleter(QCompleter *completer)
|
||||
{
|
||||
if (mCompleter)
|
||||
QObject::disconnect(mCompleter, 0, this, 0);
|
||||
if (mCompleter)
|
||||
QObject::disconnect(mCompleter, 0, this, 0);
|
||||
|
||||
mCompleter = completer;
|
||||
mCompleter = completer;
|
||||
|
||||
if (!mCompleter)
|
||||
return;
|
||||
if (!mCompleter)
|
||||
return;
|
||||
|
||||
mCompleter->setWidget(this);
|
||||
mCompleter->setCompletionMode(QCompleter::PopupCompletion);
|
||||
mCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
||||
QObject::connect(mCompleter, SIGNAL(activated(QString)),
|
||||
this, SLOT(insertCompletion(QString)));
|
||||
mCompleter->setWidget(this);
|
||||
mCompleter->setCompletionMode(QCompleter::PopupCompletion);
|
||||
mCompleter->setCaseSensitivity(Qt::CaseInsensitive);
|
||||
QObject::connect(mCompleter, SIGNAL(activated(QString)), this, SLOT(insertCompletion(QString)));
|
||||
}
|
||||
|
||||
QCompleter *MimeTextEdit::completer() const
|
||||
{
|
||||
return mCompleter;
|
||||
return mCompleter;
|
||||
}
|
||||
|
||||
void MimeTextEdit::insertCompletion(const QString& completion)
|
||||
{
|
||||
if (mCompleter->widget() != this)
|
||||
return;
|
||||
QTextCursor tc = textCursor();
|
||||
if (mCompleter->completionPrefix().length()>0) {
|
||||
tc.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor);
|
||||
}
|
||||
tc.removeSelectedText();
|
||||
tc.insertText(mCompleterStartString+completion);
|
||||
mCompleterStartString="";
|
||||
setTextCursor(tc);
|
||||
if (mCompleter->widget() != this)
|
||||
return;
|
||||
|
||||
QTextCursor tc = textCursor();
|
||||
if (mCompleter->completionPrefix().length() > 0) {
|
||||
tc.movePosition(QTextCursor::PreviousWord, QTextCursor::KeepAnchor);
|
||||
}
|
||||
tc.removeSelectedText();
|
||||
tc.insertText(mCompleterStartString+completion);
|
||||
mCompleterStartString.clear();
|
||||
setTextCursor(tc);
|
||||
}
|
||||
|
||||
QString MimeTextEdit::textUnderCursor() const
|
||||
{
|
||||
QTextCursor tc = textCursor();
|
||||
tc.select(QTextCursor::WordUnderCursor);
|
||||
return tc.selectedText();
|
||||
QTextCursor tc = textCursor();
|
||||
tc.select(QTextCursor::WordUnderCursor);
|
||||
return tc.selectedText();
|
||||
}
|
||||
|
||||
void MimeTextEdit::focusInEvent(QFocusEvent *e)
|
||||
{
|
||||
if (mCompleter)
|
||||
mCompleter->setWidget(this);
|
||||
QTextEdit::focusInEvent(e);
|
||||
if (mCompleter)
|
||||
mCompleter->setWidget(this);
|
||||
|
||||
QTextEdit::focusInEvent(e);
|
||||
}
|
||||
|
||||
void MimeTextEdit::keyPressEvent(QKeyEvent *e)
|
||||
{
|
||||
if (mCompleter && mCompleter->popup()->isVisible()) {
|
||||
// The following keys are forwarded by the completer to the widget
|
||||
switch (e->key()) {
|
||||
case Qt::Key_Enter:
|
||||
case Qt::Key_Return:
|
||||
case Qt::Key_Escape:
|
||||
case Qt::Key_Tab:
|
||||
case Qt::Key_Backtab:
|
||||
mCompleter->popup()->hide();
|
||||
mForceCompleterShowNextKeyEvent=false;
|
||||
e->ignore();
|
||||
return; // let the completer do default behavior
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (mCompleter && mCompleter->popup()->isVisible()) {
|
||||
// The following keys are forwarded by the completer to the widget
|
||||
switch (e->key()) {
|
||||
case Qt::Key_Enter:
|
||||
case Qt::Key_Return:
|
||||
case Qt::Key_Escape:
|
||||
case Qt::Key_Tab:
|
||||
case Qt::Key_Backtab:
|
||||
mCompleter->popup()->hide();
|
||||
mForceCompleterShowNextKeyEvent=false;
|
||||
e->ignore();
|
||||
return; // let the completer do default behavior
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
bool isShortcut = ((e->modifiers() & mCompleterKeyModifiers) && e->key() == mCompleterKey);
|
||||
if (isShortcut && !mForceCompleterShowNextKeyEvent) {
|
||||
mCompleterStartString.clear();
|
||||
}
|
||||
isShortcut |= mForceCompleterShowNextKeyEvent;
|
||||
if (!mCompleter || !isShortcut) // do not process the shortcut when we have a completer
|
||||
QTextEdit::keyPressEvent(e);
|
||||
|
||||
bool isShortcut = ((e->modifiers() & mCompleterKeyModifiers) && e->key() == mCompleterKey);
|
||||
if (isShortcut && !mForceCompleterShowNextKeyEvent) {
|
||||
mCompleterStartString="";
|
||||
}
|
||||
isShortcut |= mForceCompleterShowNextKeyEvent;
|
||||
if (!mCompleter || !isShortcut) // do not process the shortcut when we have a completer
|
||||
QTextEdit::keyPressEvent(e);
|
||||
if (!mCompleter) return; //Nothing else to do if not mCompleter initialized
|
||||
|
||||
if (!mCompleter) return; //Nothing else to do if not mCompleter initialized
|
||||
if (!isShortcut && (mCompleter && !mCompleter->popup()->isVisible())) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isShortcut && (mCompleter && !mCompleter->popup()->isVisible())) {
|
||||
return;
|
||||
}
|
||||
if (!mForceCompleterShowNextKeyEvent) {
|
||||
static QString eow(" ~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
|
||||
if (!isShortcut && !e->text().isEmpty() && eow.contains(e->text())){
|
||||
mCompleter->popup()->hide();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if (!mForceCompleterShowNextKeyEvent) {
|
||||
static QString eow(" ~!@#$%^&*()_+{}|:\"<>?,./;'[]\\-="); // end of word
|
||||
if (!isShortcut && !e->text().isEmpty() && eow.contains(e->text())){
|
||||
mCompleter->popup()->hide();
|
||||
return;
|
||||
}
|
||||
}
|
||||
QString completionPrefix = textUnderCursor();
|
||||
if (completionPrefix != mCompleter->completionPrefix()) {
|
||||
mCompleter->setCompletionPrefix(completionPrefix);
|
||||
mCompleter->popup()->setCurrentIndex(mCompleter->completionModel()->index(0, 0));
|
||||
}
|
||||
|
||||
QString completionPrefix = textUnderCursor();
|
||||
if (completionPrefix != mCompleter->completionPrefix()) {
|
||||
mCompleter->setCompletionPrefix(completionPrefix);
|
||||
mCompleter->popup()->setCurrentIndex(mCompleter->completionModel()->index(0, 0));
|
||||
}
|
||||
QRect cr = cursorRect();
|
||||
cr.setWidth(mCompleter->popup()->sizeHintForColumn(0) + mCompleter->popup()->verticalScrollBar()->sizeHint().width());
|
||||
mCompleter->complete(cr); // popup it up!
|
||||
|
||||
QRect cr = cursorRect();
|
||||
cr.setWidth(mCompleter->popup()->sizeHintForColumn(0)
|
||||
+ mCompleter->popup()->verticalScrollBar()->sizeHint().width());
|
||||
mCompleter->complete(cr); // popup it up!
|
||||
|
||||
if (mCompleter->completionCount()==0 && isShortcut){
|
||||
QTextEdit::keyPressEvent(e);// Process the key if no match
|
||||
}
|
||||
mForceCompleterShowNextKeyEvent=false;
|
||||
if (mCompleter->completionCount()==0 && isShortcut){
|
||||
QTextEdit::keyPressEvent(e);// Process the key if no match
|
||||
}
|
||||
mForceCompleterShowNextKeyEvent = false;
|
||||
}
|
||||
|
||||
void MimeTextEdit::setCompleterKeyModifiers(Qt::KeyboardModifier modifiers)
|
||||
{
|
||||
mCompleterKeyModifiers=modifiers;
|
||||
mCompleterKeyModifiers = modifiers;
|
||||
}
|
||||
|
||||
Qt::KeyboardModifier MimeTextEdit::getCompleterKeyModifiers() const
|
||||
{
|
||||
return mCompleterKeyModifiers;
|
||||
return mCompleterKeyModifiers;
|
||||
}
|
||||
|
||||
void MimeTextEdit::setCompleterKey(Qt::Key key)
|
||||
{
|
||||
mCompleterKey=key;
|
||||
mCompleterKey = key;
|
||||
}
|
||||
|
||||
Qt::Key MimeTextEdit::getCompleterKey() const
|
||||
{
|
||||
return mCompleterKey;
|
||||
return mCompleterKey;
|
||||
}
|
||||
void MimeTextEdit::forceCompleterShowNextKeyEvent(QString startString="")
|
||||
{
|
||||
if (!mCompleter) return; //Nothing else to do if not mCompleter initialized
|
||||
|
||||
if(!mCompleter->popup()->isVisible()){
|
||||
mForceCompleterShowNextKeyEvent=true;
|
||||
mCompleterStartString=startString;
|
||||
void MimeTextEdit::forceCompleterShowNextKeyEvent(QString startString)
|
||||
{
|
||||
if (!mCompleter) return; //Nothing else to do if not mCompleter initialized
|
||||
|
||||
if(!mCompleter->popup()->isVisible()){
|
||||
mForceCompleterShowNextKeyEvent = true;
|
||||
mCompleterStartString = startString;
|
||||
}
|
||||
}
|
||||
|
||||
void MimeTextEdit::addContextMenuAction(QAction *action)
|
||||
{
|
||||
mContextMenuActions.push_back(action);
|
||||
}
|
||||
|
||||
void MimeTextEdit::contextMenuEvent(QContextMenuEvent *e)
|
||||
{
|
||||
emit calculateContextMenuActions();
|
||||
|
||||
QMenu *contextMenu = createStandardContextMenu(e->pos());
|
||||
|
||||
/* Add actions for pasting links */
|
||||
contextMenu->addSeparator();
|
||||
QAction *pasteLinkAction = contextMenu->addAction(QIcon(":/images/pasterslink.png"), tr("Paste RetroShare Link"), this, SLOT(pasteLink()));
|
||||
contextMenu->addAction(QIcon(":/images/pasterslink.png"), tr("Paste my certificate link"), this, SLOT(pasteOwnCertificateLink()));
|
||||
|
||||
if (RSLinkClipboard::empty()) {
|
||||
pasteLinkAction->setDisabled(true);
|
||||
}
|
||||
|
||||
QList<QAction*>::iterator it;
|
||||
for (it = mContextMenuActions.begin(); it != mContextMenuActions.end(); ++it) {
|
||||
contextMenu->addAction(*it);
|
||||
}
|
||||
|
||||
contextMenu->exec(QCursor::pos());
|
||||
|
||||
delete(contextMenu);
|
||||
}
|
||||
|
||||
void MimeTextEdit::pasteLink()
|
||||
{
|
||||
insertHtml(RSLinkClipboard::toHtml()) ;
|
||||
}
|
||||
|
||||
void MimeTextEdit::pasteOwnCertificateLink()
|
||||
{
|
||||
RetroShareLink link;
|
||||
std::string ownId = rsPeers->getOwnId();
|
||||
|
||||
if (link.createCertificate(ownId)) {
|
||||
insertHtml(link.toHtml() + " ");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -32,34 +32,43 @@ class MimeTextEdit : public QTextEdit
|
|||
public:
|
||||
MimeTextEdit(QWidget *parent = 0);
|
||||
|
||||
//Form here: http://qt-project.org/doc/qt-4.8/tools-customcompleter.html
|
||||
void setCompleter(QCompleter *completer);
|
||||
QCompleter *completer() const;
|
||||
void setCompleterKeyModifiers(Qt::KeyboardModifier modifiers);
|
||||
Qt::KeyboardModifier getCompleterKeyModifiers() const;
|
||||
void setCompleterKey(Qt::Key key);
|
||||
Qt::Key getCompleterKey() const;
|
||||
void forceCompleterShowNextKeyEvent(QString startString);
|
||||
//Form here: http://qt-project.org/doc/qt-4.8/tools-customcompleter.html
|
||||
void setCompleter(QCompleter *completer);
|
||||
QCompleter *completer() const;
|
||||
void setCompleterKeyModifiers(Qt::KeyboardModifier modifiers);
|
||||
Qt::KeyboardModifier getCompleterKeyModifiers() const;
|
||||
void setCompleterKey(Qt::Key key);
|
||||
Qt::Key getCompleterKey() const;
|
||||
void forceCompleterShowNextKeyEvent(QString startString = "");
|
||||
|
||||
// Add QAction to context menu (action won't be deleted)
|
||||
void addContextMenuAction(QAction *action);
|
||||
|
||||
signals:
|
||||
void calculateContextMenuActions();
|
||||
|
||||
protected:
|
||||
virtual bool canInsertFromMimeData(const QMimeData* source) const;
|
||||
virtual void insertFromMimeData(const QMimeData* source);
|
||||
void keyPressEvent(QKeyEvent *e);
|
||||
void focusInEvent(QFocusEvent *e);
|
||||
virtual void contextMenuEvent(QContextMenuEvent *e);
|
||||
virtual void keyPressEvent(QKeyEvent *e);
|
||||
virtual void focusInEvent(QFocusEvent *e);
|
||||
|
||||
private slots:
|
||||
void insertCompletion(const QString &completion);
|
||||
void insertCompletion(const QString &completion);
|
||||
void pasteLink();
|
||||
void pasteOwnCertificateLink();
|
||||
|
||||
private:
|
||||
QString textUnderCursor() const;
|
||||
QString textUnderCursor() const;
|
||||
|
||||
private:
|
||||
QCompleter *mCompleter;
|
||||
Qt::KeyboardModifier mCompleterKeyModifiers;
|
||||
Qt::Key mCompleterKey;
|
||||
bool mForceCompleterShowNextKeyEvent;
|
||||
QString mCompleterStartString;
|
||||
|
||||
QCompleter *mCompleter;
|
||||
Qt::KeyboardModifier mCompleterKeyModifiers;
|
||||
Qt::Key mCompleterKey;
|
||||
bool mForceCompleterShowNextKeyEvent;
|
||||
QString mCompleterStartString;
|
||||
QList<QAction*> mContextMenuActions;
|
||||
};
|
||||
|
||||
#endif // MIMETEXTEDIT_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue