Skip to content

Commit 83a2f5d

Browse files
committed
App: drag json to import favorte
1 parent fcbe36c commit 83a2f5d

7 files changed

Lines changed: 135 additions & 75 deletions

File tree

App/Client/Favorite/FavoriteDatabase.cpp

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -23,18 +23,20 @@ bool CFavoriteDatabase::OnInitializeSqliteDatabase()
2323
QSqlQuery query(GetDatabase());
2424

2525
// Create favorite table
26-
bool success = query.exec(
26+
QString szSql =
2727
"CREATE TABLE IF NOT EXISTS favorite ("
2828
" id INTEGER PRIMARY KEY AUTOINCREMENT," // the id is the key of tree table
2929
" name TEXT NOT NULL,"
3030
" icon INTEGER DEFAULT 0,"
3131
" file TEXT UNIQUE NOT NULL,"
3232
" description TEXT"
33-
")"
34-
);
33+
")";
34+
bool success = query.exec(szSql);
3535

3636
if (!success) {
37-
qCritical(log) << "Failed to create favorite table:" << query.lastError().text();
37+
SetError("Failed to create favorite table: " + query.lastError().text()
38+
+ "; Sql: " + szSql);
39+
qCritical(log) << GetError();
3840
return false;
3941
}
4042

@@ -49,7 +51,7 @@ bool CFavoriteDatabase::OnInitializeSqliteDatabase()
4951
qDebug(log) << "Failed to drop trigger delete_icon_after_favorite:" << query.lastError().text();
5052
}
5153
// Create trigger
52-
QString szSql = R"(
54+
szSql = R"(
5355
CREATE TRIGGER delete_icon_after_favorite
5456
AFTER DELETE ON favorite
5557
FOR EACH ROW
@@ -79,20 +81,21 @@ bool CFavoriteDatabase::OnInitializeMySqlDatabase()
7981
QSqlQuery query(GetDatabase());
8082

8183
// Create favorite table
82-
success = query.exec(
84+
QString szSql =
8385
"CREATE TABLE IF NOT EXISTS favorite ("
8486
" id INTEGER PRIMARY KEY AUTO_INCREMENT," // the id is the key of tree table
8587
" name TEXT NOT NULL,"
8688
" icon INTEGER DEFAULT 0,"
8789
" file TEXT NOT NULL,"
8890
" description TEXT,"
8991
" UNIQUE KEY uk_favorite_file (file(255))"
90-
")"
91-
);
92+
")";
93+
success = query.exec(szSql);
9294
if (!success) {
93-
qCritical(log) << "Failed to create favorite table:"
94-
<< query.lastError().text()
95-
<< "Sql:" << query.executedQuery();
95+
SetError("Failed to create favorite table: "
96+
+ query.lastError().text()
97+
+ "; Sql: " + szSql);
98+
qCritical(log) << GetError();
9699
return false;
97100
}
98101

@@ -103,7 +106,7 @@ bool CFavoriteDatabase::OnInitializeMySqlDatabase()
103106
<< "Sql:" << query.executedQuery();
104107
}
105108
// Create trigger
106-
QString szSql = R"(
109+
szSql = R"(
107110
CREATE TRIGGER delete_icon_after_favorite
108111
AFTER DELETE ON favorite
109112
FOR EACH ROW
@@ -177,7 +180,8 @@ int CFavoriteDatabase::AddFavorite(const QString &szFile,
177180
bool success = false;
178181
// 使用事务确保数据一致性
179182
if (!db.transaction()) {
180-
qCritical(log) << "Failed to start transaction:" << db.lastError().text();
183+
SetError("Failed to start transaction: " + db.lastError().text());
184+
qCritical(log) << GetError();
181185
return ret;
182186
}
183187

@@ -208,15 +212,13 @@ int CFavoriteDatabase::AddFavorite(const QString &szFile,
208212
if (!success) {
209213
QString szErr = "Failed to insert favorite table: " + query.lastError().text();
210214
SetError(szErr);
211-
qCritical(log) << szErr;
212215
throw std::runtime_error(szErr.toStdString());
213216
}
214217

215218
key = query.lastInsertId().toInt();
216219
if(0 >= key) {
217220
QString szErr = "Failed to insert favorite table";
218221
SetError(szErr);
219-
qCritical(log) << szErr;
220222
throw std::runtime_error(szErr.toStdString());
221223
}
222224
}
@@ -229,15 +231,13 @@ int CFavoriteDatabase::AddFavorite(const QString &szFile,
229231
if (0 >= id) {
230232
QString szErr = "Failed to insert favorite folder table";
231233
SetError(szErr);
232-
qCritical(log) << szErr;
233234
throw std::runtime_error(szErr.toStdString());
234235
}
235236

236237
// 提交事务
237238
if (!db.commit()) {
238239
QString szErr = "Failed to commit transaction:" + db.lastError().text();
239240
SetError(szErr);
240-
qCritical(log) << szErr;
241241
throw std::runtime_error(szErr.toStdString());
242242
}
243243

@@ -277,10 +277,11 @@ bool CFavoriteDatabase::UpdateFavorite(
277277
szSql = "UPDATE favorite SET " + szSql + " WHERE id=" + QString::number(id);
278278
//qDebug(log) << "Sql:" << szSql;
279279
bool ok = query.exec(szSql);
280-
if(!ok)
281-
qCritical(log) << "Failed to update favorite:"
282-
<< id << query.lastError().text()
283-
<< "Sql:" << szSql;
280+
if(!ok) {
281+
SetError("Failed to update favorite: " + query.lastError().text()
282+
+ "; Sql: " + szSql);
283+
qCritical(log) << GetError();
284+
}
284285
return ok;
285286
}
286287

@@ -306,10 +307,11 @@ bool CFavoriteDatabase::UpdateFavorite(
306307
szSql = "UPDATE favorite SET " + szSql + " WHERE file=\"" + szFile + "\"";
307308
//qDebug(log) << "Sql:" << szSql;
308309
bool ok = query.exec(szSql);
309-
if(!ok)
310-
qCritical(log) << "Failed to update favorite:"
311-
<< szFile << query.lastError().text()
312-
<< "Sql:" << szSql;
310+
if(!ok) {
311+
SetError("Failed to update favorite: " + query.lastError().text()
312+
+ "; Sql: " + szSql);
313+
qCritical(log) << GetError();
314+
}
313315
return ok;
314316
}
315317

@@ -330,9 +332,10 @@ CFavoriteDatabase::Item CFavoriteDatabase::GetFavorite(int id)
330332
//qDebug(log) << "Bound value:" << query.boundValues();
331333
bool ok = query.exec();
332334
if(!ok) {
333-
qCritical(log) << "Failed to get favorite:"
334-
<< id << query.lastError().text()
335-
<< "Sql:" << query.executedQuery();
335+
SetError("Failed to get favorite: " + query.lastError().text()
336+
+ "; Sql: " + query.executedQuery()
337+
+ "; id: " + QString::number(id));
338+
qCritical(log) << GetError();
336339
return item;
337340
}
338341
if(query.next()) {
@@ -362,9 +365,9 @@ QList<CFavoriteDatabase::Item> CFavoriteDatabase::GetFavorite(const QString &szF
362365
//qDebug(log) << "Bound value:" << query.boundValues();
363366
bool ok = query.exec();
364367
if(!ok) {
365-
qCritical(log) << "Failed to get favorite:"
366-
<< szFile << query.lastError().text()
367-
<< "Sql:" << query.executedQuery();
368+
SetError("Failed to get favorite: " + query.lastError().text()
369+
+ "; Sql: " + query.executedQuery() + "; szFile: " + szFile);;
370+
qCritical(log) << GetError();
368371
return lstItems;
369372
}
370373
if(query.next()) {
@@ -427,9 +430,10 @@ bool CFavoriteDatabase::OnDeleteKey(int key)
427430
//qDebug(log) << "Bound value:" << query.boundValues();
428431
bool ok = query.exec();
429432
if(!ok) {
430-
qCritical(log) << "Failed to delete favorite:"
431-
<< key << query.lastError().text()
432-
<< "Sql:" << query.executedQuery();
433+
SetError("Failed to delete favorite: " + query.lastError().text()
434+
+ "; Sql: " + query.executedQuery()
435+
+ "; key: " + QString::number(key));
436+
qCritical(log) << GetError();
433437
return false;
434438
}
435439
return ok;
@@ -449,7 +453,8 @@ bool CFavoriteDatabase::ImportFromJson(const QJsonObject &obj)
449453
{
450454
QJsonArray favorites = obj["favorite"].toArray();
451455
if(favorites.isEmpty()) {
452-
qCritical(log) << "The file format is error. Json without favorite";
456+
SetError(tr("The file format is error. Json without favorite"));
457+
qCritical(log) << GetError();
453458
return false;
454459
}
455460

App/Client/Favorite/FavoriteView.cpp

Lines changed: 61 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,7 @@ void CFavoriteView::setupTreeView(QLayout *layout)
185185
return;
186186
layout->addWidget(m_pTreeView);
187187

188-
//m_pTreeView->installEventFilter(this);
189-
m_pTreeView->viewport()->installEventFilter(this);
190-
m_pTreeView->setAcceptDrops(true);
191-
m_pTreeView->setDragEnabled(true);
192-
m_pTreeView->setDragDropMode(QTreeView::InternalMove);
193-
m_pTreeView->setDefaultDropAction(Qt::MoveAction);
194-
m_pTreeView->setDropIndicatorShown(true);
188+
InitialDragDrop();
195189

196190
m_pTreeView->setUniformRowHeights(true);
197191
m_pTreeView->setHeaderHidden(true);
@@ -471,12 +465,13 @@ void CFavoriteView::slotImport()
471465
if (m_pDatabase->ImportFromJsonFile(filename)) {
472466
slotRefresh();
473467
QMessageBox::information(
474-
this, tr("Import favorite"),
468+
this, tr("Success"),
475469
tr("Successfully imported favorite from JSON file: %1").arg(filename));
476470
} else {
477-
QMessageBox::critical(
478-
this, tr("Import favorite"),
479-
tr("Failed to import favorite from JSON file: %1").arg(filename));
471+
QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
472+
if(!m_pDatabase->GetError().isEmpty())
473+
szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
474+
QMessageBox::critical(this, tr("Failure"), szErr);
480475
}
481476
return;
482477
}
@@ -498,24 +493,45 @@ void CFavoriteView::slotExport()
498493
if(0 == fi.suffix().compare("json", Qt::CaseInsensitive)) {
499494
if (m_pDatabase->ExportToJsonFile(filename)) {
500495
QMessageBox::information(
501-
this, tr("Export favorite"),
496+
this, tr("Success"),
502497
tr("Favorite successfully exported to JSON file: %1").arg(filename));
503498
} else {
504-
QMessageBox::critical(
505-
this, tr("Export favorite"),
506-
tr("Failed to export favorite to JSON file: %1").arg(filename));
499+
QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
500+
if(!m_pDatabase->GetError().isEmpty())
501+
szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
502+
QMessageBox::critical(this, tr("Failure"), szErr);
507503
}
508504
return;
509505
}
510-
QMessageBox::critical(this, tr("Export favorite"),
506+
QMessageBox::critical(this, tr("Failure"),
511507
tr("Invalid file: %1").arg(filename) + "\n\n"
512508
+ tr("Please use JSON file"));
513509
}
514510
}
515511

512+
void CFavoriteView::InitialDragDrop()
513+
{
514+
if(!m_pTreeView || !m_pTreeView->viewport())
515+
return;
516+
//m_pTreeView->installEventFilter(this);
517+
m_pTreeView->viewport()->installEventFilter(this);
518+
m_pTreeView->setAcceptDrops(true);
519+
m_pTreeView->setDragEnabled(true);
520+
m_pTreeView->setDragDropMode(QTreeView::InternalMove);
521+
m_pTreeView->setDefaultDropAction(Qt::MoveAction);
522+
m_pTreeView->setDropIndicatorShown(true);
523+
}
524+
516525
void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
517526
{
518527
qDebug(log) << Q_FUNC_INFO;
528+
auto urls = event->mimeData()->urls();
529+
if(event->mimeData()->hasUrls() && urls.length() == 1) {
530+
//qDebug(log) << event->mimeData()->urls();
531+
event->acceptProposedAction();
532+
return;
533+
}
534+
519535
const CFavoriteMimeData* pData =
520536
qobject_cast<const CFavoriteMimeData*>(event->mimeData());
521537
if (pData)
@@ -529,33 +545,50 @@ void CFavoriteView::dragEnterEvent(QDragEnterEvent *event)
529545
} else {
530546
setCursor(Qt::DragCopyCursor);
531547
}//*/
532-
} else
533-
event->ignore();
548+
}
534549
}
535550

536551
void CFavoriteView::dragMoveEvent(QDragMoveEvent *event)
537552
{
538-
qDebug(log) << Q_FUNC_INFO;
539-
const CFavoriteMimeData* pData =
540-
qobject_cast<const CFavoriteMimeData*>(event->mimeData());
541-
if (!pData)
542-
{
543-
event->ignore();
544-
return;
545-
}
553+
// qDebug(log) << Q_FUNC_INFO;
554+
// const CFavoriteMimeData* pData =
555+
// qobject_cast<const CFavoriteMimeData*>(event->mimeData());
556+
// if (!pData)
557+
// {
558+
// event->ignore();
559+
// return;
560+
// }
546561
}
547562

548563
void CFavoriteView::dropEvent(QDropEvent *event)
549564
{
550565
qDebug(log) << Q_FUNC_INFO << "drop action:" << event->dropAction();
566+
bool bRet = false;
567+
auto urls = event->mimeData()->urls();
568+
foreach(auto url, urls)
569+
{
570+
if(url.isLocalFile()) {
571+
QString filename = url.toLocalFile();
572+
if (m_pDatabase->ImportFromJsonFile(filename)) {
573+
slotRefresh();
574+
emit sigShowMessageBox(tr("Success"), tr("Successfully imported favorite from JSON file: %1").arg(filename), QMessageBox::Information);
575+
} else {
576+
QString szErr = tr("Failed to import favorite from JSON file: %1").arg(filename) + "\n";
577+
if(!m_pDatabase->GetError().isEmpty())
578+
szErr += "\n" + tr("Error: ") + m_pDatabase->GetError();
579+
emit sigShowMessageBox(tr("Failure"), szErr, QMessageBox::Critical);
580+
}
581+
}
582+
}
583+
if(bRet)
584+
event->accept();
551585

552586
const CFavoriteMimeData *pData = qobject_cast<const CFavoriteMimeData*>(event->mimeData());
553587
if(!pData || pData->m_Items.isEmpty() || !m_pTreeView || !m_pModel) {
554588
event->ignore();
555589
return;
556590
}
557591

558-
bool bRet = false;
559592
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
560593
auto idxParent = m_pTreeView->indexAt(event->position().toPoint());
561594
#else
@@ -654,7 +687,7 @@ bool CFavoriteView::eventFilter(QObject *watched, QEvent *event)
654687
{
655688
// 处理 treeview 的事件
656689
if (watched == m_pTreeView->viewport()) { // 处理 viewport 的事件
657-
qDebug(log) << Q_FUNC_INFO << "Viewport event:" << event->type();
690+
//qDebug(log) << Q_FUNC_INFO << "Viewport event:" << event->type();
658691

659692
switch (event->type()) {
660693
case QEvent::DragEnter:

App/Client/Favorite/FavoriteView.h

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include <QTreeView>
66
#include <QStandardItem>
7+
#include <QMessageBox>
78

89
#include "TitleBar.h"
910
#include "FavoriteDatabase.h"
@@ -39,12 +40,24 @@ public Q_SLOTS:
3940
Q_SIGNALS:
4041
void sigStart(const QString &szFile, bool bOpenSettings);
4142
void sigFavorite();
42-
43-
protected:
44-
virtual bool eventFilter(QObject *watched, QEvent *event) override;
43+
/*!
44+
* \~chinese
45+
* \brief 用消息对话框(QMessageBox)显示信息
46+
*
47+
* \~english
48+
* \brief Use message box display information
49+
*
50+
* \~
51+
* \see COperate::sigShowMessageBox()
52+
*/
53+
virtual void sigShowMessageBox(const QString& title, const QString& message,
54+
const QMessageBox::Icon& icon);
55+
private:
56+
void InitialDragDrop();
4557
virtual void dragEnterEvent(QDragEnterEvent *event) override;
4658
virtual void dragMoveEvent(QDragMoveEvent *event) override;
4759
virtual void dropEvent(QDropEvent *event) override;
60+
virtual bool eventFilter(QObject *watched, QEvent *event) override;
4861

4962
virtual void mousePressEvent(QMouseEvent *event) override;
5063
virtual void mouseMoveEvent(QMouseEvent *event) override;

App/Client/android/AndroidManifest.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,9 @@
4242
android:label="@string/app_name"
4343
android:launchMode="singleTop"
4444
android:screenOrientation="unspecified"
45-
android:exported="true"
46-
android:windowSoftInputMode="adjustResize|stateHidden">
47-
45+
android:exported="true">
46+
<!-- android:windowSoftInputMode="adjustResize|stateHidden" -->
47+
4848
<intent-filter>
4949
<action android:name="android.intent.action.MAIN"/>
5050
<category android:name="android.intent.category.LAUNCHER"/>

0 commit comments

Comments
 (0)