diff --git a/src/dialog/filtereditdialog.cpp b/src/dialog/filtereditdialog.cpp index fc019298..f7e3ca14 100644 --- a/src/dialog/filtereditdialog.cpp +++ b/src/dialog/filtereditdialog.cpp @@ -1,373 +1,376 @@ /* This file is part of KOrganizer. Copyright (c) 2001 Cornelius Schumacher Copyright (C) 2004 Reinhold Kainhofer Copyright (C) 2005 Thomas Zander 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. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "filtereditdialog.h" #include "korganizer_debug.h" #include #include #include #include #include #include FilterEditDialog::FilterEditDialog(QList *filters, QWidget *parent) : QDialog(parent) { setWindowTitle(i18nc("@title::window", "Edit Calendar Filters")); QVBoxLayout *mainLayout = new QVBoxLayout(this); QDialogButtonBox *buttonBox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Apply, this); mOkButton = buttonBox->button(QDialogButtonBox::Ok); mApplyButton = buttonBox->button(QDialogButtonBox::Apply); mOkButton->setDefault(true); mOkButton->setShortcut(Qt::CTRL | Qt::Key_Return); connect(buttonBox, &QDialogButtonBox::accepted, this, &FilterEditDialog::slotOk); connect(buttonBox, &QDialogButtonBox::rejected, this, &FilterEditDialog::reject); mainLayout->addWidget(mFilterEdit = new FilterEdit(filters, this)); mainLayout->addWidget(buttonBox); connect(mFilterEdit, &FilterEdit::dataConsistent, this, &FilterEditDialog::setDialogConsistent); updateFilterList(); connect(mFilterEdit, &FilterEdit::editCategories, this, &FilterEditDialog::editCategories); connect(mFilterEdit, &FilterEdit::filterChanged, this, &FilterEditDialog::filterChanged); connect(buttonBox->button( QDialogButtonBox::Apply), &QPushButton::clicked, this, &FilterEditDialog::slotApply); } FilterEditDialog::~FilterEditDialog() { delete mFilterEdit; mFilterEdit = nullptr; } void FilterEditDialog::updateFilterList() { mFilterEdit->updateFilterList(); } void FilterEditDialog::slotApply() { mFilterEdit->saveChanges(); } void FilterEditDialog::slotOk() { slotApply(); accept(); } void FilterEditDialog::setDialogConsistent(bool consistent) { mOkButton->setEnabled(consistent); mApplyButton->setEnabled(consistent); } FilterEdit::FilterEdit(QList *filters, QWidget *parent) : QWidget(parent) { setupUi(this); searchline->setListWidget(mRulesList); mDetailsFrame->setEnabled(false); mFilters = filters; mNewButton->setWhatsThis( i18nc("@info:whatsthis", "Press this button to define a new filter.")); mDeleteButton->setWhatsThis( i18nc("@info:whatsthis", "Press this button to remove the currently active filter.")); connect(mRulesList, qOverload<>(&QListWidget::itemSelectionChanged), this, qOverload<>(&FilterEdit::filterSelected)); connect(mNewButton, &QPushButton::clicked, this, &FilterEdit::bNewPressed); connect(mDeleteButton, &QPushButton::clicked, this, &FilterEdit::bDeletePressed); connect(mNameLineEdit, &QLineEdit::textChanged, this, &FilterEdit::updateSelectedName); connect(mCatEditButton, &QPushButton::clicked, this, &FilterEdit::editCategorySelection); connect(mCompletedCheck, &QCheckBox::toggled, mCompletedTimeSpanLabel, &QLabel::setEnabled); connect(mCompletedCheck, &QCheckBox::toggled, mCompletedTimeSpan, &QSpinBox::setEnabled); } FilterEdit::~FilterEdit() { } void FilterEdit::updateFilterList() { mRulesList->clear(); if (!mFilters || mFilters->empty()) { mDetailsFrame->setEnabled(false); Q_EMIT dataConsistent(false); } else { QList::iterator i; QList::iterator end(mFilters->end()); for (i = mFilters->begin(); i != end; ++i) { if (*i) { mRulesList->addItem((*i)->name()); } } if (mRulesList->currentRow() != -1) { KCalendarCore::CalFilter *f = mFilters->at(mRulesList->currentRow()); if (f) { filterSelected(f); } } Q_EMIT dataConsistent(true); } if (mFilters && !mFilters->isEmpty() && !mCurrent) { filterSelected(mFilters->at(0)); } if (mFilters) { mDeleteButton->setEnabled(!mFilters->isEmpty()); } } void FilterEdit::saveChanges() { if (!mCurrent) { return; } mCurrent->setName(mNameLineEdit->text()); int criteria = 0; if (mCompletedCheck->isChecked()) { criteria |= KCalendarCore::CalFilter::HideCompletedTodos; } if (mRecurringCheck->isChecked()) { criteria |= KCalendarCore::CalFilter::HideRecurring; } if (mCatShowCheck->isChecked()) { criteria |= KCalendarCore::CalFilter::ShowCategories; } if (mHideInactiveTodosCheck->isChecked()) { criteria |= KCalendarCore::CalFilter::HideInactiveTodos; } if (mHideTodosNotAssignedToMeCheck->isChecked()) { criteria |= KCalendarCore::CalFilter::HideNoMatchingAttendeeTodos; } mCurrent->setCriteria(criteria); mCurrent->setCompletedTimeSpan(mCompletedTimeSpan->value()); QStringList categoryList; const int numberOfCat(mCatList->count()); for (int i = 0; i < numberOfCat; ++i) { QListWidgetItem *item = mCatList->item(i); if (item) { categoryList.append(item->text()); } } mCurrent->setCategoryList(categoryList); Q_EMIT filterChanged(); } void FilterEdit::filterSelected() { if (mRulesList->currentRow() < mFilters->count()) { mDetailsFrame->setEnabled(true); filterSelected(mFilters->at(mRulesList->currentRow())); } } void FilterEdit::filterSelected(KCalendarCore::CalFilter *filter) { if (!filter || filter == mCurrent) { return; } qCDebug(KORGANIZER_LOG) << "Selected filter" << filter->name(); saveChanges(); mCurrent = filter; mNameLineEdit->blockSignals(true); mNameLineEdit->setText(mCurrent->name()); mNameLineEdit->blockSignals(false); mDetailsFrame->setEnabled(true); mCompletedCheck->setChecked(mCurrent->criteria() & KCalendarCore::CalFilter::HideCompletedTodos); mCompletedTimeSpan->setValue(mCurrent->completedTimeSpan()); mRecurringCheck->setChecked(mCurrent->criteria() & KCalendarCore::CalFilter::HideRecurring); mHideInactiveTodosCheck->setChecked( mCurrent->criteria() & KCalendarCore::CalFilter::HideInactiveTodos); mHideTodosNotAssignedToMeCheck->setChecked( mCurrent->criteria() & KCalendarCore::CalFilter::HideNoMatchingAttendeeTodos); if (mCurrent->criteria() & KCalendarCore::CalFilter::ShowCategories) { mCatShowCheck->setChecked(true); } else { mCatHideCheck->setChecked(true); } mCatList->clear(); mCatList->addItems(mCurrent->categoryList()); } void FilterEdit::bNewPressed() { mDetailsFrame->setEnabled(true); saveChanges(); QStringList filterNames; const int numRules = mRulesList->count(); filterNames.reserve(numRules); for (int i = 0; i < numRules; ++i) { filterNames << mRulesList->item(i)->text(); } QString newFilterName; for (int i = 1;; ++i) { newFilterName = i18nc("@label default filter name", "New Filter %1", i); if (!filterNames.contains(newFilterName)) { break; } } KCalendarCore::CalFilter *newFilter = new KCalendarCore::CalFilter(newFilterName); mFilters->append(newFilter); updateFilterList(); mRulesList->setCurrentRow(mRulesList->count() - 1); Q_EMIT filterChanged(); } void FilterEdit::bDeletePressed() { if (!mRulesList->currentItem()) { // nothing selected return; } if (mFilters->isEmpty()) { // We need at least a default filter object. return; } if (KMessageBox::warningContinueCancel( this, i18nc("@info", "Do you really want to permanently remove the filter \"%1\"?", mCurrent->name()), i18nc("@title:window", "Delete Filter?"), KStandardGuiItem::del()) == KMessageBox::Cancel) { return; } int selected = mRulesList->currentRow(); KCalendarCore::CalFilter *filter = mFilters->at(selected); mFilters->removeAll(filter); delete filter; mCurrent = nullptr; updateFilterList(); mRulesList->setCurrentRow(qMin(mRulesList->count() - 1, selected)); Q_EMIT filterChanged(); } void FilterEdit::updateSelectedName(const QString &newText) { mRulesList->blockSignals(true); QListWidgetItem *item = mRulesList->currentItem(); if (item) { item->setText(newText); } mRulesList->blockSignals(false); if (correctName(newText)) { Q_EMIT dataConsistent(false); return; } bool allOk = true; for (KCalendarCore::CalFilter *i : qAsConst(*mFilters)) { if (i && i->name().isEmpty()) { allOk = false; } } Q_EMIT dataConsistent(allOk); } bool FilterEdit::correctName(const QString &newText) { bool negative = false; #ifndef QT_NO_STYLE_STYLESHEET QString styleSheet; if (mNegativeBackground.isEmpty()) { const KStatefulBrush bgBrush = KStatefulBrush(KColorScheme::View, KColorScheme::NegativeBackground); mNegativeBackground = QStringLiteral("QLineEdit{ background-color:%1 }").arg(bgBrush.brush( mNameLineEdit).color().name()); } if (!newText.isEmpty()) { const int val = mRulesList->count(); for (int i = 0; i < val; ++i) { QListWidgetItem *item = mRulesList->item(i); if (item && (mRulesList->currentItem() != item)) { if (newText == item->text()) { negative = true; break; } } } } else { negative = true; } if (negative) { styleSheet = mNegativeBackground; } mNameLineEdit->setStyleSheet(styleSheet); #endif return negative; } void FilterEdit::editCategorySelection() { if (!mCurrent) { return; } if (!mCategorySelectDialog) { mCategorySelectDialog = new KPIM::TagSelectionDialog(this); - mCategorySelectDialog->buttons()->setStandardButtons( - QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help); - connect(mCategorySelectDialog, &KPIM::TagSelectionDialog::accepted, this, - &FilterEdit::updateCategorySelection); - connect(mCategorySelectDialog->buttons()->button( - QDialogButtonBox::Help), &QPushButton::clicked, this, &FilterEdit::slotHelp); + QDialogButtonBox *buttons = mCategorySelectDialog->buttons(); + if (buttons) { + buttons->setStandardButtons( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help); + connect(mCategorySelectDialog, &KPIM::TagSelectionDialog::accepted, + this, &FilterEdit::updateCategorySelection); + connect(buttons->button(QDialogButtonBox::Help), &QPushButton::clicked, + this, &FilterEdit::slotHelp); + } } mCategorySelectDialog->setSelection(mCurrent->categoryList()); mCategorySelectDialog->show(); } void FilterEdit::slotHelp() { PimCommon::Util::invokeHelp(QStringLiteral("korganizer/filters-view.html")); } void FilterEdit::updateCategorySelection() { const QStringList &categories = mCategorySelectDialog->selection(); mCatList->clear(); mCatList->addItems(categories); mCurrent->setCategoryList(categories); } diff --git a/src/kodialogmanager.cpp b/src/kodialogmanager.cpp index 933c839c..b8918e82 100644 --- a/src/kodialogmanager.cpp +++ b/src/kodialogmanager.cpp @@ -1,231 +1,232 @@ /* This file is part of KOrganizer. Copyright (c) 2001 Cornelius Schumacher Copyright (C) 2003-2004 Reinhold Kainhofer 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. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. As a special exception, permission is given to link this program with any edition of Qt, and distribute the resulting executable, without including the source code for Qt in the source distribution. */ #include "kodialogmanager.h" #include "calendarview.h" #include "dialog/filtereditdialog.h" #include "prefs/koprefs.h" #include "dialog/searchdialog.h" #include #include #include #include #include #include #include #include #include #include #include using namespace KOrg; // FIXME: Handle KOEventViewerDialogs in dialog manager. class KODialogManager::DialogManagerVisitor : public KCalendarCore::Visitor { public: DialogManagerVisitor() { } bool act(KCalendarCore::IncidenceBase::Ptr &incidence, KODialogManager *manager) { mDialogManager = manager; return incidence->accept(*this, incidence); } protected: KODialogManager *mDialogManager = nullptr; }; KODialogManager::KODialogManager(CalendarView *mainView) : QObject() , mMainView(mainView) { mOptionsDialog = nullptr; mSearchDialog = nullptr; mArchiveDialog = nullptr; mFilterEditDialog = nullptr; mCategoryEditDialog = nullptr; } KODialogManager::~KODialogManager() { delete mOptionsDialog; delete mSearchDialog; delete mArchiveDialog; delete mFilterEditDialog; delete mCategoryEditDialog; } void KODialogManager::showOptionsDialog() { if (!mOptionsDialog) { mOptionsDialog = new KCMultiDialog(mMainView); connect(mOptionsDialog, qOverload(&KCMultiDialog::configCommitted), mMainView, qOverload(&CalendarView::updateConfig)); QStringList modules; modules.append(QStringLiteral("korganizer_configmain.desktop")); modules.append(QStringLiteral("korganizer_configtime.desktop")); modules.append(QStringLiteral("korganizer_configviews.desktop")); modules.append(QStringLiteral("korganizer_configcolorsandfonts.desktop")); modules.append(QStringLiteral("korganizer_configgroupscheduling.desktop")); modules.append(QStringLiteral("korganizer_configfreebusy.desktop")); modules.append(QStringLiteral("korganizer_configplugins.desktop")); modules.append(QStringLiteral("korganizer_configdesignerfields.desktop")); #ifdef WITH_KUSERFEEDBACK modules.append(QStringLiteral("korganizer_userfeedback.desktop")); #endif // add them all const QStringList::iterator mitEnd(modules.end()); for (QStringList::iterator mit = modules.begin(); mit != mitEnd; ++mit) { mOptionsDialog->addModule(*mit); } } mOptionsDialog->show(); mOptionsDialog->raise(); } void KODialogManager::showCategoryEditDialog() { createCategoryEditor(); mCategoryEditDialog->exec(); } void KODialogManager::showSearchDialog() { if (!mSearchDialog) { mSearchDialog = new SearchDialog(mMainView); //mSearchDialog->setCalendar( mMainView->calendar() ); connect(mSearchDialog, SIGNAL(showIncidenceSignal(Akonadi::Item)), mMainView, SLOT(showIncidence(Akonadi::Item))); connect(mSearchDialog, SIGNAL(editIncidenceSignal(Akonadi::Item)), mMainView, SLOT(editIncidence(Akonadi::Item))); connect(mSearchDialog, SIGNAL(deleteIncidenceSignal(Akonadi::Item)), mMainView, SLOT(deleteIncidence(Akonadi::Item))); } // make sure the widget is on top again mSearchDialog->show(); mSearchDialog->raise(); } void KODialogManager::showArchiveDialog() { if (!mArchiveDialog) { mArchiveDialog = new CalendarSupport::ArchiveDialog(mMainView->calendar(), mMainView->incidenceChanger()); connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::eventsDeleted, mMainView, qOverload<>(&CalendarView::updateView)); connect(mArchiveDialog, &CalendarSupport::ArchiveDialog::autoArchivingSettingsModified, mMainView, &CalendarView::slotAutoArchivingSettingsModified); } mArchiveDialog->show(); mArchiveDialog->raise(); // Workaround. QApplication::restoreOverrideCursor(); } void KODialogManager::showFilterEditDialog(QList *filters) { createCategoryEditor(); if (!mFilterEditDialog) { mFilterEditDialog = new FilterEditDialog(filters, mMainView); connect(mFilterEditDialog, &FilterEditDialog::filterChanged, mMainView, &CalendarView::updateFilter); connect(mFilterEditDialog, &FilterEditDialog::editCategories, mCategoryEditDialog.data(), &QWidget::show); } mFilterEditDialog->show(); mFilterEditDialog->raise(); } IncidenceEditorNG::IncidenceDialog *KODialogManager::createDialog(const Akonadi::Item &item) { const KCalendarCore::Incidence::Ptr incidence = CalendarSupport::incidence(item); if (!incidence) { return nullptr; } IncidenceEditorNG::IncidenceDialog *dialog = IncidenceEditorNG::IncidenceDialogFactory::create( /*needs initial saving=*/ false, incidence->type(), mMainView->incidenceChanger(), mMainView); return dialog; } void KODialogManager::connectTypeAhead(IncidenceEditorNG::IncidenceDialog *dialog, KOEventView *view) { if (dialog && view) { view->setTypeAheadReceiver(dialog->typeAheadReceiver()); } } void KODialogManager::connectEditor(IncidenceEditorNG::IncidenceDialog *editor) { createCategoryEditor(); connect(editor, SIGNAL(deleteIncidenceSignal(Akonadi::Item)), mMainView, SLOT(deleteIncidence(Akonadi::Item))); connect(editor, SIGNAL(dialogClose(Akonadi::Item)), mMainView, SLOT(dialogClosing(Akonadi::Item))); connect(editor, SIGNAL(deleteAttendee(Akonadi::Item)), mMainView, SIGNAL(cancelAttendees(Akonadi::Item))); } void KODialogManager::updateSearchDialog() { if (mSearchDialog) { mSearchDialog->updateView(); } } void KODialogManager::createCategoryEditor() { if (!mCategoryEditDialog) { mCategoryEditDialog = new Akonadi::TagManagementDialog(mMainView); - mCategoryEditDialog->buttons()->setStandardButtons( - QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help); - connect(mCategoryEditDialog->buttons()->button( - QDialogButtonBox::Help), &QPushButton::clicked, this, - &KODialogManager::slotHelp); - + QDialogButtonBox *buttons = mCategoryEditDialog->buttons(); + if (buttons) { + buttons->setStandardButtons( + QDialogButtonBox::Ok | QDialogButtonBox::Cancel | QDialogButtonBox::Help); + connect(buttons->button(QDialogButtonBox::Help), &QPushButton::clicked, + this, &KODialogManager::slotHelp); + } mCategoryEditDialog->setModal(true); } } void KODialogManager::slotHelp() { PimCommon::Util::invokeHelp(QStringLiteral("korganizer/categories-view.html")); }