File indexing completed on 2024-04-28 05:38:14

0001 #include "campaignview.h"
0002 
0003 #include <QContextMenuEvent>
0004 #include <QDebug>
0005 #include <QHeaderView>
0006 #include <QMenu>
0007 
0008 #include "data/campaign.h"
0009 #include "data/media.h"
0010 #include "model/mediamodel.h"
0011 
0012 #include "worker/utilshelper.h"
0013 
0014 namespace campaign
0015 {
0016 CampaignView::CampaignView(QWidget* parent) : QTreeView(parent)
0017 {
0018     setAcceptDrops(true);
0019     setDragEnabled(true);
0020     setDropIndicatorShown(true);
0021     setDefaultDropAction(Qt::MoveAction);
0022 
0023     setDragDropMode(QAbstractItemView::InternalMove);
0024 
0025     m_addDirectoryAct= new QAction(tr("Add directory…"), this);
0026     m_deleteFileAct= new QAction(tr("Delete"), this);
0027     m_defineAsCurrent= new QAction(tr("Current Directory"), this);
0028     m_openAct= new QAction(tr("Open"), this);
0029     m_openAsAct= new QAction(tr("Open As…"), this);
0030     m_renameAct= new QAction(tr("Rename Media"), this);
0031     // columns
0032     m_nameColsAct= new QAction(tr("Name"), this);
0033     m_sizeColsAct= new QAction(tr("Size"), this);
0034     m_typeColsAct= new QAction(tr("Type"), this);
0035     m_addedColsAct= new QAction(tr("Date Added"), this);
0036     m_modifiedColsAct= new QAction(tr("Date Modified"), this);
0037 
0038     m_nameColsAct->setCheckable(true);
0039     m_sizeColsAct->setCheckable(true);
0040     m_typeColsAct->setCheckable(true);
0041     m_addedColsAct->setCheckable(true);
0042     m_modifiedColsAct->setCheckable(true);
0043 
0044     m_nameColsAct->setChecked(true);
0045     m_sizeColsAct->setChecked(true);
0046     m_typeColsAct->setChecked(true);
0047     m_addedColsAct->setChecked(true);
0048     m_modifiedColsAct->setChecked(true);
0049 
0050     m_nameColsAct->setData(0);
0051     m_sizeColsAct->setData(1);
0052     m_typeColsAct->setData(2);
0053     m_addedColsAct->setData(3);
0054     m_modifiedColsAct->setData(4);
0055 
0056     connect(m_addDirectoryAct, &QAction::triggered, this, &CampaignView::onAddChapter);
0057     connect(m_deleteFileAct, &QAction::triggered, this,
0058             [this]()
0059             {
0060                 auto path= m_deleteFileAct->data().toString();
0061                 emit removeSelection(path);
0062             });
0063     connect(m_defineAsCurrent, &QAction::triggered, this,
0064             [this]()
0065             {
0066                 // TODO implementation ?
0067             });
0068 
0069     connect(m_openAct, &QAction::triggered, this,
0070             [this]()
0071             {
0072                 if(m_index.isValid())
0073                 {
0074                     auto path= m_index.data(MediaModel::Role_Path).toString();
0075                     auto id= m_index.data(MediaModel::Role_Uuid).toString();
0076                     emit openAs(id, path, helper::utils::extensionToContentType(path));
0077                 }
0078             });
0079     connect(m_openAsAct, &QAction::triggered, this,
0080             [this]()
0081             {
0082                 if(m_index.isValid())
0083                 {
0084                     auto mediaNode= static_cast<MediaNode*>(m_index.internalPointer());
0085                     auto path= mediaNode->path();
0086                     auto id= mediaNode->uuid();
0087                     auto act= qobject_cast<QAction*>(sender());
0088                     if(act)
0089                     {
0090                         emit openAs(id, path, qvariant_cast<Core::ContentType>(act->data()));
0091                     }
0092                 }
0093             });
0094 
0095     connect(m_renameAct, &QAction::triggered, this,
0096             [this]()
0097             {
0098                 if(m_index.isValid() && m_index.column() == 0)
0099                 {
0100                     edit(m_index);
0101                 }
0102             });
0103 
0104     auto hideshowCol= [this]()
0105     {
0106         auto act= qobject_cast<QAction*>(sender());
0107         auto col= act->data().toInt();
0108         act->isChecked() ? showColumn(col) : hideColumn(col);
0109     };
0110     connect(m_nameColsAct, &QAction::triggered, this, hideshowCol);
0111     connect(m_sizeColsAct, &QAction::triggered, this, hideshowCol);
0112     connect(m_typeColsAct, &QAction::triggered, this, hideshowCol);
0113     connect(m_addedColsAct, &QAction::triggered, this, hideshowCol);
0114     connect(m_modifiedColsAct, &QAction::triggered, this, hideshowCol);
0115 
0116     setEditTriggers(QAbstractItemView::NoEditTriggers);
0117 
0118     // Init hash
0119 
0120     auto notes= new QAction(tr("Notes"), this);
0121     notes->setData(QVariant::fromValue(Core::ContentType::NOTES));
0122 
0123     auto sharedNote= new QAction(tr("Shared Notes"), this);
0124     sharedNote->setData(QVariant::fromValue(Core::ContentType::SHAREDNOTE));
0125 
0126     m_convertionHash.insert(Core::MediaType::TextFile, {notes, sharedNote});
0127 }
0128 
0129 void CampaignView::startDrag(Qt::DropActions supportedActions)
0130 {
0131     QModelIndexList indexes= selectionModel()->selectedRows();
0132 
0133     QMimeData* mimeData= model()->mimeData(indexes);
0134     if(nullptr == mimeData)
0135         return;
0136 
0137     QDrag* drag= new QDrag(this);
0138     drag->setMimeData(mimeData);
0139     Qt::DropAction defaultDropAction= Qt::MoveAction;
0140 
0141     drag->exec(supportedActions, defaultDropAction);
0142 }
0143 void CampaignView::contextMenuEvent(QContextMenuEvent* event)
0144 {
0145     m_index= indexAt(event->pos());
0146 
0147     qDebug() << m_index << event->pos();
0148 
0149     auto nodeType= m_index.data(MediaModel::Role_Type).value<Core::MediaType>();
0150     auto isDir= m_index.data(MediaModel::Role_IsDir).toBool();
0151     auto path= m_index.data(MediaModel::Role_Path).toString();
0152 
0153     QMenu popMenu(this);
0154 
0155     popMenu.addAction(m_openAct);
0156     auto openAs= popMenu.addMenu(tr("Open As…"));
0157     if(!isDir)
0158         addOpenAsActs(openAs, nodeType);
0159     popMenu.addSeparator();
0160     popMenu.addAction(m_addDirectoryAct);
0161     popMenu.addAction(m_deleteFileAct);
0162     popMenu.addAction(m_renameAct);
0163     popMenu.addSeparator();
0164     auto cols= popMenu.addMenu(tr("Show/hide Column"));
0165     cols->addAction(m_nameColsAct);
0166     cols->addAction(m_sizeColsAct);
0167     cols->addAction(m_typeColsAct);
0168     cols->addAction(m_addedColsAct);
0169     cols->addAction(m_modifiedColsAct);
0170 
0171     popMenu.addAction(m_defineAsCurrent);
0172 
0173     auto isVoid= !m_index.isValid();
0174 
0175     m_addDirectoryAct->setEnabled(isDir || isVoid);
0176     m_deleteFileAct->setEnabled(!isVoid);
0177     m_deleteFileAct->setData(path);
0178     m_defineAsCurrent->setEnabled(isDir);
0179     m_renameAct->setEnabled(!isVoid);
0180     m_openAct->setEnabled(!isDir && !isVoid);
0181     openAs->setEnabled(!isDir && !isVoid);
0182 
0183     popMenu.exec(QCursor::pos());
0184 }
0185 void CampaignView::mouseDoubleClickEvent(QMouseEvent* event)
0186 {
0187     QModelIndex index= indexAt(event->pos());
0188     if(!index.isValid())
0189         return;
0190 
0191     // emit onDoubleClick(index);
0192     QTreeView::mouseDoubleClickEvent(event);
0193 }
0194 
0195 void CampaignView::onAddChapter()
0196 {
0197     // QModelIndex index= indexAt(m_pointClick);
0198 
0199     //  emit addChapter(index);
0200 }
0201 
0202 void CampaignView::setCurrentChapter(const QString& chapter)
0203 {
0204     // if()
0205 }
0206 
0207 QModelIndexList CampaignView::getSelection() const
0208 {
0209     return selectionModel()->selectedRows();
0210 }
0211 
0212 QString CampaignView::currentChapter() const
0213 {
0214     return {};
0215 }
0216 
0217 void CampaignView::setCampaign(Campaign* campaign)
0218 {
0219     m_campaign= campaign;
0220 }
0221 
0222 void CampaignView::addOpenAsActs(QMenu* menu, Core::MediaType type)
0223 {
0224     menu->setEnabled(false);
0225     auto const& values= m_convertionHash.value(type);
0226 
0227     if(values.isEmpty())
0228         return;
0229 
0230     menu->setEnabled(true);
0231     for(auto val : values)
0232     {
0233         menu->addAction(val);
0234     }
0235 }
0236 } // namespace campaign