1#include "FrmListRecent.h" 
    2#include "RabbitCommonDir.h" 
    5#include <QStandardItem> 
    9#include <QLoggingCategory> 
   10#include "mainwindow.h" 
   12static Q_LOGGING_CATEGORY(log, 
"App.FrmListRecent")
 
   18    m_pMainWindow(pMainWindow),
 
   19    m_ParameterApp(parameterApp),
 
   21    m_ptbOperate(
nullptr),
 
   26    m_pDockTitleBar(
nullptr)
 
   29    setFocusPolicy(Qt::NoFocus);
 
   30    setAttribute(Qt::WA_DeleteOnClose);
 
   31    setLayout(
new QVBoxLayout(
this));
 
   32    setWindowTitle(tr(
"Recently list"));
 
   34    m_pToolBar = 
new QToolBar(
this);
 
   36    m_pStart = m_pToolBar->addAction(
 
   37        QIcon::fromTheme(
"media-playback-start"), tr(
"Start"),
 
   38        this, SLOT(slotStart()));
 
   39    m_pStart->setStatusTip(tr(
"Start"));
 
   40    m_pStart->setToolTip(tr(
"Start"));
 
   41    m_pEditOperate = m_pToolBar->addAction(
 
   42        QIcon::fromTheme(
"edit-connect"), tr(
"Edit and Start"),
 
   43        this, SLOT(slotEditConnect()));
 
   44    m_pEditOperate->setStatusTip(tr(
"Edit and Start"));
 
   45    m_pEditOperate->setToolTip(tr(
"Edit and Start"));
 
   46    m_pToolBar->addSeparator();
 
   48    m_ptbOperate = 
new QToolButton(m_pToolBar);
 
   49    m_ptbOperate->setFocusPolicy(Qt::NoFocus);
 
   50    m_ptbOperate->setPopupMode(QToolButton::InstantPopup);
 
   52    m_pMenuNew = 
new QMenu(tr(
"New"), 
this);
 
   53    m_pMenuNew->setIcon(QIcon::fromTheme(
"add"));
 
   54    m_ptbOperate->setMenu(m_pMenuNew);
 
   55    m_ptbOperate->setIcon(m_pMenuNew->icon());
 
   56    m_ptbOperate->setText(tr(
"New"));
 
   57    m_ptbOperate->setToolTip(tr(
"New"));
 
   58    m_ptbOperate->setStatusTip(tr(
"New"));
 
   59    m_pToolBar->addWidget(m_ptbOperate);
 
   60    check = connect(&m_ParameterApp, SIGNAL(sigStartByTypeChanged()),
 
   61                    this, SLOT(slotStartByType()));
 
   63    m_pManager->EnumPlugins(
this);
 
   64    m_pEdit = m_pToolBar->addAction(QIcon::fromTheme(
"edit"), tr(
"Edit"),
 
   65                                    this, SLOT(slotEdit()));
 
   66    m_pEdit->setStatusTip(tr(
"Edit"));
 
   67    m_pEdit->setToolTip(tr(
"Edit"));
 
   68    m_pCopy = m_pToolBar->addAction(QIcon::fromTheme(
"edit-copy"), tr(
"Copy"),
 
   69                                    this, SLOT(slotCopy()));
 
   70    m_pCopy->setStatusTip(tr(
"Copy"));
 
   71    m_pCopy->setToolTip(tr(
"Copy"));
 
   72    m_pDelete = m_pToolBar->addAction(
 
   73        QIcon::fromTheme(
"edit-delete"), tr(
"Delete"),
 
   74        this, SLOT(slotDelete()));
 
   75    m_pDelete->setToolTip(tr(
"Delete"));
 
   76    m_pDelete->setStatusTip(tr(
"Delete"));
 
   77    m_pDetail = m_pToolBar->addAction(
 
   78        QIcon::fromTheme(
"dialog-information"), tr(
"Detail"),
 
   79        this, SLOT(slotDetail()));
 
   80    m_pDetail->setCheckable(
true);
 
   81    m_pDetail->setChecked(
false);
 
   82    m_pDetail->setToolTip(tr(
"Detail"));
 
   83    m_pDetail->setStatusTip(tr(
"Detail"));
 
   84    m_pToolBar->addSeparator();
 
   85    m_pAddToFavorite = m_pToolBar->addAction(QIcon::fromTheme(
"emblem-favorite"), tr(
"Add to favorite"),
 
   86                          this, SLOT(slotAddToFavorite()));
 
   87    m_pAddToFavorite->setStatusTip(m_pAddToFavorite->text());
 
   88    m_pAddToFavorite->setToolTip(m_pAddToFavorite->text());
 
   89    m_pAddToFavorite->setEnabled(
false);
 
   91        m_pRefresh = m_pToolBar->addAction(
 
   92            QIcon::fromTheme(
"view-refresh"),
 
   94            this, SLOT(slotLoadFiles()));
 
   95        m_pRefresh->setToolTip(tr(
"Refresh"));
 
   96        m_pRefresh->setStatusTip(tr(
"Refresh"));
 
   98        QAction* pClose = m_pToolBar->addAction(
 
   99            QIcon::fromTheme(
"window-close"), tr(
"Close"),
 
  100            this, SLOT(close()));
 
  101        pClose->setStatusTip(tr(
"Close"));
 
  102        pClose->setToolTip(tr(
"Close"));
 
  105    layout()->addWidget(m_pToolBar);
 
  108        m_pDockTitleBar = 
new RabbitCommon::CTitleBar(parent);
 
  110        QMenu* pMenu = 
new QMenu(tr(
"Tools"), m_pDockTitleBar);
 
  111        QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
 
  112            QIcon::fromTheme(
"tools"), m_pDockTitleBar);
 
  113        pTools->setToolTip(tr(
"Tools"));
 
  114        pTools->setMenu(pMenu);
 
  115        QList<QWidget*> lstWidget;
 
  117        m_pDockTitleBar->AddWidgets(lstWidget);
 
  119        pMenu->addAction(m_pStart);
 
  120        pMenu->addAction(m_pEditOperate);
 
  121        pMenu->addMenu(m_pMenuNew);
 
  122        pMenu->addAction(m_pEdit);
 
  123        pMenu->addAction(m_pCopy);
 
  124        pMenu->addAction(m_pDelete);
 
  125        pMenu->addAction(m_pDetail);
 
  126        pMenu->addAction(m_pAddToFavorite);
 
  127        pMenu->addAction(m_pRefresh);
 
  128        pMenu->addSeparator();
 
  129        auto pShowToolBar = pMenu->addAction(tr(
"Show tool bar"), 
this, [&](){
 
  130            QAction* a = (QAction*)sender();
 
  132                m_pToolBar->setVisible(a->isChecked());
 
  133                m_ParameterApp.SetDockListRecentShowToolBar(a->isChecked());
 
  134                m_ParameterApp.Save();
 
  137        pShowToolBar->setCheckable(
true);
 
  138        pShowToolBar->setChecked(m_ParameterApp.GetDockListRecentShowToolBar());
 
  139        m_pToolBar->setVisible(m_ParameterApp.GetDockListRecentShowToolBar());
 
  142    Q_ASSERT(m_pManager);
 
  143    m_pTableView = 
new QTableView(
this);
 
  144    m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
 
  145    check = connect(m_pTableView,
 
  146                    SIGNAL(customContextMenuRequested(
const QPoint &)),
 
  147                    this, SLOT(slotCustomContextMenu(
const QPoint &)));
 
  149    check = connect(m_pTableView, SIGNAL(doubleClicked(
const QModelIndex &)),
 
  150                    this, SLOT(slotDoubleClicked(
const QModelIndex&)));
 
  152    layout()->addWidget(m_pTableView);
 
  154    m_pModel = 
new QStandardItemModel(m_pTableView);
 
  155    m_pTableView->setModel(m_pModel);
 
  156    m_pTableView->verticalHeader()->hide();
 
  157    m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
 
  158    m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
 
  159    m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
 
  160    m_pModel->setHorizontalHeaderItem(ColumnNo::Name, 
new QStandardItem(tr(
"Name")));
 
  161    m_pModel->setHorizontalHeaderItem(ColumnNo::Protocol, 
new QStandardItem(tr(
"Protocol")));
 
  162    m_pModel->setHorizontalHeaderItem(ColumnNo::Type, 
new QStandardItem(tr(
"Type")));
 
  163    m_pModel->setHorizontalHeaderItem(ColumnNo::Date, 
new QStandardItem(tr(
"Date")));
 
  164    m_pModel->setHorizontalHeaderItem(ColumnNo::ID, 
new QStandardItem(tr(
"ID")));
 
  165    m_pModel->setHorizontalHeaderItem(ColumnNo::File, 
new QStandardItem(tr(
"File")));
 
  166    if(!m_pDetail->isChecked()) {
 
  167        m_pTableView->hideColumn(ColumnNo::ID);
 
  168        m_pTableView->hideColumn(ColumnNo::File);
 
  180    m_pTableView->horizontalHeader()->setSectionResizeMode(
 
  181#
if defined(DEBUG) && !defined(Q_OS_ANDROID)
 
  184        QHeaderView::Interactive);
 
  192    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  193    QModelIndexList lstIndex;
 
  195        lstIndex = pSelect->selectedRows();
 
  196    if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
 
  198        m_pTableView->selectRow(0);
 
  203CFrmListRecent::~CFrmListRecent()
 
  207void CFrmListRecent::slotLoadFiles()
 
  209    m_pModel->removeRows(0, m_pModel->rowCount());
 
  210    QString szPath = RabbitCommon::CDir::Instance()->GetDirUserData();
 
  212    QStringList files = dir.entryList(QStringList() << 
"*.rrc",
 
  213                                      QDir::Files, QDir::Time);
 
  214    foreach (
auto fileName, files) {
 
  215        QString szFile = dir.absoluteFilePath(fileName);
 
  216        if(szFile.isEmpty()) 
continue;
 
  218        if(!pOperate) 
continue;
 
  220        QList<QStandardItem*> lstItem;
 
  221        lstItem = GetItem(pOperate, szFile);
 
  222        m_pModel->appendRow(lstItem);
 
  227    m_pStart->setEnabled(m_pModel->rowCount() > 0);
 
  228    m_pEditOperate->setEnabled(m_pModel->rowCount() > 0);
 
  229    m_pEdit->setEnabled(m_pModel->rowCount() > 0);
 
  230    m_pCopy->setEnabled(m_pModel->rowCount() > 0);
 
  231    m_pDelete->setEnabled(m_pModel->rowCount() > 0);
 
  232    m_pAddToFavorite->setEnabled(m_pModel->rowCount() > 0);
 
  237    m_pTableView->resizeColumnToContents(ColumnNo::Name); 
 
  238    m_pTableView->resizeColumnToContents(ColumnNo::Protocol); 
 
  239    m_pTableView->resizeColumnToContents(ColumnNo::Type); 
 
  240    m_pTableView->resizeColumnToContents(ColumnNo::Date); 
 
  244QList<QStandardItem*> CFrmListRecent::GetItem(
COperate* c, QString &szFile)
 
  246    QList<QStandardItem*> lstItem;
 
  247    QStandardItem* pName = 
new QStandardItem(c->
Icon(), c->
Name());
 
  250    QStandardItem* pProtocol = 
new QStandardItem(c->
Protocol());
 
  251    lstItem << pProtocol;
 
  252    QStandardItem* pType = 
new QStandardItem(c->
GetTypeName());
 
  255    QFileInfo fi(szFile);
 
  256    lstItem << 
new QStandardItem(fi.lastModified().toString());
 
  257    QStandardItem* pId = 
new QStandardItem(c->
Id());
 
  259    QStandardItem* pFile = 
new QStandardItem(szFile);
 
  264int CFrmListRecent::InsertItem(
COperate *c, QString& szFile)
 
  266    QList<QStandardItem*> lstItem;
 
  267    lstItem = GetItem(c, szFile);
 
  268    m_pModel->insertRow(0, lstItem);
 
  269    m_pTableView->selectRow(0);
 
  273void CFrmListRecent::slotStartByType()
 
  275    qDebug(log) << Q_FUNC_INFO;
 
  276    auto m = m_pMenuNew->actions();
 
  280    foreach (
auto a, m_MenuStartByType) {
 
  284    m_MenuStartByType.clear();
 
  291    QMenu* m = m_pMenuNew;
 
  292    if(m_ParameterApp.GetStartByType()) {
 
  293        auto it = m_MenuStartByType.find(pPlugin->Type());
 
  294        if(it == m_MenuStartByType.end()) {
 
  295            m = 
new QMenu(pPlugin->TypeName(pPlugin->Type()), m_pMenuNew);
 
  296            m_MenuStartByType[pPlugin->Type()] = m;
 
  297            m_pMenuNew->addMenu(m);
 
  302    QAction* p = m_pMainWindow->GetStartAction(m, pPlugin);
 
  303    bool check = connect(p, SIGNAL(triggered()), 
this, SLOT(slotNew()));
 
 
  308void CFrmListRecent::slotNew()
 
  310    QAction* pAction = 
dynamic_cast<QAction*
>(this->sender());    
 
  312    if(
nullptr == pOperate) 
return;
 
  317    case QDialog::Rejected:
 
  319    case QDialog::Accepted:
 
  321        QString szFile = pOperate->GetSettingsFile();
 
  323        if(d.exists(szFile)) {
 
  324            QMessageBox::StandardButton r
 
  325                = QMessageBox::warning(
 
  327                    tr(
"The file is exists. whether to overwrite it? File: %1").arg(szFile),
 
  328                    QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No,
 
  329                    QMessageBox::StandardButton::No);
 
  330            if(QMessageBox::StandardButton::Ok == r)
 
  340        InsertItem(pOperate, szFile);
 
  349void CFrmListRecent::slotEdit()
 
  351    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  352    QModelIndexList lstIndex = pSelect->selectedRows();
 
  353    foreach(
auto index, lstIndex)
 
  355        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  360        case QDialog::Rejected:
 
  362        case QDialog::Accepted:
 
  370void CFrmListRecent::slotEditConnect()
 
  372    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  373    QModelIndexList lstIndex = pSelect->selectedRows();
 
  374    foreach(
auto index, lstIndex)
 
  376        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  381        case QDialog::Rejected:
 
  383        case QDialog::Accepted:
 
  385            emit sigStart(szFile);
 
  394void CFrmListRecent::slotCopy()
 
  396    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  397    QModelIndexList lstIndex = pSelect->selectedRows();
 
  398    foreach(
auto index, lstIndex)
 
  400        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  409            case QDialog::Rejected:
 
  411            case QDialog::Accepted:
 
  413                szFile = pOperate->GetSettingsFile();
 
  415                if(d.exists(szFile)) {
 
  416                    QMessageBox::StandardButton r
 
  417                        = QMessageBox::warning(
 
  420                            tr(
"The file is exists. whether to overwrite it?" 
  421                               " If select No, please modify the name."),
 
  422                            QMessageBox::StandardButton::Ok
 
  423                                | QMessageBox::StandardButton::No
 
  424                                | QMessageBox::StandardButton::Cancel,
 
  425                            QMessageBox::StandardButton::No);
 
  426                    if(QMessageBox::StandardButton::No == r)
 
  431                    if(QMessageBox::StandardButton::Cancel == r)
 
  437                    InsertItem(pOperate, szFile);
 
  450void CFrmListRecent::slotDelete()
 
  452    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  453    QModelIndexList lstIndex = pSelect->selectedRows();
 
  454    foreach(
auto index, lstIndex)
 
  456        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  459            m_pModel->removeRow(index.row());
 
  463void CFrmListRecent::slotStart()
 
  465    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  466    QModelIndexList lstIndex = pSelect->selectedRows();
 
  467    foreach(
auto index, lstIndex)
 
  469        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  470        emit sigStart(szFile);
 
  472    if(!m_bDock) close();
 
  475void CFrmListRecent::slotDetail()
 
  477    if(m_pDetail->isChecked()) {
 
  478        m_pTableView->showColumn(ColumnNo::ID);
 
  479        m_pTableView->showColumn(ColumnNo::File);
 
  481        m_pTableView->hideColumn(ColumnNo::ID);
 
  482        m_pTableView->hideColumn(ColumnNo::File);
 
  486void CFrmListRecent::slotCustomContextMenu(
const QPoint &pos)
 
  490    menu.addAction(m_pStart);
 
  491    menu.addAction(m_pStart);
 
  493    menu.addMenu(m_pMenuNew);
 
  494    menu.addAction(m_pEdit);
 
  495    menu.addAction(m_pCopy);
 
  496    menu.addAction(m_pDelete);
 
  498    menu.addAction(m_pAddToFavorite);
 
  500        menu.addAction(m_pRefresh);
 
  502    menu.exec(mapToGlobal(pos));
 
  505void CFrmListRecent::slotDoubleClicked(
const QModelIndex& index)
 
  507    if(!index.isValid()) 
return;
 
  508    QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  509    emit sigStart(szFile);
 
  510    if(!m_bDock) close();
 
  513void CFrmListRecent::slotAddToFavorite()
 
  515    QItemSelectionModel* pSelect = m_pTableView->selectionModel();
 
  516    QModelIndexList lstIndex = pSelect->selectedRows();
 
  517    foreach(
auto index, lstIndex)
 
  519        if(!index.isValid()) 
continue;
 
  520        auto item = m_pModel->item(index.row(), ColumnNo::Name);
 
  522        QString szName = item->text();
 
  523        QIcon icon = item->icon();
 
  524        QString szDescription = item->toolTip();
 
  525        QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
 
  526        emit sigAddToFavorite(szName, szDescription, icon, szFile);
 
List the connect of be existed.
 
virtual int onProcess(const QString &id, CPlugin *pPlugin) override
Process plugins.
 
virtual int EnumPlugins(Handle *handle)
Enum plugins.
 
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
 
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
 
virtual int DeleteOperate(COperate *p)
Delete COperate.
 
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
 
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
 
virtual const QIcon Icon() const
Icon.
 
virtual const QString Protocol() const
Protocol.
 
virtual const QString Name()
Name.
 
virtual const QString Description()
Description.
 
virtual const QString Id()
Identity.
 
virtual const QString GetTypeName() const
Get type name.