KOEditorAttachments::KOEditorAttachments( int spacing, QWidget *parent ) : QWidget( parent ) { QBoxLayout *topLayout = new QHBoxLayout( this ); topLayout->setSpacing( spacing ); QLabel *label = new QLabel( i18nc( "@label", "Attachments:" ), this ); topLayout->addWidget( label ); mAttachments = new AttachmentIconView( this ); mAttachments->setWhatsThis( i18nc( "@info:whatsthis", "Displays items (files, mail, etc.) that " "have been associated with this event or to-do." ) ); mAttachments->setItemsMovable( false ); mAttachments->setSelectionMode( Q3IconView::Extended ); topLayout->addWidget( mAttachments ); connect( mAttachments, SIGNAL(returnPressed(Q3IconViewItem *)), SLOT(showAttachment(Q3IconViewItem *)) ); connect( mAttachments, SIGNAL(doubleClicked(Q3IconViewItem *)), SLOT(showAttachment(Q3IconViewItem *)) ); connect( mAttachments, SIGNAL(itemRenamed(Q3IconViewItem *,const QString &)), SLOT(slotItemRenamed(Q3IconViewItem *,const QString &)) ); connect( mAttachments, SIGNAL(dropped(QDropEvent *,const Q3ValueList<Q3IconDragItem> &)), SLOT(dropped(QDropEvent *,const Q3ValueList<Q3IconDragItem> &)) ); connect( mAttachments, SIGNAL(selectionChanged()), SLOT(selectionChanged()) ); connect( mAttachments, SIGNAL(contextMenuRequested(Q3IconViewItem *,const QPoint &)), SLOT(contextMenu(Q3IconViewItem *,const QPoint &)) ); QPushButton *addButton = new QPushButton( this ); addButton->setIcon( KIcon( "list-add" ) ); addButton->setToolTip( i18nc( "@info:tooltip", "Add an attachment" ) ); addButton->setWhatsThis( i18nc( "@info:whatsthis", "Shows a dialog used to select an attachment " "to add to this event or to-do as link or as " "inline data." ) ); topLayout->addWidget( addButton ); connect( addButton, SIGNAL(clicked()), SLOT(slotAdd()) ); mRemoveBtn = new QPushButton( this ); mRemoveBtn->setIcon( KIcon( "list-remove" ) ); mRemoveBtn->setToolTip( i18nc( "@info:tooltip", "Remove the selected attachment" ) ); mRemoveBtn->setWhatsThis( i18nc( "@info:whatsthis", "Removes the attachment selected in the " "list above from this event or to-do." ) ); topLayout->addWidget( mRemoveBtn ); connect( mRemoveBtn, SIGNAL(clicked()), SLOT(slotRemove()) ); KActionCollection *ac = new KActionCollection( this ); ac->addAssociatedWidget( this ); mPopupMenu = new KMenu( this ); mOpenAction = new KAction( i18nc( "@action:inmenu open the attachment in a viewer", "&Open" ), this ); connect( mOpenAction, SIGNAL(triggered(bool)), this, SLOT(slotShow()) ); ac->addAction( "view", mOpenAction ); mPopupMenu->addAction( mOpenAction ); mPopupMenu->addSeparator(); mCopyAction = KStandardAction::copy( this, SLOT(slotCopy()), ac ); mPopupMenu->addAction( mCopyAction ); mCutAction = KStandardAction::cut( this, SLOT(slotCut()), ac ); mPopupMenu->addAction( mCutAction ); KAction *action = KStandardAction::paste( this, SLOT(slotPaste()), ac ); mPopupMenu->addAction( action ); mPopupMenu->addSeparator(); mDeleteAction = new KAction( i18nc( "@action:inmenu remove the attachment", "&Remove" ), this ); connect( mDeleteAction, SIGNAL(triggered(bool)), this, SLOT(slotRemove()) ); ac->addAction( "remove", mDeleteAction ); mPopupMenu->addAction( mDeleteAction ); mPopupMenu->addSeparator(); mEditAction = new KAction( i18nc( "@action:inmenu show a dialog used to edit the attachment", "&Properties..." ), this ); connect( mEditAction, SIGNAL(triggered(bool)), this, SLOT(slotEdit()) ); ac->addAction( "edit", mEditAction ); mPopupMenu->addAction( mEditAction ); selectionChanged(); setAcceptDrops( true ); }
BirthdayDlg::BirthdayDlg(QWidget* parent) : QDialog(parent), mSpecialActionsButton(Q_NULLPTR) { setObjectName(QStringLiteral("BirthdayDlg")); // used by LikeBack setWindowTitle(i18nc("@title:window", "Import Birthdays From KAddressBook")); QVBoxLayout* topLayout = new QVBoxLayout(this); topLayout->setSpacing(style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); // Prefix and suffix to the name in the alarm text // Get default prefix and suffix texts from config file KConfigGroup config(KSharedConfig::openConfig(), "General"); mPrefixText = config.readEntry("BirthdayPrefix", i18nc("@info", "Birthday: ")); mSuffixText = config.readEntry("BirthdaySuffix"); QGroupBox* textGroup = new QGroupBox(i18nc("@title:group", "Alarm Text"), this); topLayout->addWidget(textGroup); QGridLayout* grid = new QGridLayout(textGroup); grid->setMargin(style()->pixelMetric(QStyle::PM_DefaultChildMargin)); grid->setSpacing(style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); QLabel* label = new QLabel(i18nc("@label:textbox", "Prefix:"), textGroup); label->setFixedSize(label->sizeHint()); grid->addWidget(label, 0, 0); mPrefix = new BLineEdit(mPrefixText, textGroup); mPrefix->setMinimumSize(mPrefix->sizeHint()); label->setBuddy(mPrefix); connect(mPrefix, &BLineEdit::focusLost, this, &BirthdayDlg::slotTextLostFocus); mPrefix->setWhatsThis(i18nc("@info:whatsthis", "Enter text to appear before the person's name in the alarm message, " "including any necessary trailing spaces.")); grid->addWidget(mPrefix, 0, 1); label = new QLabel(i18nc("@label:textbox", "Suffix:"), textGroup); label->setFixedSize(label->sizeHint()); grid->addWidget(label, 1, 0); mSuffix = new BLineEdit(mSuffixText, textGroup); mSuffix->setMinimumSize(mSuffix->sizeHint()); label->setBuddy(mSuffix); connect(mSuffix, &BLineEdit::focusLost, this, &BirthdayDlg::slotTextLostFocus); mSuffix->setWhatsThis(i18nc("@info:whatsthis", "Enter text to appear after the person's name in the alarm message, " "including any necessary leading spaces.")); grid->addWidget(mSuffix, 1, 1); QGroupBox* group = new QGroupBox(i18nc("@title:group", "Select Birthdays"), this); topLayout->addWidget(group); QVBoxLayout* layout = new QVBoxLayout(group); layout->setMargin(0); // Start Akonadi server as we need it for the birthday model to access contacts information Akonadi::ControlGui::start(); BirthdayModel* model = BirthdayModel::instance(); connect(model, &BirthdayModel::dataChanged, this, &BirthdayDlg::resizeViewColumns); KDescendantsProxyModel* descendantsModel = new KDescendantsProxyModel(this); descendantsModel->setSourceModel(model); Akonadi::EntityMimeTypeFilterModel* mimeTypeFilter = new Akonadi::EntityMimeTypeFilterModel(this); mimeTypeFilter->setSourceModel(descendantsModel); mimeTypeFilter->addMimeTypeExclusionFilter(Akonadi::Collection::mimeType()); mimeTypeFilter->setHeaderGroup(Akonadi::EntityTreeModel::ItemListHeaders); mBirthdaySortModel = new BirthdaySortModel(this); mBirthdaySortModel->setSourceModel(mimeTypeFilter); mBirthdaySortModel->setSortCaseSensitivity(Qt::CaseInsensitive); mBirthdaySortModel->setPrefixSuffix(mPrefixText, mSuffixText); mListView = new QTreeView(group); mListView->setEditTriggers(QAbstractItemView::NoEditTriggers); mListView->setModel(mBirthdaySortModel); mListView->setRootIsDecorated(false); // don't show expander icons mListView->setSortingEnabled(true); mListView->sortByColumn(BirthdayModel::NameColumn); mListView->setAllColumnsShowFocus(true); mListView->setSelectionMode(QAbstractItemView::ExtendedSelection); mListView->setSelectionBehavior(QAbstractItemView::SelectRows); mListView->setTextElideMode(Qt::ElideRight); mListView->header()->setResizeMode(BirthdayModel::NameColumn, QHeaderView::Stretch); mListView->header()->setResizeMode(BirthdayModel::DateColumn, QHeaderView::ResizeToContents); connect(mListView->selectionModel(), &QItemSelectionModel::selectionChanged, this, &BirthdayDlg::slotSelectionChanged); mListView->setWhatsThis(xi18nc("@info:whatsthis", "<para>Select birthdays to set alarms for.<nl/>" "This list shows all birthdays in <application>KAddressBook</application> except those for which alarms already exist.</para>" "<para>You can select multiple birthdays at one time by dragging the mouse over the list, " "or by clicking the mouse while pressing Ctrl or Shift.</para>")); layout->addWidget(mListView); group = new QGroupBox(i18nc("@title:group", "Alarm Configuration"), this); topLayout->addWidget(group); QVBoxLayout* groupLayout = new QVBoxLayout(group); groupLayout->setMargin(style()->pixelMetric(QStyle::PM_DefaultChildMargin)); groupLayout->setSpacing(style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); // Sound checkbox and file selector QHBoxLayout* hlayout = new QHBoxLayout(); hlayout->setMargin(0); groupLayout->addLayout(hlayout); mSoundPicker = new SoundPicker(group); mSoundPicker->setFixedSize(mSoundPicker->sizeHint()); hlayout->addWidget(mSoundPicker); hlayout->addSpacing(2 * style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); hlayout->addStretch(); // Font and colour choice button and sample text mFontColourButton = new FontColourButton(group); mFontColourButton->setMaximumHeight(mFontColourButton->sizeHint().height() * 3/2); hlayout->addWidget(mFontColourButton); connect(mFontColourButton, &FontColourButton::selected, this, &BirthdayDlg::setColours); // How much advance warning to give mReminder = new Reminder(i18nc("@info:whatsthis", "Check to display a reminder in advance of or after the birthday."), i18nc("@info:whatsthis", "Enter the number of days before or after each birthday to display a reminder. " "This is in addition to the alarm which is displayed on the birthday."), i18nc("@info:whatsthis", "Select whether the reminder should be triggered before or after the birthday."), false, false, group); mReminder->setFixedSize(mReminder->sizeHint()); mReminder->setMaximum(0, 364); mReminder->setMinutes(0, true); groupLayout->addWidget(mReminder, 0, Qt::AlignLeft); // Acknowledgement confirmation required - default = no confirmation hlayout = new QHBoxLayout(); hlayout->setMargin(0); hlayout->setSpacing(2 * style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); groupLayout->addLayout(hlayout); mConfirmAck = EditDisplayAlarmDlg::createConfirmAckCheckbox(group); mConfirmAck->setFixedSize(mConfirmAck->sizeHint()); hlayout->addWidget(mConfirmAck); hlayout->addSpacing(2 * style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); hlayout->addStretch(); if (ShellProcess::authorised()) // don't display if shell commands not allowed (e.g. kiosk mode) { // Special actions button mSpecialActionsButton = new SpecialActionsButton(false, group); mSpecialActionsButton->setFixedSize(mSpecialActionsButton->sizeHint()); hlayout->addWidget(mSpecialActionsButton); } // Late display checkbox - default = allow late display hlayout = new QHBoxLayout(); hlayout->setMargin(0); hlayout->setSpacing(2 * style()->pixelMetric(QStyle::PM_DefaultLayoutSpacing)); groupLayout->addLayout(hlayout); mLateCancel = new LateCancelSelector(false, group); mLateCancel->setFixedSize(mLateCancel->sizeHint()); hlayout->addWidget(mLateCancel); hlayout->addStretch(); // Sub-repetition button mSubRepetition = new RepetitionButton(i18nc("@action:button", "Sub-Repetition"), false, group); mSubRepetition->setFixedSize(mSubRepetition->sizeHint()); mSubRepetition->set(Repetition(), true, 364*24*60); mSubRepetition->setWhatsThis(i18nc("@info:whatsthis", "Set up an additional alarm repetition")); hlayout->addWidget(mSubRepetition); // Set the values to their defaults setColours(Preferences::defaultFgColour(), Preferences::defaultBgColour()); mFontColourButton->setDefaultFont(); mFontColourButton->setBgColour(Preferences::defaultBgColour()); mFontColourButton->setFgColour(Preferences::defaultFgColour()); mLateCancel->setMinutes(Preferences::defaultLateCancel(), true, TimePeriod::Days); mConfirmAck->setChecked(Preferences::defaultConfirmAck()); mSoundPicker->set(Preferences::defaultSoundType(), Preferences::defaultSoundFile(), Preferences::defaultSoundVolume(), -1, 0, Preferences::defaultSoundRepeat()); if (mSpecialActionsButton) { KAEvent::ExtraActionOptions opts(0); if (Preferences::defaultExecPreActionOnDeferral()) opts |= KAEvent::ExecPreActOnDeferral; if (Preferences::defaultCancelOnPreActionError()) opts |= KAEvent::CancelOnPreActError; if (Preferences::defaultDontShowPreActionError()) opts |= KAEvent::DontShowPreActError; mSpecialActionsButton->setActions(Preferences::defaultPreAction(), Preferences::defaultPostAction(), opts); } mButtonBox = new QDialogButtonBox(this); mButtonBox->addButton(QDialogButtonBox::Ok); mButtonBox->addButton(QDialogButtonBox::Cancel); connect(mButtonBox, &QDialogButtonBox::accepted, this, &BirthdayDlg::slotOk); connect(mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); topLayout->addWidget(mButtonBox); KActionCollection* actions = new KActionCollection(this); KStandardAction::selectAll(mListView, SLOT(selectAll()), actions); KStandardAction::deselect(mListView, SLOT(clearSelection()), actions); actions->addAssociatedWidget(mListView); foreach (QAction* action, actions->actions()) action->setShortcutContext(Qt::WidgetWithChildrenShortcut); mButtonBox->button(QDialogButtonBox::Ok)->setEnabled(false); // only enable OK button when something is selected }
BirthdayDlg::BirthdayDlg(QWidget* parent) : KDialog(parent), mSpecialActionsButton(0) { setObjectName("BirthdayDlg"); // used by LikeBack setCaption(i18nc("@title:window", "Import Birthdays From KAddressBook")); setButtons(Ok | Cancel); setDefaultButton(Ok); connect(this, SIGNAL(okClicked()), SLOT(slotOk())); QWidget* topWidget = new QWidget(this); setMainWidget(topWidget); QVBoxLayout* topLayout = new QVBoxLayout(topWidget); topLayout->setMargin(0); topLayout->setSpacing(spacingHint()); // Prefix and suffix to the name in the alarm text // Get default prefix and suffix texts from config file KConfigGroup config(KGlobal::config(), "General"); mPrefixText = config.readEntry("BirthdayPrefix", i18nc("@info/plain", "Birthday: ")); mSuffixText = config.readEntry("BirthdaySuffix"); QGroupBox* textGroup = new QGroupBox(i18nc("@title:group", "Alarm Text"), topWidget); topLayout->addWidget(textGroup); QGridLayout* grid = new QGridLayout(textGroup); grid->setMargin(marginHint()); grid->setSpacing(spacingHint()); QLabel* label = new QLabel(i18nc("@label:textbox", "Prefix:"), textGroup); label->setFixedSize(label->sizeHint()); grid->addWidget(label, 0, 0); mPrefix = new BLineEdit(mPrefixText, textGroup); mPrefix->setMinimumSize(mPrefix->sizeHint()); label->setBuddy(mPrefix); connect(mPrefix, SIGNAL(focusLost()), SLOT(slotTextLostFocus())); mPrefix->setWhatsThis(i18nc("@info:whatsthis", "Enter text to appear before the person's name in the alarm message, " "including any necessary trailing spaces.")); grid->addWidget(mPrefix, 0, 1); label = new QLabel(i18nc("@label:textbox", "Suffix:"), textGroup); label->setFixedSize(label->sizeHint()); grid->addWidget(label, 1, 0); mSuffix = new BLineEdit(mSuffixText, textGroup); mSuffix->setMinimumSize(mSuffix->sizeHint()); label->setBuddy(mSuffix); connect(mSuffix, SIGNAL(focusLost()), SLOT(slotTextLostFocus())); mSuffix->setWhatsThis(i18nc("@info:whatsthis", "Enter text to appear after the person's name in the alarm message, " "including any necessary leading spaces.")); grid->addWidget(mSuffix, 1, 1); QGroupBox* group = new QGroupBox(i18nc("@title:group", "Select Birthdays"), topWidget); topLayout->addWidget(group); QVBoxLayout* layout = new QVBoxLayout(group); layout->setMargin(0); BirthdayModel* model = BirthdayModel::instance(this); connect(model, SIGNAL(addrBookError()), SLOT(addrBookError())); connect(model, SIGNAL(dataChanged(const QModelIndex&,const QModelIndex&)), SLOT(resizeViewColumns())); model->setPrefixSuffix(mPrefixText, mSuffixText); BirthdaySortModel* sortModel = new BirthdaySortModel(model, this); sortModel->setSortCaseSensitivity(Qt::CaseInsensitive); mListView = new QTreeView(group); mListView->setModel(sortModel); mListView->setRootIsDecorated(false); // don't show expander icons mListView->setSortingEnabled(true); mListView->sortByColumn(BirthdayModel::NameColumn); mListView->setAllColumnsShowFocus(true); mListView->setSelectionMode(QAbstractItemView::ExtendedSelection); mListView->setSelectionBehavior(QAbstractItemView::SelectRows); mListView->setTextElideMode(Qt::ElideRight); mListView->header()->setResizeMode(BirthdayModel::NameColumn, QHeaderView::Stretch); mListView->header()->setResizeMode(BirthdayModel::DateColumn, QHeaderView::ResizeToContents); connect(mListView->selectionModel(), SIGNAL(selectionChanged(const QItemSelection&,const QItemSelection&)), SLOT(slotSelectionChanged())); mListView->setWhatsThis(i18nc("@info:whatsthis", "<para>Select birthdays to set alarms for.<nl/>" "This list shows all birthdays in <application>KAddressBook</application> except those for which alarms already exist.</para>" "<para>You can select multiple birthdays at one time by dragging the mouse over the list, " "or by clicking the mouse while pressing Ctrl or Shift.</para>")); layout->addWidget(mListView); group = new QGroupBox(i18nc("@title:group", "Alarm Configuration"), topWidget); topLayout->addWidget(group); QVBoxLayout* groupLayout = new QVBoxLayout(group); groupLayout->setMargin(marginHint()); groupLayout->setSpacing(spacingHint()); // Sound checkbox and file selector QHBoxLayout* hlayout = new QHBoxLayout(); hlayout->setMargin(0); groupLayout->addLayout(hlayout); mSoundPicker = new SoundPicker(group); mSoundPicker->setFixedSize(mSoundPicker->sizeHint()); hlayout->addWidget(mSoundPicker); hlayout->addSpacing(2*spacingHint()); hlayout->addStretch(); // Font and colour choice button and sample text mFontColourButton = new FontColourButton(group); mFontColourButton->setMaximumHeight(mFontColourButton->sizeHint().height() * 3/2); hlayout->addWidget(mFontColourButton); connect(mFontColourButton, SIGNAL(selected(const QColor&, const QColor&)), SLOT(setColours(const QColor&, const QColor&))); // How much advance warning to give mReminder = new Reminder(i18nc("@info:whatsthis", "Check to display a reminder in advance of the birthday."), i18nc("@info:whatsthis", "Enter the number of days before each birthday to display a reminder. " "This is in addition to the alarm which is displayed on the birthday."), false, false, group); mReminder->setFixedSize(mReminder->sizeHint()); mReminder->setMaximum(0, 364); mReminder->setMinutes(0, true); groupLayout->addWidget(mReminder, 0, Qt::AlignLeft); // Acknowledgement confirmation required - default = no confirmation hlayout = new QHBoxLayout(); hlayout->setMargin(0); hlayout->setSpacing(2*spacingHint()); groupLayout->addLayout(hlayout); mConfirmAck = EditDisplayAlarmDlg::createConfirmAckCheckbox(group); mConfirmAck->setFixedSize(mConfirmAck->sizeHint()); hlayout->addWidget(mConfirmAck); hlayout->addSpacing(2*spacingHint()); hlayout->addStretch(); if (ShellProcess::authorised()) // don't display if shell commands not allowed (e.g. kiosk mode) { // Special actions button mSpecialActionsButton = new SpecialActionsButton(false, group); mSpecialActionsButton->setFixedSize(mSpecialActionsButton->sizeHint()); hlayout->addWidget(mSpecialActionsButton); } // Late display checkbox - default = allow late display hlayout = new QHBoxLayout(); hlayout->setMargin(0); hlayout->setSpacing(2*spacingHint()); groupLayout->addLayout(hlayout); mLateCancel = new LateCancelSelector(false, group); mLateCancel->setFixedSize(mLateCancel->sizeHint()); hlayout->addWidget(mLateCancel); hlayout->addStretch(); // Sub-repetition button mSubRepetition = new RepetitionButton(i18nc("@action:button", "Sub-Repetition"), false, group); mSubRepetition->setFixedSize(mSubRepetition->sizeHint()); mSubRepetition->set(Repetition(), true, 364*24*60); mSubRepetition->setWhatsThis(i18nc("@info:whatsthis", "Set up an additional alarm repetition")); hlayout->addWidget(mSubRepetition); // Set the values to their defaults setColours(Preferences::defaultFgColour(), Preferences::defaultBgColour()); mFontColourButton->setDefaultFont(); mFontColourButton->setBgColour(Preferences::defaultBgColour()); mFontColourButton->setFgColour(Preferences::defaultFgColour()); mLateCancel->setMinutes(Preferences::defaultLateCancel(), true, TimePeriod::Days); mConfirmAck->setChecked(Preferences::defaultConfirmAck()); mSoundPicker->set(Preferences::defaultSoundType(), Preferences::defaultSoundFile(), Preferences::defaultSoundVolume(), -1, 0, Preferences::defaultSoundRepeat()); if (mSpecialActionsButton) mSpecialActionsButton->setActions(Preferences::defaultPreAction(), Preferences::defaultPostAction(), Preferences::defaultCancelOnPreActionError()); KActionCollection* actions = new KActionCollection(this); KStandardAction::selectAll(mListView, SLOT(selectAll()), actions); KStandardAction::deselect(mListView, SLOT(clearSelection()), actions); actions->addAssociatedWidget(mListView); foreach (QAction* action, actions->actions()) action->setShortcutContext(Qt::WidgetWithChildrenShortcut); enableButtonOk(false); // only enable OK button when something is selected }