1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/newbeats-pastes

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
pasteitem.cpp 4.3 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Jackie Liu Отправлено 23.04.2021 04:57 2fcaccc
#include "pasteitem.h"
#include <QClipboard>
#include <QApplication>
#include <QVBoxLayout>
#include <QMimeData>
#include <QUrl>
#include <QDebug>
PasteItem::PasteItem(QWidget *parent, QListWidgetItem *item) : QWidget(parent),
m_frame(new QWidget(this)),
m_frame_effect(new QGraphicsDropShadowEffect(this)),
m_barnner(new Barnner(this->m_frame)),
m_context(new StackedWidget(this->m_frame)),
m_listwidget_item(item)
{
this->setFocusPolicy(Qt::StrongFocus);
this->setAttribute(Qt::WA_TranslucentBackground);
m_frame_effect->setOffset(0, 0);
m_frame_effect->setColor(QColor(0, 0, 0, 180));
m_frame_effect->setBlurRadius(8);
m_frame->setGraphicsEffect(m_frame_effect);
m_frame->setObjectName("PasteItemFrame");
QVBoxLayout *vboxlayout = new QVBoxLayout();
vboxlayout->addWidget(m_barnner);
vboxlayout->addWidget(m_context);
vboxlayout->setSpacing(0);
vboxlayout->setContentsMargins(5, 5, 5, 5);
m_frame->setLayout(vboxlayout);
m_frame->show();
}
void PasteItem::setImage(QImage &image)
{
QPixmap pixmap = QPixmap::fromImage(image);
m_context->setPixmap(pixmap);
this->m_barnner->setTitle(QObject::tr("Image"));
}
void PasteItem::setPlainText(QString s)
{
m_context->setText(s);
m_text = s;
if (s.startsWith("http://") || s.startsWith("ftp://") || s.startsWith("https://"))
this->m_barnner->setTitle(QObject::tr("Link"));
else if (QColor::isValidColor(s))
this->m_barnner->setTitle(QObject::tr("Color"));
else
this->m_barnner->setTitle(QObject::tr("PlainText"));
}
void PasteItem::setRichText(QString richText, QString plainText)
{
m_context->setRichText(richText, plainText);
m_text = plainText;
if (plainText.startsWith("http://") || plainText.startsWith("ftp://") || plainText.startsWith("https://"))
this->m_barnner->setTitle(QObject::tr("Link"));
else if (QColor::isValidColor(plainText.simplified().trimmed()))
this->m_barnner->setTitle(QObject::tr("Color"));
else
this->m_barnner->setTitle(QObject::tr("RichText"));
}
bool PasteItem::setUrls(QList<QUrl> &urls)
{
for (auto &url : urls) {
m_text += url.toString();
}
if (!m_context->setUrls(urls))
return false;
this->m_barnner->setTitle(QString("%1 ").arg(urls.count()) + QObject::tr("Files"));
return true;
}
void PasteItem::setIcon(QPixmap pixmap)
{
m_barnner->setIcon(pixmap);
}
void PasteItem::setTime(QDateTime &dateTime)
{
m_barnner->setTime(dateTime);
}
void PasteItem::resizeEvent(QResizeEvent *event)
{
QSize size = event->size();
m_frame->resize(size);
m_barnner->setFixedHeight(size.height()/5);
QWidget::resizeEvent(event);
}
void PasteItem::mouseDoubleClickEvent(QMouseEvent *event)
{
this->copyData();
QWidget::mouseDoubleClickEvent(event);
}
void PasteItem::keyPressEvent(QKeyEvent *event)
{
switch (event->key()) {
case Qt::Key_Return:
case Qt::Key_Enter:
this->copyData();
return;
case Qt::Key_Escape:
emit this->hideWindow();
return;
}
QWidget::keyPressEvent(event);
}
#ifdef Q_OS_LINUX
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
#include <X11/extensions/XTest.h>
#include <QTimer>
#include <QThread>
static void SendKey(Display * disp, KeySym keysym, KeySym modsym)
{
KeyCode keycode = 0, modcode = 0;
keycode = XKeysymToKeycode (disp, keysym);
if (keycode == 0)
return;
XTestGrabControl (disp, True);
/* Generate modkey press */
if (modsym != 0) {
modcode = XKeysymToKeycode(disp, modsym);
XTestFakeKeyEvent (disp, modcode, True, 0);
}
/* Generate regular key press and release */
XTestFakeKeyEvent (disp, keycode, True, 0);
XTestFakeKeyEvent (disp, keycode, False, 0);
/* Generate modkey release */
if (modsym != 0)
XTestFakeKeyEvent (disp, modcode, False, 0);
XSync (disp, False);
XTestGrabControl (disp, False);
}
#endif
void PasteItem::copyData(void)
{
emit this->hideWindow();
QClipboard *clipboard = QApplication::clipboard();
ItemData *itemData = (ItemData *)this->m_listwidget_item->data(Qt::UserRole).value<unsigned long>();
clipboard->setMimeData(dup_mimedata(itemData->mimeData), QClipboard::Clipboard);
#ifdef Q_OS_LINUX
clipboard->setMimeData(dup_mimedata(itemData->mimeData), QClipboard::Selection);
#endif
if (itemData->mimeData->hasUrls())
return;
#ifdef Q_OS_LINUX
/* Send keypress event 'Ctrl +v' for direct paste */
QTimer::singleShot(1000, [](void) {
Display *disp = XOpenDisplay(nullptr);
SendKey(disp, XK_Insert, XK_Shift_L);
XCloseDisplay(disp);
});
#endif
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/newbeats-pastes.git
git@api.gitlife.ru:oschina-mirror/newbeats-pastes.git
oschina-mirror
newbeats-pastes
newbeats-pastes
master