-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsidebarclipboardplugin.cpp
1516 lines (1380 loc) · 55.1 KB
/
sidebarclipboardplugin.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
/*
* Copyright (C) 2019 Tianjin KYLIN Information Technology Co., Ltd.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*
*/
#include "sidebarclipboardplugin.h"
#include <QGuiApplication>
#include <QApplication>
#include <QMimeData>
#include <QFile>
#include <QTranslator>
#include <QStyle>
#include <QTimer>
#include <QStyleFactory>
#include <QTextFrame>
SidebarClipboardPlugin::SidebarClipboardPlugin(QWidget *parent)
{
Q_UNUSED(parent);
translator = new QTranslator;
QLocale locale;
//获取系统语言环境 选择翻译文件
if ( locale.language() == QLocale::Chinese ) {
translator->load(QString(":/translations/test_zh_CN.qm"));
QApplication::installTranslator(translator);
}
installEventFilter(this);
m_bPromptBoxBool = true;
m_pClipboardDb = new clipboardDb();
/* 创建剪贴板主Widget和搜索栏与条目的ListWidget界面 */
createWidget();
/* 创建无剪贴板板字样 */
createTipLable();
/* 创建查找条目 */
createFindClipboardWidgetItem();
/* 往文件类型链表中加入文件后缀类型 */
AddfileSuffix();
/* 插件内部通信的信号类 */
ClipBoardInternalSignal::initInternalSignal();
ClipBoardInternalSignal *InternalSignal = ClipBoardInternalSignal::getGlobalInternalSignal();
/* 初始化右键菜单动作 */
initMenuAction();
/* 初始化mune*/
initTray();
/* 初始化图标 */
initTrayIcon(QIcon::fromTheme("kylin-tool-box"));
/* 初始化定时器 */
initTimer();
trayIcon->setVisible(true);
this->setWindowIcon(QIcon::fromTheme("kylin-tool-box", QIcon(":/image/kylin-alarm-clock.svg")));
this->setWindowTitle(tr("剪贴板"));
/* 在点击确认键后判断是否有勾选不再提示这一功能 */
connect(InternalSignal, &ClipBoardInternalSignal::CheckBoxSelectedSignal, this, [=]() {
m_bPromptBoxBool = false;
});
/* 当剪贴板条目发生变化的时候执行该槽函数 */
connect(this, &SidebarClipboardPlugin::Itemchange, this, &SidebarClipboardPlugin::ItemNumchagedSlots);
/* 将控件加入到剪贴板界面中 */
m_pClipboardLaout = new QVBoxLayout;
m_pClipboardLaout->setContentsMargins(16,0,0,0);
m_pClipboardLaout->addItem(new QSpacerItem(20, 16));
m_pClipboardLaout->addWidget(m_pSearchWidgetListWidget);
m_pClipboardLaout->addItem(new QSpacerItem(20, 7));
m_pClipboardLaout->addWidget(m_pShortcutOperationListWidget);
m_pClipboardLaout->addWidget(m_pSideBarClipboardLable);
this->setLayout(m_pClipboardLaout);
m_pShortcutOperationListWidget->setVisible(false);
m_pClipboardLaout->setSpacing(0);
m_pShortcutOperationListWidget->setObjectName("ShortcutOperationList");
m_pSearchWidgetListWidget->setObjectName("SearchWidgetListWidget");
m_pSideBarClipboardLable->setObjectName("SideBarClipboardLable");
/* 监听系统剪贴板 */
m_pSidebarClipboard = QApplication::clipboard();
connect(m_pSidebarClipboard, &QClipboard::dataChanged, this, &SidebarClipboardPlugin::createWidgetEntry);
/* 加载数据中中保存的数据,使用线程去加载 */
m_pThread = new QThread;
connect(m_pThread, &QThread::started, this, &SidebarClipboardPlugin::loadClipboardDb);
m_pThread->start();
/* 加载样式表 */
QFile file(SIDEBAR_CLIPBOARD_QSS_PATH);
if (file.open(QFile::ReadOnly)) {
QString strQss = QLatin1String(file.readAll());
this->setStyleSheet(strQss);
file.close();
}
}
/* 初始化右键菜单动作 */
void SidebarClipboardPlugin::initMenuAction()
{
Open = new QAction(QObject::tr("Open"), this);
connect(Open, &QAction::triggered, this, &SidebarClipboardPlugin::OpenClipboardWidget);
Exit = new QAction(QObject::tr("Exit"), this);
connect(Exit, &QAction::triggered, this, &SidebarClipboardPlugin::ExitClipboardWidget);
Hide = new QAction(QObject::tr("Hide"), this);
connect(Hide, &QAction::triggered, this, &SidebarClipboardPlugin::HideClipboardWidget);
return;
}
/* 初始化任务栏图标变量 */
void SidebarClipboardPlugin::initTray()
{
trayIconMenu = new QMenu(this);
trayIconMenu->setProperty("iconHighlightEffectMode", 1);
if (trayIconMenu == nullptr) {
qWarning() << "分配空间trayIconMenu失败";
return ;
}
trayIconMenu->addAction(Exit);
trayIconMenu->addAction(Hide);
trayIconMenu->addAction(Open);
trayIcon = new QSystemTrayIcon(this);
if (nullptr == trayIcon) {
qWarning()<< "分配空间trayIcon失败";
return ;
}
trayIcon->setContextMenu(trayIconMenu);
}
void SidebarClipboardPlugin::showEvent(QShowEvent *event)
{
qDebug() << "123123";
this->setAttribute(Qt::WA_Mapped);
QWidget::showEvent(event);
}
void SidebarClipboardPlugin::paintEvent(QPaintEvent *e)
{
QStyleOption opt;
opt.init(this);
QPainter p(this);
/* 获取当前剪贴板中字体的颜色,作为背景色;
* 白字体 --> 黑背景
* 黑字体 --> 白字体
*/
p.setBrush(opt.palette.color(QPalette::Base));
p.setBrush(QBrush(QColor("#131314")));
p.setOpacity(0.7);
p.setPen(Qt::NoPen);
p.setRenderHint(QPainter::Antialiasing); //反锯齿
p.drawRoundedRect(opt.rect, 7, 7);
p.drawRect(opt.rect);
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
QWidget::paintEvent(e);
}
/* 初始化图标 */
void SidebarClipboardPlugin::initTrayIcon(QIcon icon)
{
trayIcon->setIcon(icon);
setWindowIcon(icon);
trayIcon->setToolTip(tr("Sidebar"));
}
/* 创建剪贴板主Widget和搜索栏与条目的ListWidget界面 */
void SidebarClipboardPlugin::createWidget()
{
m_pShortcutOperationListWidget = new ClipBoardLisetWidget;
m_pShortcutOperationListWidget->setContentsMargins(16, 0, 16, 0);
m_pShortcutOperationListWidget->setFixedWidth(344);
m_pShortcutOperationListWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
m_pSearchWidgetListWidget = new QListWidget;
m_pSearchWidgetListWidget->setFixedSize(400, 42);
m_pSearchWidgetListWidget->setContentsMargins(0,0,0,0);
}
/* 创建无剪贴板板字样 */
void SidebarClipboardPlugin::createTipLable()
{
m_pSideBarClipboardLable = new QLabel(tr("No clip content"));
m_pSideBarClipboardLable->setContentsMargins(165, 0, 0, 50);
QTimer::singleShot(1, m_pSideBarClipboardLable, [=](){
QFont font = m_pSideBarClipboardLable->font();
font.setPixelSize(14);
font.setFamily("Noto Sans CJK SC");
m_pSideBarClipboardLable->setFont(font);
});
}
/* 创建查找条目 */
void SidebarClipboardPlugin::createFindClipboardWidgetItem()
{
QListWidgetItem *pListWidgetItem = new QListWidgetItem;
pListWidgetItem->setFlags(Qt::NoItemFlags);
m_pSearchArea = new SearchWidgetItemContent;
connect(m_pSearchArea->m_pClearListWidgetButton, &QPushButton::clicked, this, &SidebarClipboardPlugin::removeAllWidgetItem);
pListWidgetItem->setSizeHint(QSize(400,38));
m_pSearchWidgetListWidget->insertItem(0,pListWidgetItem);
m_pSearchWidgetListWidget->setItemWidget(pListWidgetItem, m_pSearchArea);
}
/*创建Widgetitem条目*/
void SidebarClipboardPlugin::createWidgetEntry()
{
const QMimeData *mimeData = m_pSidebarClipboard->mimeData();
if (nullptr == mimeData) {
qWarning() << "createWidgetEntry形参mimeData为空, 不创建";
return;
}
QString text;
QString format;
QList<QUrl> fileUrls;
QListWidgetItem *pListWidgetItem = new QListWidgetItem;
OriginalDataHashValue *s_pDataHashValue = new OriginalDataHashValue;
bool DeleteFlag = false;
if (mimeData->hasImage()) {
s_pDataHashValue->p_pixmap = new QPixmap((qvariant_cast<QPixmap>(mimeData->imageData())));
format = IMAGE;
if (nullptr == s_pDataHashValue->p_pixmap) {
qWarning() << "构造数据类型有错误-->p_pixmap == nullptr";
return;
}
} else if (mimeData->hasUrls()) {
s_pDataHashValue->p_pixmap = nullptr;
s_pDataHashValue->urls = mimeData->urls();
text = parsingQStringList(mimeData->urls());
format = URL;
} else if (mimeData->hasText()) {
s_pDataHashValue->p_pixmap = nullptr;
text = mimeData->text();
format = TEXT;
} else {
qWarning() << "剪贴板数据为空";
return;
}
if (text == "" && s_pDataHashValue->p_pixmap == nullptr) {
qWarning() << "text文本为空 或者 s_pDataHashValue->p_pixmap == nullptr";
return ;
}
if (format == TEXT || format == URL) {
if(booleanExistWidgetItem(text)) /* 过滤重复文本 */
DeleteFlag = true;
} else if (format == IMAGE) {
if (booleanExistWidgetImagin(*s_pDataHashValue->p_pixmap)) /* 过滤重复图片 */
DeleteFlag = true;
}
ClipboardWidgetEntry *w = new ClipboardWidgetEntry(format);
if (DeleteFlag) {
qDebug() << "此数据已存在,就是当前置顶的条数";
delete pListWidgetItem;
delete w;
delete s_pDataHashValue;
return;
}
/* hash插入QMimeData,保留原数据 */
s_pDataHashValue->WidgetEntry = w;
s_pDataHashValue->Clipbaordformat = format;
s_pDataHashValue->associatedDb = "";
s_pDataHashValue->copyDate = QDateTime::currentDateTime().toMSecsSinceEpoch();
if (s_pDataHashValue->Clipbaordformat == TEXT) {
s_pDataHashValue->text = text;
} else if (s_pDataHashValue->Clipbaordformat == URL) {
s_pDataHashValue->urls = fileUrls;
s_pDataHashValue->text = text;
}
/* 设置Sequence */
setOriginalDataSequence(s_pDataHashValue);
qDebug() << "hash表中的Sequence" << s_pDataHashValue->Sequence;
registerWidgetOriginalDataHash(pListWidgetItem, s_pDataHashValue);
/* 当超过一定数目的WidgetItem数目时,删除最后一条消息 */
if (m_pShortcutOperationListWidget->count() >= WIDGET_ENTRY_COUNT) {
removeLastWidgetItem();
}
setEntryItemSize(s_pDataHashValue, w, pListWidgetItem);
pListWidgetItem->setFlags(Qt::NoItemFlags);
/* 设置左下角提示信息 */
setCopyDataSize(s_pDataHashValue, w);
/* 将text和图片写入到Widget */
AddWidgetEntry(s_pDataHashValue, w, text);
/* 将按钮与槽对应上 */
connectWidgetEntryButton(w);
/* 插入剪贴板条目 */
m_pShortcutOperationListWidget->insertItem(0, pListWidgetItem);
m_pShortcutOperationListWidget->setItemWidget(pListWidgetItem, w);
emit Itemchange();
}
/* 根据剪贴板内容格式,写入到Label中 */
void SidebarClipboardPlugin::AddWidgetEntry(OriginalDataHashValue *s_pDataHashValue, ClipboardWidgetEntry *w, QString text)
{
if (s_pDataHashValue->associatedDb == DBDATA) {
w->m_pTimeLabel->setText(parseDateTime(QDateTime::fromMSecsSinceEpoch(s_pDataHashValue->copyDate)));
} else {
w->m_pTimeLabel->setText(getCurrutTime(QDateTime::fromMSecsSinceEpoch(s_pDataHashValue->copyDate)));
}
if (s_pDataHashValue->Clipbaordformat == TEXT) {
// 设置...字样
w->m_pCopyDataLabal->setTextFormat(Qt::PlainText);
w->m_pCopyDataLabal->setContenText(text);
} else if (s_pDataHashValue->Clipbaordformat == IMAGE) {
int width = w->m_pCopyDataLabal->width();
int height = w->m_pCopyDataLabal->height();
int pixmapWidth = s_pDataHashValue->p_pixmap->width();
int pixmapHeigh = s_pDataHashValue->p_pixmap->height();
QString formatString = QStringLiteral("%1*%2").arg(pixmapWidth).arg(pixmapHeigh);
QPixmap fitpixmap = (*s_pDataHashValue->p_pixmap).scaled(width, height, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); // 饱满填充
w->m_pCopyDataLabal->setPixmap(fitpixmap);
w->m_pInforLabel->setText(formatString);
} else if (s_pDataHashValue->Clipbaordformat == URL) {
w->m_pCopyDataLabal->setTextFormat(Qt::PlainText);
QString specificText = setSpecificString(text); // 当有多个文件时,显示特定图标,和特定的字符串显示
QString formatUrl = setMiddleFormatBody(specificText, w);
w->m_pCopyDataLabal->setText(formatUrl);
getPixmapListFileIcon(text, w->m_pCopyFileIcon); // 获取QPixmap链表
}
if (s_pDataHashValue->associatedDb == DBDATA) {
w->m_bWhetherFix = true; // 数据库加载的都需要置为已经固定
w->m_pLockButton->setVisible(false);
w->m_pCancelLockButton->setVisible(false);
}
return;
}
/* 设置复制文字字符数 复制文件个数 图片名字 */
void SidebarClipboardPlugin::setCopyDataSize(OriginalDataHashValue *s_pDataHashValue, ClipboardWidgetEntry *w)
{
QString formatString;
if (s_pDataHashValue->Clipbaordformat == TEXT) {
int size = s_pDataHashValue->text.size();
formatString = QStringLiteral("%1%2").arg(size).arg(QObject::tr("字符"));
w->m_pInforLabel->setText(formatString);
} else if (s_pDataHashValue->Clipbaordformat == IMAGE) {
formatString = QObject::tr("无信息");
} else if (s_pDataHashValue->Clipbaordformat == URL) {
int count = s_pDataHashValue->text.split("\n").size();
formatString = QStringLiteral("%1%2").arg(count).arg(QObject::tr("个文件"));
w->m_pInforLabel->setText(formatString);
}
return;
}
/* 设置...字样 */
QString SidebarClipboardPlugin::SetFormatBody(QString text, ClipboardWidgetEntry *w)
{
QFontMetrics fontMetrics(w->m_pCopyDataLabal->font());
int LableWidth = w->m_pCopyDataLabal->width(); // label一行的像素点宽度
int LableHeight = w->m_pCopyDataLabal->height(); // label高度
int fontSize = fontMetrics.width(text); // 整个字符串的像素点长度
int pixelsHigh = fontMetrics.height(); // 字体高度
qDebug() << LableWidth << LableHeight;
QString formatBody = "";
QStringList formatBodyList = text.split('\n');
int count = formatBodyList.count();
int tmp[6] = {0, 0, 0, 0, 0, 0};
int lineCount = 0;
int lastIndex = 0;
bool status = false;
/* 将当前的字符串解析出来 */
qDebug() << fontSize << LableWidth*(LableHeight/pixelsHigh) - 4*10 << LableWidth << LableHeight/pixelsHigh;
if (fontSize > LableWidth*(LableHeight/pixelsHigh) - 150) {
for (int i = 0; i < count; i++) {
int LineTextSize = fontMetrics.width(formatBodyList[i]);
if (LineTextSize > LableWidth) {
tmp[i] = (LineTextSize/LableWidth) + 1;
qDebug() << "tmp[i] " << tmp[i];
lineCount += tmp[i];
qDebug() << "lineCount" << lineCount;
} else {
lineCount++;
lastIndex = i;
}
if (lineCount >= 5) {
lastIndex = i;
tmp[5] = lineCount - tmp[i];
break;
}
}
status = false;
} else {
if (count >= 5) {
lastIndex = 4;
} else {
lastIndex = count - 1;
}
status = true;
}
for (int i = 0; i < lastIndex; i++) {
formatBody += formatBodyList[i] + '\n';
}
int lastTextSize;
int remainingRows;
/* 总行数小于4且总字数小于label的宽度 */
if (lastIndex < 4 && status) {
formatBody += formatBodyList[lastIndex];
return formatBody;
}
/* 当前的行数大于等于四行或者字数超过了label的宽度 */
if (status) {
lastTextSize = fontMetrics.width(formatBodyList[lastIndex]);
remainingRows = 1;
} else {
lastTextSize = fontMetrics.width(formatBodyList[lastIndex]);
remainingRows = 5 - tmp[5];
}
if (lastTextSize > LableWidth * remainingRows - 10) {
lastTextSize = LableWidth * remainingRows;
}
QString elidedText = formatBodyList[lastIndex];
elidedText += "aa";
formatBody += fontMetrics.elidedText(elidedText, Qt::ElideRight, lastTextSize);
return formatBody;
}
/* 设置... */
QString SidebarClipboardPlugin::setElidedString(QString text, ClipboardWidgetEntry *w)
{
QFontMetrics fontMetrics(w->m_pCopyDataLabal->font());
int LableWidth = w->m_pCopyDataLabal->width();
int fontSize = fontMetrics.width(text);
QString formatBody = text;
if(fontSize > (LableWidth - 10)) {
QStringList list = formatBody.split("\n");
if (list.size() >= 2) {
//当有几行时,只需要截取第一行就行,在第一行后面加...
// 判断第一行是否是空行
formatBody = judgeBlankLine(list);
formatBody = formatBody + "aa";
int oneFontSize = fontMetrics.width(formatBody);
if (oneFontSize > (LableWidth - 10)) {
formatBody = fontMetrics.elidedText(formatBody, Qt::ElideRight, LableWidth - 10);
return formatBody;
} else {
if (!substringSposition(formatBody, list)) {
int oneFontSize = fontMetrics.width(formatBody);
formatBody = fontMetrics.elidedText(formatBody, Qt::ElideRight, oneFontSize - 1);
return formatBody;
}
}
} else {
//说明只存在一行,在最后面加...就行
formatBody = fontMetrics.elidedText(formatBody, Qt::ElideRight, LableWidth - 10);
return formatBody;
}
} else {
QStringList list = formatBody.split("\n");
if (list.size() >= 2) {
//取得当前的有字符串的子串
formatBody = judgeBlankLine(list);
formatBody = formatBody + "aa";
if (!substringSposition(formatBody, list)) {
int oneFontSize = fontMetrics.width(formatBody);
formatBody = fontMetrics.elidedText(formatBody, Qt::ElideRight, oneFontSize - 1);
}
}
}
return formatBody;
}
void SidebarClipboardPlugin::getPixmapListFileIcon(QString UrlText, pixmapLabel *pixmapListclass)
{
QStringList FileNameList = UrlText.split("\n");
QList<QPixmap> pixmapList;
int tmp = FileNameList.count();
int cnt = 1;
for (int i = 0; i < tmp; i++) {
QIcon icon = fileSuffixGetsIcon(FileNameList[i]);
QPixmap pixmap = icon.pixmap(QSize(16, 16));
pixmapList.append(pixmap);
if (cnt >= 3) {
break;
}
cnt++;
}
pixmapListclass->setPixmapList(pixmapList);
return;
}
/* 复制多文件文件的时候, 从文本中间插入...字样 */
QString SidebarClipboardPlugin::setMiddleFormatBody(QString text, ClipboardWidgetEntry *w)
{
QFontMetrics fontMetrics(w->m_pCopyDataLabal->font());
int LableWidth = w->m_pCopyDataLabal->width();
int fontSize = fontMetrics.width(text);
QString formatBody = text;
if (fontSize > (LableWidth - 20)) {
formatBody = fontMetrics.elidedText(formatBody, Qt::ElideMiddle, LableWidth - 5);
return formatBody;
}
return formatBody;
}
/* 复制多个文件时设置特定的字符串 */
QString SidebarClipboardPlugin::setSpecificString(QString text)
{
//对字符串进行截取
QStringList UrlList = text.split("\n");
int tmp = UrlList.count(); //记录文件个数
QString UrlOne = catUrlFileName(UrlList[0]);
QString specificText = UrlOne;
return specificText;
}
QString SidebarClipboardPlugin::catUrlFileName(QString Url)
{
QStringList UrlList = Url.split("/");
int tmp = UrlList.count();
return UrlList[tmp - 1];
}
/* 设置每一个条目中的Sequence */
void SidebarClipboardPlugin::setOriginalDataSequence(OriginalDataHashValue *value)
{
if (m_pClipboardDataHash.count() == 0) {
value->Sequence = 0;
} else {
value->Sequence = iterationDataHashSearchSequence(m_pClipboardDataHash.count());
}
return;
}
/* 去除掉空行,显示有字体的行 */
QString SidebarClipboardPlugin::judgeBlankLine(QStringList list)
{
int tmp = list.count();
for (int i = 0; i < tmp; i++) {
QString dest = list.at(i);
dest = dest.trimmed();
if (dest.size() != 0) {
return list.at(i);
}
}
return list.at(0);
}
/* 解析QStringList,转换成qstring */
QString SidebarClipboardPlugin::parsingQStringList(QList<QUrl> fileUrls)
{
QString text = "";
for (int i = 0; i < fileUrls.size(); ++i) {
if (i == 0) {
text += fileUrls.value(i).toString();
} else {
text += "\n" + fileUrls.value(i).toString();
}
}
return text;
}
/* 判断当前子串位置,后面是否还有子串 */
bool SidebarClipboardPlugin::substringSposition(QString formatBody, QStringList list)
{
int tmp = list.count();
for (int i = 0; i < tmp; i++) {
QString dest = list.at(i);
if (dest == formatBody && i == tmp - 1) {
qDebug() << "后面没有字串,返回true";
return true;
}
}
return false;
}
/* 判断Url中当前后缀名,根据后缀名读取图标 */
QIcon SidebarClipboardPlugin::fileSuffixGetsIcon(QString Url)
{
if (Url == nullptr) {
qWarning() << "传入后缀名有错误, 为空";
}
int tmp = m_fileSuffix.size();
QStringList UrlList = Url.split(".");
if (UrlList.size() < 2) {
QString filePath = Url.mid(7);
QFileInfo fileinfo(filePath);
if (fileinfo.isFile()) {
return QIcon::fromTheme("unknown");//返回其余文本图标
} else if (fileinfo.isDir()) {
return QIcon::fromTheme("folder");//返回文件夹的图标
}
return QIcon::fromTheme("unknown");;
}
int cnt;
for(int i = 0; i < tmp; i++) {
if (m_fileSuffix[i] == UrlList[1]) {
cnt = i;
break;
}
}
return fileSuffixeMatchIcon(cnt);
}
/* 根据文件后缀找对应的图标 */
QIcon SidebarClipboardPlugin::fileSuffixeMatchIcon(int cnt)
{
switch (cnt) {
case Txt:
return QIcon::fromTheme("text-x-generic");
case Svg:
return QIcon::fromTheme("image-svg+xml");
case Png:
return QIcon::fromTheme("image-x-generic");
case Bmp:
return QIcon::fromTheme("image-x-generic");
case Xml:
return QIcon::fromTheme("text-xml");
case Docx:
return QIcon::fromTheme("document");
case Pptx:
return QIcon::fromTheme("application-mspowerpoint");
case Xlsx:
return QIcon::fromTheme("application-msexcel");
case Zip:
return QIcon::fromTheme("application-zip");
case Pdf:
return QIcon::fromTheme("application-pdf");
default:
return QIcon::fromTheme("unknown");
}
}
/* 往链表中加入文件后缀 */
void SidebarClipboardPlugin::AddfileSuffix()
{
m_fileSuffix << "txt" << "svg" << "png" << "bmp" << "xml" << "docx" << "pptx" << "xlsx" << "zip" << "pdf" << "pro";
return;
}
void SidebarClipboardPlugin::connectWidgetEntryButton(ClipboardWidgetEntry *w)
{
/* 固定按钮 */
connect(w->m_pLockButton, &QPushButton::clicked, this, [=](){
this->fixedWidgetEntrySlots(w);
});
/* 取消固定按钮 */
connect(w->m_pCancelLockButton, &QPushButton::clicked, this, [=]() {
cancelFixedWidgetEntrySLots(w);
});
/* 编辑按钮 */
connect(w->m_pEditButon, &QPushButton::clicked, this, [=](){
this->editButtonSlots(w);
});
/* 删除按钮 */
connect(w->m_pRemoveButton, &QPushButton::clicked, this, [=](){
this->removeButtonSlots(w);
});
/* 单击剪贴板条目,自动置顶 */
connect(w, &ClipboardWidgetEntry::doubleClicksignals, this, &SidebarClipboardPlugin::popButtonSlots);
}
/* 将数据保存到Hash表中 */
void SidebarClipboardPlugin::registerWidgetOriginalDataHash(QListWidgetItem *key, OriginalDataHashValue *value)
{
if (nullptr == key || nullptr == value) {
qDebug() << "注册:ClipboardWidgetEntry *key," << key << "OriginalDataHashValue *value值有问题" << value;
return;
}
if (m_pClipboardDataHash.value(key)) {
qDebug() << "注册:value已存在";
return;
}
m_pClipboardDataHash.insert(key, value);
}
/* 从hash表中获取OriginalDataHashValue */
OriginalDataHashValue *SidebarClipboardPlugin::GetOriginalDataValue(QListWidgetItem *key)
{
if (key == nullptr) {
qWarning() << "GetOriginalDataValue -->获取:ClipboardWidgetEntry *key为空";
return nullptr;
}
if (m_pClipboardDataHash.contains(key)) {
return m_pClipboardDataHash.value(key);
} else {
return nullptr;
}
}
/* 将剪贴板中的数据从Hash表中移除 */
void SidebarClipboardPlugin::removeOriginalDataHash(QListWidgetItem *key)
{
if (key == nullptr) {
qWarning() << "removeOriginalDataHash ----> 获取:ClipboardWidgetEntry *key为空";
return;
}
if (m_pClipboardDataHash.contains(key))
m_pClipboardDataHash.remove(key);
return;
}
/* 将新置顶widget写入到剪贴板中去 */
void SidebarClipboardPlugin::WhetherTopFirst()
{
// 获取第一个条目 当删除为第一项时,则自动将第二项置顶
QListWidgetItem *PopWidgetItem = m_pShortcutOperationListWidget->item(0);
qDebug() << "QListWidgetItem *PopWidgetItem" << PopWidgetItem;
if (PopWidgetItem == nullptr) {
qWarning() << "从剪贴板获取的PopWidgetItem指针为空";
return;
}
OriginalDataHashValue *pOriginalData = GetOriginalDataValue(PopWidgetItem);
auto data = structureQmimeDate(pOriginalData);
if (data == nullptr) {
qWarning() << "构造Qmimedata数据有问题";
return;
}
m_pSidebarClipboard->setMimeData(data);
return;
}
/* 迭代Hash表m_pClipboardDataHash*/
QListWidgetItem* SidebarClipboardPlugin::iterationClipboardDataHash(ClipboardWidgetEntry *w)
{
QHash<QListWidgetItem*, OriginalDataHashValue*>::const_iterator iter2 = m_pClipboardDataHash.constBegin();
while (iter2 != m_pClipboardDataHash.constEnd()) {
if (iter2.value()->WidgetEntry == w)
return iter2.key();
++iter2;
}
qDebug() << "没有找到Widget所对应的Item";
return nullptr;
}
/* 迭代Hash表查找其中的当前下标是否存在 */
int SidebarClipboardPlugin::iterationDataHashSearchSequence(int Index)
{
QHash<QListWidgetItem*, OriginalDataHashValue*>::const_iterator iter2 = m_pClipboardDataHash.constBegin();
int max = iter2.value()->Sequence;
while (iter2 != m_pClipboardDataHash.constEnd()) {
if (iter2.value()->Sequence > max)
max = iter2.value()->Sequence;
++iter2;
}
return max + 1;
}
/* 构造QMimeData数据 */
QMimeData *SidebarClipboardPlugin::structureQmimeDate(OriginalDataHashValue *value)
{
if (value == nullptr) {
qWarning() << "OriginalDataHashValue 为空";
return nullptr;
}
auto data = new QMimeData;
bool isCut = false;
QVariant isCutData = QVariant(isCut);
if (value->Clipbaordformat == TEXT) {
data->setData("text/plain", isCutData.toByteArray());
data->setText(value->text);
} else if (value->Clipbaordformat == URL) {
data->setData("peony-qt/is-cut", isCutData.toByteArray());
QList<QUrl> urls;
QStringList uris = value->text.split("\n");
qDebug() << "分解后Url的个数" << uris.count();
for (auto uri : uris) {
urls << uri;
}
value->urls = urls;
data->setUrls(value->urls);
} else if (value->Clipbaordformat == IMAGE) {
QVariant ImageDate = QVariant(*(value->p_pixmap));
data->setData("application/x-qt-image", isCutData.toByteArray());
data->setImageData(ImageDate);
}
return data;
}
OriginalDataHashValue *SidebarClipboardPlugin::saveOriginalData(OriginalDataHashValue *value)
{
if (value == nullptr) {
qWarning() << "保存原有剪贴板数据 ---> 传入参数有误";
return nullptr;
}
OriginalDataHashValue *p_saveOriginalData= new OriginalDataHashValue;
if (value->Clipbaordformat == TEXT) {
p_saveOriginalData->text = value->text;
p_saveOriginalData->Clipbaordformat = TEXT;
p_saveOriginalData->associatedDb = DBDATA;
p_saveOriginalData->p_pixmap = nullptr;
setOriginalDataSequence(p_saveOriginalData);
} else if (value->Clipbaordformat == URL) {
p_saveOriginalData->text = value->text;
p_saveOriginalData->Clipbaordformat = URL;
p_saveOriginalData->p_pixmap = nullptr;
setOriginalDataSequence(p_saveOriginalData);
p_saveOriginalData->urls = value->urls;
p_saveOriginalData->WidgetEntry = nullptr;
p_saveOriginalData->associatedDb = DBDATA;
} else if (value->Clipbaordformat == IMAGE) {
p_saveOriginalData->text = value->text;
p_saveOriginalData->Clipbaordformat = IMAGE;
p_saveOriginalData->p_pixmap = new QPixmap(*(value->p_pixmap));
setOriginalDataSequence(p_saveOriginalData);
p_saveOriginalData->WidgetEntry = nullptr;
p_saveOriginalData->associatedDb = DBDATA;
}
return p_saveOriginalData;
}
/* 置顶槽函数 */
void SidebarClipboardPlugin::popButtonSlots(QWidget *w)
{
if (w == nullptr) {
qWarning() << "置顶槽函数ClipboardWidgetEntry *w 为空";
return;
}
if (m_pPreviewImage != nullptr) {
delete m_pPreviewImage;
m_pPreviewImage = nullptr;
}
ClipboardWidgetEntry *widget = dynamic_cast<ClipboardWidgetEntry*>(w);
QListWidgetItem *Item = iterationClipboardDataHash(widget);
OriginalDataHashValue *value = GetOriginalDataValue(Item);
qDebug() << value->associatedDb << value->text;
auto data= structureQmimeDate(value); //构造QMimeData数据
if (value->associatedDb == DBDATA) {
OriginalDataHashValue *p = saveOriginalData(value); //保存原有的数据类型
removeOriginalDataHash(Item); //移除Hash表中的原始数据
QListWidgetItem *deleteItem = m_pShortcutOperationListWidget->takeItem(m_pShortcutOperationListWidget->row(Item)); //删除Item;
delete deleteItem;
deleteItem = nullptr;
popCreatorDbHaveDate(p);
m_pSidebarClipboard->setMimeData(data); //将新的数据set剪贴板中
return;
}
removeOriginalDataHash(Item); //移除Hash表中的原始数据
QListWidgetItem *deleteItem = m_pShortcutOperationListWidget->takeItem(m_pShortcutOperationListWidget->row(Item)); //删除Item;
delete deleteItem;
deleteItem = nullptr;
m_pSidebarClipboard->setMimeData(data); //将新的数据set剪贴板中
return;
}
/* 删除槽函数 */
void SidebarClipboardPlugin::removeButtonSlots(ClipboardWidgetEntry *w)
{
if (w == nullptr) {
qWarning() << "删除槽函数ClipboardWidgetEntry *w 为空";
return;
}
QListWidgetItem *Item = iterationClipboardDataHash(w);
OriginalDataHashValue *s_deleteDataHashValue = GetOriginalDataValue(Item);
if (s_deleteDataHashValue->Clipbaordformat ==IMAGE && s_deleteDataHashValue->associatedDb == DBDATA) {
QString DeleteFile = QStringLiteral("rm %1").arg(s_deleteDataHashValue->text.mid(7));
QProcess::execute(DeleteFile);//删除保存在本地的文件
}
int tmp = m_pShortcutOperationListWidget->row(Item); //记录删除时哪一行
m_pClipboardDb->deleteSqlClipboardDb(s_deleteDataHashValue->text);
removeOriginalDataHash(Item);
QListWidgetItem *item = m_pShortcutOperationListWidget->takeItem(tmp); //删除Item;
delete item;
// 判断当前删除的是不是第一个条目
if (0 == tmp) {
qDebug() << "删除当前的条目为第一个条目";
WhetherTopFirst();
}
emit Itemchange();
return;
}
/* 编辑槽函数 */
void SidebarClipboardPlugin::editButtonSlots(ClipboardWidgetEntry *w)
{
/* 防止重复创建 */
if (w == nullptr) {
qWarning() << "传入值为空";
return;
}
qDebug() << "当前label中的文本数据" << w->m_pCopyDataLabal->text();
EditorWidget EditWidget;
/* 获取保存在hash表中的数据,改变之前保存的数据 */
QListWidgetItem *Item = iterationClipboardDataHash(w);
OriginalDataHashValue* pOriginalData = GetOriginalDataValue(Item);
QString text = pOriginalData->text;
EditWidget.m_pEditingArea->setPlainText(text);
/* 设置左右填充 */
QTextDocument *document = EditWidget.m_pEditingArea->document();
QTextFrame *rootFrame=document->rootFrame();
QTextFrameFormat format;
format.setPadding(10);
format.setBorderStyle(QTextFrameFormat::BorderStyle_Dotted);
rootFrame->setFrameFormat(format);
int nRet = EditWidget.exec();
if (nRet == QDialog::Accepted) {
QString formatBody = SetFormatBody(EditWidget.m_pEditingArea->toPlainText(), w); // 设置...字样
qDebug () << "formatBody....." << formatBody;
if (EditWidget.m_pEditingArea->toPlainText() != text) {
//当编辑后数据改变时,就需要将m_pLabelText中的value改变
w->m_pCopyDataLabal->setContenText(formatBody);
pOriginalData->text = EditWidget.m_pEditingArea->toPlainText();
structureQmimeDate(pOriginalData);
if (pOriginalData->associatedDb == DBDATA) {
m_pClipboardDb->updateSqlClipboardDb(pOriginalData->text, pOriginalData->Clipbaordformat, pOriginalData->Sequence, text); //更新数据库表中的数据
}
}
//获取当前条目所在位置,是不是在第一
int row_num = m_pShortcutOperationListWidget->row(Item);
if (row_num == 0) {
QMimeData *data = structureQmimeDate(pOriginalData);
m_pSidebarClipboard->setMimeData(data); //将新的数据set剪贴板中去
}
qDebug() << "当前所在的条木" << row_num;
} else if (nRet == QDialog::Rejected) {
qDebug() << "编辑框取消操作";
}
return;
}
/* 固定条目槽函数 */
void SidebarClipboardPlugin::fixedWidgetEntrySlots(ClipboardWidgetEntry *w)
{
if (w == nullptr) {
qWarning() << "删除槽函数fixedWidgetEntrySlots *w 为空";
return;
}
QListWidgetItem *Item = iterationClipboardDataHash(w);
OriginalDataHashValue *s_pDataHashValue = GetOriginalDataValue(Item);
s_pDataHashValue->associatedDb = DBDATA;
qDebug() << "s_pDataHashValue->Clipbaordformat" << s_pDataHashValue->Clipbaordformat;
if (s_pDataHashValue->Clipbaordformat == TEXT || s_pDataHashValue->Clipbaordformat == URL) {
m_pClipboardDb->insertSqlClipbarodDb(s_pDataHashValue->text, s_pDataHashValue->Clipbaordformat, s_pDataHashValue->Sequence, s_pDataHashValue->copyDate);
} else if (s_pDataHashValue->Clipbaordformat == IMAGE) {
int seq = m_pClipboardDb->SelectSqlClipbaordDbId();
QString url_filepath = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + QStringLiteral("/%1.bmp").arg(seq + 1);
s_pDataHashValue->text = "file://" + url_filepath; //将文件路径已Url的方式保存
m_pClipboardDb->insertSqlClipbarodDb(s_pDataHashValue->text, s_pDataHashValue->Clipbaordformat, s_pDataHashValue->Sequence, s_pDataHashValue->copyDate);
s_pDataHashValue->p_pixmap->save(url_filepath, "bmp", 100);
}
w->m_pLockButton->setVisible(false);
w->m_pCancelLockButton->setVisible(true);
w->m_bWhetherFix = true;
return;
}
/* 取消固定槽函数 */
void SidebarClipboardPlugin::cancelFixedWidgetEntrySLots(ClipboardWidgetEntry *w)
{
if (w == nullptr) {
qWarning() << "删除槽函数fixedWidgetEntrySlots *w 为空";
return;
}