/* 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 2 of the License, or (at your option) any later version. */ #include #include #include #include #include #include #include #include #include #include #include #include #include "pictureswidget.h" #include "picturelistview.h" #include "mappingtreewidget.h" #include "mappingtreeview.h" #include "mappingtreeproxy.h" #include "mappingeditwidget.h" #include "mappingeditdialog.h" #include "mappingtreeresultmodel.h" #include "mappingdata.h" #include "delegates.h" #include "smglobals.h" #include "helper.h" PicturesWidget::PicturesWidget(QWidget *parent) : QWidget(parent), mWindowTitleBase(tr("Picture archive")) { mMappingTree = new MappingTreeWidget; mPictureListView = new PictureListView; mPictureListView->setItemDelegateForColumn(PicFilesModel::Size, new SizeDelegate(this)); mPictureListView->readHeaderConfig(); connect(mMappingTree, &MappingTreeWidget::mappingChanged, mPictureListView, &PictureListView::mappingChanged); connect(mMappingTree, &MappingTreeWidget::mappingChanged, this, &PicturesWidget::constructWindowTitle); connect(mPictureListView, &PictureListView::doubleClicked, this, &PicturesWidget::showInPicViewer); connect(this, &PicturesWidget::editMappingsDone, mPictureListView, &PictureListView::refresh); //misc mEditDialog = new MappingEditDialog(this); mPicViewer = SmGlobals::instance()->pictureViewer(); mPictureListView->setPV(mPicViewer); setupWidget(); } void PicturesWidget::setupWidget(){ QToolBar *toolBar = new QToolBar; QAction *showInPicViewerA = new QAction(QIcon(":/snapshot.png"), tr("Show"), this); connect(showInPicViewerA, &QAction::triggered, this, [=] { QModelIndexList r = mPictureListView->selectionModel()->selectedRows(); if(!r.isEmpty()){ showInPicViewer(r.first()); } }); QWidget *spacer1 = new QWidget; spacer1->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); toolBar->addWidget(spacer1); QAction *slideA = new QAction(QIcon(":/huge_bra_light.png"), tr("Slide dialog..."), this); connect(slideA, &QAction::triggered, [=] { int ret = SmGlobals::instance()->pictureViewer()->slideDialog()->exec(); if(ret == QDialog::Accepted){ SmGlobals::instance()->pictureViewer()->show(); } }); toolBar->addAction(slideA); mPictureListView->addAction(slideA); toolBar->addAction(showInPicViewerA); mPictureListView->addAction(showInPicViewerA); QAction *deleteA = new QAction(QIcon(":/delete.png"), tr("Delete"), this); connect(deleteA, &QAction::triggered, mPictureListView, &PictureListView::deletePics); toolBar->addAction(deleteA); mPictureListView->addAction(deleteA); toolBar->addSeparator(); mPictureListView->addAction(Helper::createSeparator(mPictureListView)); QAction *editMappingsA = new QAction(QIcon(":/squirting_nipple_light.png"), tr("Edit mappings..."), this); connect(editMappingsA, &QAction::triggered, this, &PicturesWidget::editMappings); toolBar->addAction(editMappingsA); mPictureListView->addAction(editMappingsA); QAction *refreshA = new QAction(QIcon(":/refresh.png"), tr("Refresh"), this); connect(refreshA, &QAction::triggered, mPictureListView, &PictureListView::refresh); toolBar->addAction(refreshA); mPictureListView->addAction(refreshA); toolBar->addSeparator(); QHash hData = mPictureListView->filesModel()->headerData(); QStringList hDataSorted = hData.keys(); std::sort(hDataSorted.begin(), hDataSorted.end()); QActionGroup *hDataAG = new QActionGroup(this); hDataAG->setExclusive(false); for(const QString &h : hDataSorted){ QAction *a = new QAction(h, this); a->setCheckable(true); a->setData(hData.value(h)); hDataAG->addAction(a); if(!mPictureListView->header()->isSectionHidden(hData.value(h))){ a->setChecked(true); } connect(a, &QAction::triggered, this, [=] { mPictureListView->toggleHeader(a); }); } QIcon headerIcon = Helper::icon(Qt::transparent, qApp->palette().color(QPalette::Text), 'H', true, false); QAction *headerA = new QAction(headerIcon, tr("Show headers"), this); QMenu *headerMenu = new QMenu; headerMenu->addActions(hDataAG->actions()); headerA->setMenu(headerMenu); toolBar->addAction(headerA); mPictureListView->addAction(headerA); toolBar->addSeparator(); toolBar->addAction(SmGlobals::instance()->globalAction()); QWidget *spacer2 = new QWidget; spacer2->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); toolBar->addWidget(spacer2); QWidget *leftWidget = new QWidget; QVBoxLayout *leftWidgetL = new QVBoxLayout; leftWidgetL->setSpacing(2); leftWidgetL->addWidget(toolBar); leftWidgetL->addWidget(mPictureListView); leftWidget->setLayout(leftWidgetL); QSplitter *splitter = new QSplitter; splitter->addWidget(mMappingTree); splitter->addWidget(leftWidget); splitter->setStretchFactor(0, 1); splitter->setStretchFactor(1, 3); QHBoxLayout *mainLayout = new QHBoxLayout; mainLayout->addWidget(splitter); setLayout(mainLayout); } void PicturesWidget::showPicViewer(bool toggled){ mPicViewer->setVisible(toggled); } void PicturesWidget::writeSettings(){ QSettings s; MappingData selected = mMappingTree->selectedItem(); if(selected.isValid()){ QStringList v; for(int i = 0; i< selected.parents.count(); ++i){ v << QString::number(selected.parents.at(i)); } s.setValue("ui/selectedmapping", v.join(",")); } mPictureListView->writeHeaderConfig(); } void PicturesWidget::readSettings(){ QSettings s; QStringList ps = s.value("ui/selectedmapping").toString().split(","); QList path; for(int i = 0; i < ps.count(); ++i){ path << ps.at(i).toInt(); } QModelIndex sel = mMappingTree->mappingTreeModel()->indexFromParentPath(path, true); QModelIndex selProxy = mMappingTree->mappingTreeProxy()->mapFromSource(sel); mMappingTree->mappingTreeView()->selectionModel()->select(selProxy, QItemSelectionModel::Rows | QItemSelectionModel::ClearAndSelect); } void PicturesWidget::editMappings(){ QModelIndexList selectedFids = mPictureListView->selectionModel()->selectedRows(PicFilesModel::Id); QList fileIds; for(QModelIndex idx : selectedFids){ fileIds << idx.data().toInt(); } QList mappings = mPictureListView->filesModel()->mappingDataFromFiles(fileIds); mEditDialog->editWidget()->setMappings(mappings); int retval = mEditDialog->exec(); if(retval == QDialog::Accepted){ QList selMappings = mEditDialog->editWidget()->model()->columnValues(MappingTreeResultModel::MappingId); if(selMappings.isEmpty()){ QMessageBox::critical(this, tr("Error"), tr("No mappings selected! Cowardly bailing out.")); return; } QModelIndexList selectedFids = mPictureListView->selectionModel()->selectedRows(PicFilesModel::Id); QList fileIds; for(QModelIndex idx : selectedFids){ fileIds << idx.data().toInt(); } mPictureListView->filesModel()->changeMappings(fileIds, selMappings); } emit editMappingsDone(); } void PicturesWidget::constructWindowTitle(){ QString windowTitle = mWindowTitleBase; MappingData selected = mMappingTree->selectedItem(); if(!selected.path.isEmpty()){ windowTitle = QString("%1 - [%2]").arg(mWindowTitleBase, selected.path.join("/")); } emit needWindowTitleChange(windowTitle); } void PicturesWidget::showInPicViewer(const QModelIndex &idx){ QModelIndex real = mPictureListView->proxy()->mapToSource(idx); if(!real.isValid()){ return; } PicData pData = mPictureListView->filesModel()->dataList(real); mPicViewer->setShowInfoItem(true); mPicViewer->setShowMappingItem(true); mPicViewer->setShowMarkItem(false); mPicViewer->setFile(pData); mPictureListView->setPVAll(); mPicViewer->show(); }