1 
2 /***************************************************************************
3                           searchwindow.cpp  -  description
4                              -------------------
5     begin                : sept 2020
6     copyright            : (C) 2020 by Jaime Robles
7     email                : jaime@robles.es
8  ***************************************************************************/
9 
10 /*****************************************************************************
11  * This file is part of KLog.                                                *
12  *                                                                           *
13  *    KLog is free software: you can redistribute it and/or modify           *
14  *    it under the terms of the GNU General Public License as published by   *
15  *    the Free Software Foundation, either version 3 of the License, or      *
16  *    (at your option) any later version.                                    *
17  *                                                                           *
18  *    KLog is distributed in the hope that it will be useful,                *
19  *    but WITHOUT ANY WARRANTY; without even the implied warranty of         *
20  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
21  *    GNU General Public License for more details.                           *
22  *                                                                           *
23  *    You should have received a copy of the GNU General Public License      *
24  *    along with KLog.  If not, see <https://www.gnu.org/licenses/>.         *
25  *                                                                           *
26  *****************************************************************************/
27 
28 #include "searchwindow.h"
29 
30 
SearchWindow(DataProxy_SQLite * dp,QWidget * parent)31 SearchWindow::SearchWindow(DataProxy_SQLite *dp, QWidget *parent) : QWidget(parent)
32 {
33     //qDebug() << "SearchWindow::SearchWindow: "  << QT_ENDL;
34     dataProxy = dp;
35     showStationCallsignInHeader = true;
36     //sortingThroughProxyModel = false;
37     searchModel = new SearchModel(dataProxy, this);
38     util = new Utilities;
39     connect(searchModel, SIGNAL(queryError(QString, QString, QString, QString)), this, SLOT(slotQueryErrorManagement(QString, QString, QString, QString)) );
40     //logView = new QTableView;
41     treeView = new QTreeView;
42     //dxccStatusWidget = new DXCCStatusWidget(dataProxy);
43     //elogClublog = new eLogClubLog();
44     currentLog = -1;
45     //proxyModel = new LogViewSortFilterProxyModel(this);
46 
47 
48     awards = new Awards(dataProxy, Q_FUNC_INFO);
49 
50     createUI();
51     createActions();
52     setDefaultData();
53     //qDebug() << "SearchWindow::SearchWindow: - END"  << QT_ENDL;
54 
55 }
56 
~SearchWindow()57 SearchWindow::~SearchWindow()
58 {
59 //    emit clearError();
60 }
61 
62 
sortColumn(const int _c)63 void SearchWindow::sortColumn(const int _c)
64 {
65     //proxyModel->sort(_c);
66     searchModel->sort(_c, Qt::AscendingOrder);
67 }
68 
clear()69 void SearchWindow::clear()
70 {
71       //qDebug() << "SearchWindow::clear "  << QT_ENDL;
72     qslingNeeded = false;
73 }
74 
createUI()75 void SearchWindow::createUI()
76 {
77       //qDebug() << "SearchWindow::createUI"  << QT_ENDL;
78 
79 
80     //logView->setContextMenuPolicy(Qt::CustomContextMenu);
81     //logView->setSortingEnabled(true);
82 
83     QStringList labels;
84     if (showStationCallsignInHeader)
85     {
86         labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("Station Callsign") << tr("ID") ;
87         //treeView->setColumnCount(8);
88     }
89     else
90     {
91        labels << tr("Call") << tr("Date/Time") << tr("Band") << tr("Mode") << tr("QSL Sent") << tr("QSL Rcvd") << tr("ID") ;
92        //treeView->setColumnCount(7);
93     }
94 
95     //searchModel->setColumnsToDX();
96 
97     /*
98     QStandardItemModel model;
99     model.setColumnCount (1);
100     model.setHeaderData (0, Qt::Horizontal, "Player");
101     */
102     //treeView->setHeaderLabels(labels);
103     //QTreeWidgetItem *item = new QTreeWidgetItem(searchResultsTreeWidget);
104    (treeView->header())->resizeSections(QHeaderView::ResizeToContents);
105 
106 
107     //treeView->clear();
108     //searchResultsTreeWidget->collapseAll();
109     treeView->setSortingEnabled(true);
110 
111     treeView->setContextMenuPolicy(Qt::CustomContextMenu);
112     treeView->setSortingEnabled(true);
113 
114 
115     QVBoxLayout *layout = new QVBoxLayout;
116     layout->addWidget(treeView);
117     //layout->addWidget(logView);
118     setLayout(layout);
119 }
120 
setDefaultData()121 void SearchWindow::setDefaultData()
122 {
123        //qDebug() << "SearchWindow::setDefaultData"  << QT_ENDL;
124 }
125 
setStationCallsignInHeader(const bool _h)126 void SearchWindow::setStationCallsignInHeader(const bool _h)
127 {
128     showStationCallsignInHeader = _h;
129     setColumnsToDX();
130 
131 }
132 
createlogPanel(const int _currentLog)133 void SearchWindow::createlogPanel(const int _currentLog)
134 {
135       //qDebug() << "SearchWindow::createlogPanel: " << QString::number(_currentLog) << QT_ENDL;
136     currentLog = _currentLog;
137     searchModel->createSearchModel(currentLog);
138 
139     treeView->setModel(searchModel);
140     treeView->setCurrentIndex(searchModel->index(0, 0));
141 
142     //logView->setModel(searchModel);
143     //logView->setCurrentIndex(searchModel->index(0, 0));
144 
145     //setProxyModel(false);
146 
147     //QString contestMode = dataProxy->getLogTypeOfUserLog(currentLog);
148     setColumnsToDX();
149     sortColumn(1);  //Initial sort by column 1 (date & time)
150 
151     //qDebug() << "SearchWindow::createlogPanel " << searchModel->record(0).field(1).value().toString() << QT_ENDL;
152     //logView->setSelectionMode(QAbstractItemView::ExtendedSelection);
153     //logView->setSelectionBehavior(QAbstractItemView::SelectRows);
154     //logView->resizeColumnsToContents();
155     //logView->horizontalHeader()->setStretchLastSection(true);
156     //logView->sortByColumn(1);
157 
158     treeView->setSelectionMode(QAbstractItemView::ExtendedSelection);
159     treeView->setSelectionBehavior(QAbstractItemView::SelectRows);
160     //treeView->resizeColumnsToContents();
161     //treeView->horizontalHeader()->setStretchLastSection(true);
162     treeView->sortByColumn(1, Qt::AscendingOrder);
163 }
164 
setColumnsToDX()165 void SearchWindow::setColumnsToDX()
166 {
167       //qDebug() << "SearchWindow::setColumnsToDX"  << QT_ENDL;
168 
169     QString stringQuery;
170     //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, id FROM log LIMIT 1");
171     stringQuery = QString("SELECT * FROM log LIMIT 1");
172     QSqlQuery query;
173     bool sqlOK = query.exec(stringQuery);
174     if (!sqlOK)
175     {
176         emit queryError(Q_FUNC_INFO, query.lastError().databaseText(), query.lastError().nativeErrorCode(), query.lastQuery());
177     }
178 
179     //qDebug() << "SearchWindow::setColumnsToDX - Query: "  << query.lastQuery() << QT_ENDL;
180     QSqlRecord rec;
181     rec = query.record(); // Number of columns
182     int columns = rec.count();
183 
184     for (int i=0; i < columns; i++)
185     {
186         //logView->setColumnHidden(i, true);
187         treeView->setColumnHidden(i, true);
188     }
189 
190     columns = rec.indexOf("qso_date");
191     treeView->setColumnHidden(columns, false);
192     searchModel->setHeaderData(columns, Qt::Horizontal,tr("Date/time"));
193     searchModel->setSort(columns, Qt::AscendingOrder);
194 
195     columns = rec.indexOf("call");
196     treeView->setColumnHidden(columns, false);
197     searchModel->setHeaderData(columns, Qt::Horizontal,tr("Call"));
198 
199     columns = rec.indexOf("bandid");
200     searchModel->setBandIdColumn(columns);
201     treeView->setColumnHidden(columns, false);
202     searchModel->setRelation(columns, QSqlRelation("band", "id", "name"));
203     searchModel->setHeaderData(columns, Qt::Horizontal,tr("Band"));
204 
205 
206     columns = rec.indexOf("modeid");
207     treeView->setColumnHidden(columns, false);
208     searchModel->setHeaderData(columns, Qt::Horizontal,tr("Mode"));
209     searchModel->setRelation(columns, QSqlRelation("mode", "id", "submode"));
210     searchModel->setModeIdColumn(columns);
211 
212     columns = rec.indexOf("qsl_sent");
213     treeView->setColumnHidden(columns, false);
214     searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Sent"));
215 
216     columns = rec.indexOf("qsl_rcvd");
217     treeView->setColumnHidden(columns, false);
218     searchModel->setHeaderData(columns, Qt::Horizontal,tr("QSL Rcvd"));
219 
220     if (showStationCallsignInHeader)
221     {
222         columns = rec.indexOf("station_callsign");
223         treeView->setColumnHidden(columns, false);
224         searchModel->setHeaderData(columns, Qt::Horizontal,tr("Station callsign"));
225     }
226 
227     columns = rec.indexOf("dxcc");
228     searchModel->setDXCCColumn(columns);
229     columns = rec.indexOf("lognumber");
230     searchModel->setLogNColumn(columns);
231 
232     //columns = rec.indexOf("id");
233 
234     //treeView->setColumnHidden(columns, false);
235 }
236 
refresh()237 void SearchWindow::refresh()
238 {
239        //qDebug() << "SearchWindow::refresh"  << QT_ENDL;
240 
241     searchModel->select();
242 }
243 
createActions()244 void SearchWindow::createActions()
245 {
246     createActionsCommon();
247 }
248 
createActionsCommon()249 void SearchWindow::createActionsCommon()
250 {
251     //LOG VIEW
252 
253         //connect(logView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) );
254         //connect(logView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) );
255         connect(treeView, SIGNAL(customContextMenuRequested( const QPoint& ) ), this, SLOT(slotRighButtonFromLog( const QPoint& ) ) );
256         connect(treeView, SIGNAL(doubleClicked ( const QModelIndex& ) ), this, SLOT(slotDoubleClickLog( const QModelIndex& ) ) );
257 }
258 
slotRighButtonFromLog(const QPoint & pos)259 void SearchWindow::slotRighButtonFromLog(const QPoint& pos)
260 {
261     //qDebug() << "SearchWindow::slotshowRighButtonFromLog: " << QString::number((treeView->indexAt(pos)).row())  << QT_ENDL;
262     //int row = (logView->indexAt(pos)).row();
263     int row = (treeView->indexAt(pos)).row();
264     //int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt();
265     showMenuRightButtonFromLogCreateActions();
266     rightButtonFromLogMenu(row);
267     //TODO: To be added to the SearchWindow and create an action that emist the QSO id
268 }
269 
rightButtonFromLogMenu(const int row)270 void SearchWindow::rightButtonFromLogMenu(const int row)
271 {
272     //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu: QSO_id: " << QString::number(row) << QT_ENDL;
273 
274     int _qsoID = ((searchModel->index(row, 0)).data(0)).toInt();
275     //qDebug() << "SearchWindow::slotshowRighButtonFromLogMenu:  QSOid: " << QString::number(_qsoID) << QT_ENDL;
276     bool qslReceived = isQSLReceived(_qsoID);
277     bool qslSent = isQSLSent(_qsoID);
278     QMenu menu(this);
279 
280     menu.addAction(delQSOFromLogAct);
281     delQSOFromLogAct->setData(row);
282     menu.addAction(qsoToEditFromLogAct);
283     qsoToEditFromLogAct->setData(row);
284     menu.addAction(checkQRZCOMFromLogAct);
285     checkQRZCOMFromLogAct->setData(row);
286     menu.addAction(checkDXHeatFromLogAct);
287     checkDXHeatFromLogAct->setData(row);
288 
289         menu.addSeparator();
290         if (qslSent)
291         {
292         }
293         else
294         {
295             QMenu *menuSentQsl = menu.addMenu(tr("QSL Send"));
296             menuSentQsl->addAction(qslSentViaBureauFromLogAct);
297             menuSentQsl->addAction(qslSentViaDirectFromLogAct);
298             menuSentQsl->addAction(qslSentRequestedAct);
299             if (!qslReceived)
300             {
301                 menuSentQsl->addAction(qslSentViaBureauMarkRcvReqFromSearchAct);
302                 menuSentQsl->addAction(qslSentViaDirectMarkRcvReqFromSearchAct);
303                 qslSentViaBureauMarkRcvReqFromSearchAct->setData(row);
304                 qslSentViaDirectMarkRcvReqFromSearchAct->setData(row);
305             }
306             qslSentViaBureauFromLogAct->setData(row);
307             qslSentViaDirectFromLogAct->setData(row);
308             qslSentRequestedAct->setData(row);
309            }
310 
311         if (qslReceived)
312         {
313         }
314         else
315         {
316             QMenu *menuRecQsl = menu.addMenu(tr("QSL Rcvd"));
317             menuRecQsl->addAction(qslRecViaBureauFromLogAct);
318             menuRecQsl->addAction(qslRecViaBureauMarkReqFromSearchAct);
319             menuRecQsl->addAction(qslRecViaDirectFromLogAct);
320             menuRecQsl->addAction(qslRecViaDirectMarkReqFromSearchAct);
321             menuRecQsl->addAction(qslRecRequestedAct);
322             qslRecViaBureauFromLogAct->setData(row);
323             qslRecViaBureauMarkReqFromSearchAct->setData(row);
324             qslRecViaDirectFromLogAct->setData(row);
325             qslRecViaDirectMarkReqFromSearchAct->setData(row);
326             qslRecRequestedAct->setData(row);
327 
328         }
329     menu.exec(QCursor::pos());
330 }
331 
slotDoubleClickLog(const QModelIndex & index)332 void SearchWindow::slotDoubleClickLog(const QModelIndex & index)
333 {
334     //qDebug() << "SearchWindow::slotDoubleClickLog: Row: " << QString::number(index.row()) << "Column: " << QString::number(index.column()) << QT_ENDL;
335 
336     int row = index.row();
337     //qsoToEdit((searchModel->index(row, 0)).data(0).toInt());
338     int qsoID = ((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt();
339 
340     //qDebug() << "SearchWindow::slotDoubleClickLog: n: " << QString::number (searchModel->data(index, Qt::DisplayRole).toInt()) << QT_ENDL;
341     //qDebug() << "SearchWindow::slotDoubleClickLog: emitted: " << QString::number (((searchModel->index(row, Qt::DisplayRole)).data(0)).toInt()) << QT_ENDL;
342 
343     emit actionQSODoubleClicked(qsoID);
344     //qsoToEdit((searchModel->index(row, 0)).data(0).toInt());
345 
346     //TODO: To be added to the SearchWindow and create an action that emist the QSO id to be edited
347 
348     searchModel->select();
349 }
350 
isQSLReceived(const int _qsoId)351 bool SearchWindow::isQSLReceived(const int _qsoId)
352 {
353        //qDebug() << "SearchWindow::isQSLReceived: " << QString::number(_qsoId) << QT_ENDL;
354     return dataProxy->isQSOConfirmed(_qsoId, true, false); // We check just paper QSL
355     //return dataProxy->isQSLReceived(_qsoId);
356 }
357 
isQSLSent(const int _qsoId)358 bool SearchWindow::isQSLSent(const int _qsoId)
359 {
360        //qDebug() << "SearchWindow::isQSLSent: " << QString::number(_qsoId) << QT_ENDL;
361 
362     return dataProxy->isQSLSent(_qsoId);
363 }
364 
365 
showMenuRightButtonFromLogCreateActions()366 void SearchWindow::showMenuRightButtonFromLogCreateActions()
367 {
368    //qDebug() << "SearchWindow::showMenuRightButtonFromLogCreateActions" << QT_ENDL;
369 
370     delQSOFromLogAct = new QAction(tr("&Delete"), this);
371     delQSOFromLogAct->setStatusTip(tr("Delete a QSO"));
372     connect(delQSOFromLogAct, SIGNAL(triggered()), this, SLOT(slotQsoDeleteFromLog()));
373 
374     qsoToEditFromLogAct = new QAction(tr("&Edit QSO"), this);
375     qsoToEditFromLogAct->setStatusTip(tr("Edit this QSO"));
376     connect(qsoToEditFromLogAct, SIGNAL(triggered()), this, SLOT(slotQSOToEditFromLog()));
377 
378     qslSentViaBureauFromLogAct = new QAction(tr("Via &bureau"), this);
379     qslSentViaBureauFromLogAct->setStatusTip(tr("Send this QSL via bureau"));
380     connect(qslSentViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauFromLog() ));
381 
382     qslSentViaDirectFromLogAct = new QAction(tr("D&irect"), this);
383     qslSentViaDirectFromLogAct->setStatusTip(tr("Send this QSL via direct"));
384     connect(qslSentViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectFromLog()   ));
385 
386     qslRecViaBureauFromLogAct = new QAction(tr("Via bureau"), this);
387     qslRecViaBureauFromLogAct->setStatusTip(tr("QSL &received via bureau"));
388     connect(qslRecViaBureauFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauFromLog() ));
389 
390     qslRecViaDirectFromLogAct = new QAction(tr("Direct"), this);
391     qslRecViaDirectFromLogAct->setStatusTip(tr("QSL received via direc&t"));
392     connect(qslRecViaDirectFromLogAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectFromLog() ));
393 
394     checkQRZCOMFromLogAct = new QAction(tr("Check in QRZ.com"), this);
395     checkQRZCOMFromLogAct->setStatusTip(tr("Check this callsign in QRZ.com"));
396     connect(checkQRZCOMFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckQRZCom() ));
397 
398     checkDXHeatFromLogAct = new QAction(tr("Check in DXHeat.com"), this);
399     checkDXHeatFromLogAct->setStatusTip(tr("Check this callsign in DXHeat.com"));
400     connect(checkDXHeatFromLogAct, SIGNAL(triggered()), this, SLOT( slotCheckDXHeatCom() ));
401 
402     qslSentRequestedAct = new QAction(tr("&Request my QSL"), this);
403     qslSentRequestedAct->setStatusTip(tr("Mark my QSL as requested"));
404     connect(qslSentRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLSentMarkAsRequested()   ));
405 
406     qslSentViaDirectMarkRcvReqFromSearchAct = new QAction(tr("Via Direct and mark DX QSL as requested"), this);
407     qslSentViaDirectMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via direct and mark DX QSL as requested"));
408     connect(qslSentViaDirectMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaDirectMarkDXReqFromSearch() ));
409 
410     qslSentViaBureauMarkRcvReqFromSearchAct = new QAction(tr("Via Bureau and mark DX QSL as requested"), this);
411     qslSentViaBureauMarkRcvReqFromSearchAct->setStatusTip(tr("Send this QSL via bureau and mark DX QSL as requested"));
412     connect(qslSentViaBureauMarkRcvReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLSentViaBureauMarkDXReqFromSearch() ));
413 
414     qslRecRequestedAct = new QAction(tr("&Request the QSL"), this);
415     qslRecRequestedAct->setStatusTip(tr("Mark the QSL as requested"));
416     connect(qslRecRequestedAct, SIGNAL(triggered()), this, SLOT( slotQSLRecMarkAsRequested()   ));
417 
418     qslRecViaBureauMarkReqFromSearchAct = new QAction(tr("Via bureau and mark my QSL as requested"), this);
419     qslRecViaBureauMarkReqFromSearchAct->setStatusTip(tr("QSL received via bureau and mark my QSL as requested"));
420     connect(qslRecViaBureauMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaBureauMarkReqFromSearch() ));
421 
422     qslRecViaDirectMarkReqFromSearchAct = new QAction(tr("Direc&t and mark as my QSL requested"), this);
423     qslRecViaDirectMarkReqFromSearchAct->setStatusTip(tr("QSL received via direct and mark my QSL as requested"));
424     connect(qslRecViaDirectMarkReqFromSearchAct, SIGNAL(triggered()), this, SLOT( slotQSLRecViaDirectMarkReqFromSearch() ));
425 
426 }
427 
428 
slotQSLSentViaBureauFromLog()429 void SearchWindow::slotQSLSentViaBureauFromLog()
430 {
431       //qDebug() << "SearchWindow::slotQSLSentViaBureauFromLog: " << (qslSentViaBureauFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt()  ) , 0)).data(0).toInt()) ) << QT_ENDL;
432     int _qsoId = ((searchModel->index( ( (qslSentViaBureauFromLogAct->data()).toInt()  ) , 0)).data(0).toInt());
433     qslSentViaBureau(_qsoId);
434     searchModel->select();
435 
436 }
437 
slotQSLSentViaDirectFromLog()438 void SearchWindow::slotQSLSentViaDirectFromLog()
439 {
440        //qDebug() << "SearchWindow::slotQSLSentViaDirectFromLog: " << (qslSentViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt()  ) , 0)).data(0).toInt()) ) << QT_ENDL;
441      int _qsoId = ((searchModel->index( ( (qslSentViaDirectFromLogAct->data()).toInt()  ) , 0)).data(0).toInt());
442     //dataProxy->qslSentViaDirect(_qsoId, (QDateTime::currentDateTime()).toString("yyyy-MM-dd"));
443     dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate());
444     searchModel->select();
445 
446 }
447 
slotQSLRecViaBureauFromLog()448 void SearchWindow::slotQSLRecViaBureauFromLog()
449 {
450       //qDebug() << "SearchWindow::slotQSLRecViaBureauFromLog: " << QT_ENDL;
451 
452     int _qsoId = ((searchModel->index( ( (qslRecViaBureauFromLogAct->data()).toInt()  ) , 0)).data(0).toInt());
453     qslRecViaBureau(_qsoId);
454     searchModel->select();
455     //TODO: To be added to the SearchWindow and create an action that emist the QSO id
456 }
457 
slotQSLRecViaDirectFromLog()458 void SearchWindow::slotQSLRecViaDirectFromLog()
459 {
460        //qDebug() << "SearchWindow::slotQSLRecViaDirectFromLog: " << (qslRecViaDirectFromLogAct->data()).toString() << " - Id = " << QString::number( ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt()  ) , 0)).data(0).toInt()) ) << QT_ENDL;
461     int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt()  ) , 0)).data(0).toInt());
462     qslRecViaDirect(_qsoId);
463     searchModel->select();
464     // Mark Sent, Bureau, date, update log.
465     //TODO: To be added to the SearchWindow and create an action that emist the QSO id
466 }
467 
slotQSOToEditFromLog()468 void SearchWindow::slotQSOToEditFromLog()
469 {
470     //qDebug() << "slotQSOToEditFromLog: " << (qsoToEditFromLogAct->data()).toString() << QT_ENDL;
471 
472     int QSOid = ((searchModel->index((qsoToEditFromLogAct->data()).toInt(), 0)).data(0)).toInt();
473     //int QSOid = qsoToEditFromLogAct->data().toInt();
474     emit actionQSODoubleClicked(QSOid);
475 
476 
477 
478     //TODO: To be added to the SearchWindow and create an action that emit the QSO id
479 }
480 /*
481 void SearchWindow::deleteQSO(const int _qsoID)
482 {
483     //qDebug() << "SearchWindow::deleteQSO: " << QString::number(_qsoID) << QT_ENDL;
484 
485     //int QSOid = (delQSOFromLogAct->data()).toInt();
486     emit actionDeleteQSO(_qsoID);
487 
488 
489 
490     elogClublog->deleteQSO(dataProxy->getClubLogRealTimeFromId(_qsoID));
491     dataProxy->deleteQSO(_qsoID);
492 
493 
494     refresh();
495 
496     searchModel->select();
497     emit updateAwards();
498     emit updateSearchText();
499 
500 }
501 */
slotQsoDeleteFromLog()502 void SearchWindow::slotQsoDeleteFromLog()
503 {
504     //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number((delQSOFromLogAct->data()).toInt()) << QT_ENDL;
505     int QSOid = ((searchModel->index((delQSOFromLogAct->data()).toInt(), 0)).data(0)).toInt();
506 
507     //int QSOid = (delQSOFromLogAct->data()).toInt();
508     //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID1: " << QString::number(QSOid) << QT_ENDL;
509     //qDebug() << "SearchWindow::slotQsoDeleteFromLog: qsoID2: " << QString::number((delQSOFromLogAct->data()).toInt()) << QT_ENDL;
510     emit actionDeleteQSO(QSOid);
511     searchModel->select();
512 }
513 
qslSentViaBureau(const int _qsoId)514 void SearchWindow::qslSentViaBureau(const int _qsoId)
515 {
516        //qDebug() << "SearchWindow::qslSentViaBureau: " << QString::number(_qsoId)yyyy-MM-dd
517     dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate());
518     searchModel->select();
519 }
520 
qslRecViaBureau(const int _qsoId)521 void SearchWindow::qslRecViaBureau(const int _qsoId)
522 {
523    //    //qDebug() << "LogWyyyy-MM-ddRecViaBureau: " << QString::number(_qsoIyyyy-MM-dd<< (dateTime->currentDateTime()).toString("yyyy/MM/dd") << QT_ENDL;
524     dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), false);
525     awards->setAwards(_qsoId);   //Update the Award status
526     searchModel->select();
527     //refresh();
528     emit updateAwards();
529 }
530 
qslRecViaDirect(const int _qsoId)531 void SearchWindow::qslRecViaDirect(const int _qsoId)
532 {
533        //qDebug() << "SearchWindow::qslRecViaDirect: " << QString::number(_qsoId)yyyy-MM-dd
534     dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), false);
535     awards->setAwards(_qsoId);
536     searchModel->select();
537     //refresh();
538     emit updateAwards();
539 }
540 
slotQueryErrorManagement(QString functionFailed,QString errorCodeS,QString nativeError,QString failedQuery)541 void SearchWindow::slotQueryErrorManagement(QString functionFailed, QString errorCodeS, QString nativeError, QString failedQuery)
542 {
543     emit queryError(functionFailed, errorCodeS, nativeError, failedQuery);
544 }
545 
slotCheckQRZCom()546 void SearchWindow::slotCheckQRZCom()
547 {
548     QString _qrz = ((searchModel->index( ( (checkQRZCOMFromLogAct->data()).toInt()  ) , 2)).data(Qt::DisplayRole).toString());
549     //qDebug() << "SearchWindow::sloTCheckQRZCom: " << _qrz << QT_ENDL;
550     QString url = "https://www.qrz.com/db/" + _qrz;
551 
552     QDesktopServices::openUrl(QUrl(url));
553 
554 }
555 
slotCheckDXHeatCom()556 void SearchWindow::slotCheckDXHeatCom()
557 {
558     //int _qsoId = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt()  ) , 0)).data(0).toInt());
559     //QString _qrz = dataProxy->getCallFromId(_qsoId);
560     QString _qrz = ((searchModel->index( ( (checkDXHeatFromLogAct->data()).toInt()  ) , 2)).data(Qt::DisplayRole).toString());
561       //qDebug() << "SearchWindow::slotCheckDXHeatCom(): " << _qrz << QT_ENDL;
562     QString url = "https://www.dxheat.com/db/" + _qrz;
563     QDesktopServices::openUrl(QUrl(url));
564 }
565 
setFilterString(const QString & _st)566 void SearchWindow::setFilterString(const QString &_st)
567 {
568     //qDebug() << "SearchWindow::setFilterString: " << _st << QT_ENDL;
569     searchModel->setFilterString(_st);
570     //qDebug() << "SearchWindow::setFilterString: - END "  << QT_ENDL;
571 }
572 
selectAll()573 void SearchWindow::selectAll()
574 {
575     //qDebug() << "SearchWindow::selectAll: " << QString::number(searchModel->rowCount()) << QT_ENDL;
576     int rowCount = searchModel->rowCount();
577      //logView->selectAll();
578      treeView->selectAll();
579     for (int i=0;i<rowCount; i++)
580     {
581         //searchModel->selectRow(i);
582     }
583 
584 
585 }
586 
clearSelection()587 void SearchWindow::clearSelection()
588 {
589     //qDebug() << "SearchWindow::clearSelection" << QT_ENDL;
590     //logView->clearSelection();
591     treeView->clearSelection();
592 
593 }
594 
getSelectedQSOs()595 QList<int> SearchWindow::getSelectedQSOs()
596 {
597     //qDebug() << "SearchWindow::getSelectedQSOs: (Total: " << QString::number(searchModel->rowCount()) << ")"<< QT_ENDL;
598     QList<int> selectedQSOs;
599 
600     //QModelIndexList selection = //logView->selectionModel()->selectedRows();
601     QModelIndexList selection = treeView->selectionModel()->selectedRows();
602     foreach (QModelIndex index, selection)
603     {
604         int row, qsoID;
605         row = index.row();
606         qsoID = ((searchModel->index(row, 0)).data(0)).toInt();
607         selectedQSOs.append(qsoID);
608     }
609     //qDebug() << "SearchWindow::getSelectedQSOs: (Selected: (" << QString::number(selectedQSOs.count()) << ")" << QT_ENDL;
610     return selectedQSOs;
611 
612 }
613 
slotQSLRecMarkAsRequested()614 void SearchWindow::slotQSLRecMarkAsRequested()
615 {
616 
617     int _qsoId = ((searchModel->index((qslRecRequestedAct->data()).toInt(), 0)).data(0)).toInt();
618     dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate());
619     if(qslingNeeded)
620     {
621         searchToolNeededQSLToSend();
622     }
623     else
624     {
625         emit updateSearchLineEdit();
626     }
627 
628     searchModel->select();
629 }
630 
setNeedingQSL(bool const _q)631 void SearchWindow::setNeedingQSL(bool const _q)
632 {
633     qslingNeeded = _q;
634 
635 }
636 
slotToolSearchQSL(const int actionQSL)637 void SearchWindow::slotToolSearchQSL(const int actionQSL)
638 {
639     //qDebug() << "SearchWidget::slotToolSearchQSL: " << QString::number(actionQSL) << " - LogNumber: " << QString::number(currentLog) << QT_ENDL;
640     // 2 means QSL_RCVD = 'R'
641     QString stringQuery = QString();
642     QString message = QString();
643     QString aux = QString();
644     QString filter;
645     filter = QString();
646 
647     //int i = -1;
648 
649     switch (actionQSL)
650     {
651         case 0://void searchToolNeededQSLToSend();
652             //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 0" << QT_ENDL;
653 
654 
655             stringQuery = QString("SELECT call, qso_date,dxcc, bandid, modeid, qsl_sent, qsl_rcvd, lotw_qsl_rcvd, station_callsign, id FROM log WHERE (qsl_rcvd<>'Y' AND lotw_qsl_rcvd<>'Y') AND qsl_sent<>'Y' AND qsl_sent<>'Q' AND qsl_sent<>'R' AND lognumber='%1' AND (bandid, dxcc) NOT IN (SELECT distinct bandid, dxcc from log WHERE qsl_rcvd='Y' OR lotw_qsl_rcvd='Y')").arg(currentLog);
656             //stringQuery = QString("SELECT call, qso_date, bandid, modeid, qsl_sent, qsl_rcvd, station_callsign, log.id FROM log JOIN awarddxcc ON awarddxcc.qsoid=log.id WHERE awarddxcc.confirmed='0' AND log.qsl_sent!='Y' AND log.qsl_sent!='Q' AND log.qsl_sent!='R' AND log.lognumber='%1'").arg(currentLog);
657             message = tr("Needed QSO to send the QSL");
658             setNeedingQSL(true);
659             //qslingNeeded = true;
660             emit requestFocus();
661         break;
662         case 1:
663                //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 1" << QT_ENDL;
664             filter = QString("qsl_sent=='R' AND lognumber='%1'").arg(currentLog);
665             message = tr("My QSL requested to be sent");
666         break;
667         case 2://void slotToolSearchNeededQSLPendingToReceive();
668                //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 2" << QT_ENDL;
669             filter = QString("lognumber='%1' AND ( (qsl_sent='Y' AND qsl_rcvd!='Y' AND qsl_rcvd!='I') OR qsl_rcvd='R')").arg(currentLog);
670             message = tr("DX QSL pending to be received");
671         break;
672     case 3://void slotToolSearchNeededQSLRequested()
673                //qDebug() << "SearchWidget::slotToolSearchQSL: CASE 3" << QT_ENDL;
674         filter = QString("WHERE lognumber='%1' AND  qsl_rcvd='R'").arg(currentLog);
675         message = tr("DX QSL pending to be received");
676     break;
677         default:
678                //qDebug() << "SearchWidget::slotToolSearchQSL: CASE DEFAULT" << QT_ENDL;
679         // should never be reached
680             return;
681 //        break;
682     }
683 
684     clear();
685     setFilterString(filter);
686 }
687 
searchToolNeededQSLToSend()688 void SearchWindow::searchToolNeededQSLToSend()
689 {
690        //qDebug() << "SearchWidget::slotToolSearchQSLToSend - TO PREPARE THE QUERY and optimize the function" << QT_ENDL;
691     slotToolSearchQSL(0);
692        //qDebug() << "SearchWidget::slotToolSearchQSLToSend - END" << QT_ENDL;
693 }
694 
slotQSLSentMarkAsRequested()695 void SearchWindow::slotQSLSentMarkAsRequested()
696 {
697     //qDebug() << "SearchWindow::slotQSLSentMarkAsRequested: " << QString::number( (qslSentRequestedAct->data()).toInt() ) << QT_ENDL;
698    // bool qslSentAsRequested(const int _qsoId, const QString &_updateDate);
699     int _qsoId = ((searchModel->index((qslSentRequestedAct->data()).toInt(), 0)).data(0)).toInt();
700 
701     dataProxy->qslSentAsRequested(_qsoId, QDate::currentDate());
702     if(qslingNeeded)
703     {
704         slotToolSearchQSL(0);
705     }
706     else
707     {
708         emit updateSearchText();
709     }
710     searchModel->select();
711 }
712 
slotQSLSentViaDirectMarkDXReqFromSearch()713 void SearchWindow::slotQSLSentViaDirectMarkDXReqFromSearch()
714 {
715        //qDebug() << "slotQSLSentViaDirectMarkDXReqFromSearch: " << QT_ENDL;
716     int _qsoId = ((searchModel->index((qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt();
717     //int _qsoId = (qslSentViaDirectMarkRcvReqFromSearchAct->data()).toInt();
718 
719     dataProxy->qslSentViaDirect(_qsoId, QDate::currentDate());
720     dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate());
721 
722 
723     if(qslingNeeded)
724     {
725         slotToolSearchQSL(0);
726     }
727     else
728     {
729         emit updateSearchText();
730     }
731     searchModel->select();
732     // Mark Sent, Bureau, date, update log.
733 }
734 
slotQSLSentViaBureauMarkDXReqFromSearch()735 void SearchWindow::slotQSLSentViaBureauMarkDXReqFromSearch()
736 {
737     //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: " << QString::number( (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt() ) << QT_ENDL;
738      //int _qsoId = (qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt();
739     int _qsoId = ((searchModel->index((qslSentViaBureauMarkRcvReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt();
740     dataProxy->qslSentViaBureau(_qsoId, QDate::currentDate());
741     dataProxy->qslRecAsRequested(_qsoId, QDate::currentDate());
742 
743 
744     if(qslingNeeded)
745     {
746         slotToolSearchQSL(0);
747     }
748     else
749     {
750         emit updateSearchText();
751     }
752     searchModel->select();
753     //qDebug() << "slotQSLSentViaBureauMarkDXReqFromSearch: - END " << QT_ENDL;
754     // Mark Sent, Bureau, date, update log.
755 
756 }
757 
slotQSLRecViaBureauMarkReqFromSearch()758 void SearchWindow::slotQSLRecViaBureauMarkReqFromSearch()
759 {
760     //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog -  Start" << QT_ENDL;
761     //int _qsoId = (qslRecViaBureauMarkReqFromSearchAct->data()).toInt();
762     int _qsoId = ((searchModel->index((qslRecViaBureauMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt();
763        //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 01" << QT_ENDL;
764     //qslRecViaBureauMarkReq(_qsoId);
765     dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true);
766        //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 02: n: " << QString::number(_qsoId) << QT_ENDL;
767     if(qslingNeeded)
768     {
769            //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 03" << QT_ENDL;
770         slotToolSearchQSL(0);
771            //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 04" << QT_ENDL;
772     }
773     else
774     {
775            //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 05" << QT_ENDL;
776         emit updateSearchText();
777            //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 06" << QT_ENDL;
778     }
779     searchModel->select();
780        //qDebug() << "SearchWidget::slotQSLRecViaBureauMarkReqFromLog: 07" << QT_ENDL;
781 }
782 
slotQSLRecViaDirectMarkReqFromSearch()783 void SearchWindow::slotQSLRecViaDirectMarkReqFromSearch()
784 {
785        //qDebug() << "SearchWidget::slotQSLRecViaDirectFromLog: " << QT_ENDL;
786      //int _qsoId = (qslRecViaDirectMarkReqFromSearchAct->data()).toInt();
787      int _qsoId = ((searchModel->index((qslRecViaDirectMarkReqFromSearchAct->data()).toInt(), 0)).data(0)).toInt();
788     //qslRecViaDirectMarkReq(_qsoId);
789     dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true);
790     if(qslingNeeded)
791     {
792         slotToolSearchQSL(0);
793     }
794     else
795     {
796         emit updateSearchText();
797     }
798     searchModel->select();
799     // Mark Sent, Bureau, date, update log.
800 }
801 
802 /*
803  void SearchWindow::qslRecViaBureauMarkReq(const int _qsoId)
804 {
805     //qDebug() << "SearchWidget::qslRecViaBureau: " << QString::number(_qsoId) << "/" << QDate::currentDate() << QT_ENDL;
806     dataProxy->qslRecViaBureau(_qsoId, QDate::currentDate(), true);
807     //qDebug() << "SearchWidget::qslRecViaBureau: END" << QT_ENDL;
808 }
809 */
810 
811 /*
812 void SearchWindow::qslRecViaDirectMarkReq(const int _qsoId)
813 {
814     //qDebug() << "SearchWidget::qslRecViaDirect: " << QString::number(_qsoId) << QT_ENDL;
815     dataProxy->qslRecViaDirect(_qsoId, QDate::currentDate(), true);
816 }
817 */
818 /*
819 void SearchWindow::colorTheList()
820 {
821     //qDebug() << "SearchWidget::colorTheList: " << QString::number(treeView->model()->rowCount()) << QT_ENDL;
822     for (int i = 0; i < treeView->model()->rowCount(); i++)
823     {
824 
825        //QString _qrz = ((searchModel->index( ( (qslRecViaDirectFromLogAct->data()).toInt()  ) , 0)).data(1).toString());
826        QString _qrz =  (searchModel->index(i, 2)).data(Qt::DisplayRole).toString();
827 
828         //QColor getQRZDXStatusColor(const QStringList &_qs); // Receives Entity, band, mode & log
829        //QColor color = awards->getQRZDXStatusColor()
830 
831        QColor color = QColor(Qt::blue);
832         //searchModel->setItemData(searchModel->index(i, 2), color);
833         //qDebug() << "SearchWidget::colorTheList: " << _qrz << QT_ENDL;
834     }
835 
836 }
837 */
838 
setColors(const QString & _newOne,const QString & _needed,const QString & _worked,const QString & _confirmed,const QString & _default)839 void SearchWindow::setColors (const QString &_newOne, const QString &_needed, const QString &_worked, const QString &_confirmed, const QString &_default)
840 {
841        //qDebug() << "DXClusterWidget::setColors: " << _newOne << "/" << _needed << "/" << _worked << "/" << _confirmed << "/" << _default << QT_ENDL;
842     // Just to pass the colors to the awards class
843     searchModel->setColors(_newOne,  _needed, _worked,  _confirmed, _default);
844 }
845 
846