/* 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 #include "archiveview.h" #include "smglobals.h" #include "helper.h" /* Mapping Editor Widget */ MappingEditorWidget::MappingEditorWidget(const QString &caption, bool showClearButton, QWidget *parent) : QWidget(parent), mCaption(caption){ // the view mModel = new QStandardItemModel(this); mModel->setHorizontalHeaderItem(0, new QStandardItem(mCaption)); mProxy = new QSortFilterProxyModel(this); mProxy->setSourceModel(mModel); QVBoxLayout *viewLayout = new QVBoxLayout; mView = new SmTreeView; viewLayout->addWidget(mView); mView->setModel(mProxy); mView->setSortingEnabled(true); // line editor QHBoxLayout *editLayout = new QHBoxLayout; QLabel *l2 = new QLabel(tr("Add:")); mEditor = new QLineEdit; mCompleter = new QCompleter(this); mCompleterModel = new QStringListModel(this); mCompleter->setModel(mCompleterModel); mEditor->setCompleter(mCompleter); editLayout->addWidget(l2); editLayout->addWidget(mEditor); // edit buttons QHBoxLayout *editButtonLayout = new QHBoxLayout; editButtonLayout->addStretch(); mClear = new QPushButton(tr("Clear")); connect(mClear, &QPushButton::clicked, this, &MappingEditorWidget::clear); if(showClearButton){ editButtonLayout->addWidget(mClear); } mRemove = new QPushButton(tr("&Remove")); connect(mRemove, &QPushButton::clicked, this, &MappingEditorWidget::removeItem); editButtonLayout->addWidget(mRemove); mAdd = new QPushButton(tr("&Add")); connect(mAdd, &QPushButton::clicked, this, &MappingEditorWidget::addItem); editButtonLayout->addWidget(mAdd); // main layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addLayout(viewLayout); mainLayout->addLayout(editLayout); mainLayout->addLayout(editButtonLayout); setLayout(mainLayout); } void MappingEditorWidget::fillCompleter(const QStringList &completions){ mCompleterModel->setStringList(completions); } void MappingEditorWidget::setCurrentItems(const QStringList &items){ for(const QString &i : items){ QStandardItem *item = new QStandardItem(i); item->setIcon(mDecorationIcon); mModel->appendRow(item); } } QStringList MappingEditorWidget::items() const{ QStringList retval; for(int i = 0; i < mModel->rowCount(); ++i){ QStandardItem *item = mModel->item(i); retval << item->text(); } return retval; } void MappingEditorWidget::clear(){ mModel->clear(); mModel->setHorizontalHeaderItem(0, new QStandardItem(mCaption)); mEditor->clear(); } void MappingEditorWidget::addItem(){ QString itemName = mEditor->text(); if(itemName.isEmpty()){ return; } QList found = mModel->findItems(itemName, Qt::MatchFixedString); if(found.size()){ return; } QStandardItem *newItem = new QStandardItem(itemName); newItem->setIcon(mDecorationIcon); mModel->appendRow(newItem); mProxy->sort(0, mProxy->sortOrder()); mEditor->clear(); } void MappingEditorWidget::removeItem(){ QModelIndexList sel = mView->selectionModel()->selectedRows(); if(sel.isEmpty()){ return; } QModelIndex real = mProxy->mapToSource(sel.first()); mModel->removeRow(real.row()); } /* Mapping Editor */ MappingEditor::MappingEditor(const QString &caption, QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f) { // Mapping Editor Widget mWidget = new MappingEditorWidget(caption); // buttons QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); mCancel = new QPushButton(tr("Cancel")); connect(mCancel, &QPushButton::clicked, this, &MappingEditor::reject); buttonLayout->addWidget(mCancel); mAccept = new QPushButton(tr("Accept")); connect(mAccept, &QPushButton::clicked, this, &MappingEditor::accept); buttonLayout->addWidget(mAccept); // dialog layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mWidget); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setMinimumWidth(300); } /* Metadata Editor Widget */ MetadataEditorWidget::MetadataEditorWidget(QWidget *parent) : QWidget(parent){ QLabel *captionL = new QLabel(tr("Edit Metadata")); QGroupBox *genGB = new QGroupBox(tr("General")); QFormLayout *genGBL = new QFormLayout; mReleaseYear = new QSpinBox; mReleaseYear->setMinimum(1900); mReleaseYear->setMaximum(3000); mReleaseYear->setValue(QDate::currentDate().year()); genGBL->addRow(tr("&Release Year"), mReleaseYear); mSubject = new QLineEdit; genGBL->addRow(tr("Name/Sub&ject"), mSubject); genGB->setLayout(genGBL); QGroupBox *srcGB = new QGroupBox(tr("Source")); QHBoxLayout *srcGBL = new QHBoxLayout; mTorrent = new QRadioButton(tr("BitTorrent")); mTorrent->toggle(); mUsenet = new QRadioButton(tr("Usenet")); srcGBL->addWidget(mTorrent); srcGBL->addWidget(mUsenet); srcGBL->addStretch(); srcGB->setLayout(srcGBL); QGroupBox *reasonGB = new QGroupBox(tr("Reencode reason")); QVBoxLayout *reasonGBL = new QVBoxLayout; mReencReason = new QComboBox; QStringList reasons = SmGlobals::instance()->reencReasons(); mReencReason->addItems(reasons); connect(mReencReason, QOverload::of(&QComboBox::activated), this, &MetadataEditorWidget::addToComment); QPushButton *clearB = new QPushButton(tr("Clear")); reasonGBL->addWidget(mReencReason); reasonGBL->addWidget(clearB); reasonGBL->addStretch(); reasonGB->setLayout(reasonGBL); QHBoxLayout *srcReasonL = new QHBoxLayout; srcReasonL->addWidget(srcGB); //comment QGroupBox *commentGB = new QGroupBox(tr("Comment")); mComment = new QTextEdit; QHBoxLayout *commentGBL = new QHBoxLayout; commentGBL->addWidget(mComment); commentGBL->addWidget(reasonGB); commentGB->setLayout(commentGBL); connect(clearB, &QPushButton::clicked, [this] { mComment->clear(); }); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(captionL); mainLayout->addWidget(genGB); mainLayout->addLayout(srcReasonL); mainLayout->addWidget(commentGB); setLayout(mainLayout); } void MetadataEditorWidget::setMetadata(const QList &data){ mReleaseYear->setValue(data.at(ArchiveModel::ReleaseYear).toInt()); QString src = data.at(ArchiveModel::Source).toString(); if(src == "torrent"){ mTorrent->toggle(); }else{ mUsenet->toggle(); } mSubject->setText(data.at(ArchiveModel::Subject).toString()); mComment->setText(data.at(ArchiveModel::Comment).toString()); mAdded = data.at(ArchiveModel::Added).toDate(); } QList MetadataEditorWidget::metadata() const{ QList retval; for(int i = 0; i < ArchiveModel::MetadataNumFields; ++i){ retval << QVariant(); } retval[ArchiveModel::ReleaseYear] = mReleaseYear->value(); QString source = "torrent"; if(mUsenet->isChecked()){ source = "Usenet"; } retval[ArchiveModel::Source] = source; retval[ArchiveModel::Subject] = mSubject->text(); retval[ArchiveModel::Comment] = mComment->toPlainText(); retval[ArchiveModel::Added] = mAdded; return retval; } void MetadataEditorWidget::addToComment(const QString &reason){ mComment->append(reason); } void MetadataEditorWidget::replaceSubject(const QString &subject){ mSubject->setText(subject); } /* Metadata Editor */ MetadataEditor::MetadataEditor(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ mWidget = new MetadataEditorWidget; QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); mCancel = new QPushButton(tr("Cancel")); connect(mCancel, &QPushButton::clicked, this, &MetadataEditor::reject); buttonLayout->addWidget(mCancel); mAccept = new QPushButton(tr("Accept")); connect(mAccept, &QPushButton::clicked, this, &MetadataEditor::accept); buttonLayout->addWidget(mAccept); QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(mWidget); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); setMinimumWidth(400); } /* Part Editor */ PartEditor::PartEditor(QWidget *parent, Qt::WindowFlags f) : QDialog(parent, f){ QLabel *captionL = new QLabel(tr("Edit part")); QFormLayout *editLayout = new QFormLayout; // part no mPartNo = new QSpinBox; mPartNo->setMinimum(0); mPartNo->setMaximum(1024); editLayout->addRow(tr("Part &no"), mPartNo); // subtitle mSubtitle = new QLineEdit; editLayout->addRow(tr("&Subtitle"), mSubtitle); // buttons QHBoxLayout *buttonLayout = new QHBoxLayout; buttonLayout->addStretch(); mCancel = new QPushButton(tr("Cancel")); connect(mCancel, &QPushButton::clicked, this, &PartEditor::reject); mAccept = new QPushButton(tr("Accept")); connect(mAccept, &QPushButton::clicked, this, &PartEditor::accept); buttonLayout->addWidget(mCancel); buttonLayout->addWidget(mAccept); // main layout QVBoxLayout *mainLayout = new QVBoxLayout; mainLayout->addWidget(captionL); mainLayout->addLayout(editLayout); mainLayout->addLayout(buttonLayout); setLayout(mainLayout); } void PartEditor::setPartNo(int partNo){ mPartNo->setValue(partNo); } int PartEditor::partNo() const { return mPartNo->value(); } void PartEditor::setSubtitle(const QString &subtitle){ mSubtitle->setText(subtitle); } QString PartEditor::subtitle() const { return mSubtitle->text(); }