/** * \file kdemainwindow.cpp * KDE Kid3 main window. * * \b Project: Kid3 * \author Urs Fleisch * \date 9 Jan 2003 * * Copyright (C) 2003-2018 Urs Fleisch * * This file is part of Kid3. * * Kid3 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. * * Kid3 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, see . */ #include "kdemainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include #include "config.h" #include "kid3form.h" #include "filelist.h" #include "sectionactions.h" #include "kid3application.h" #include "kdeconfigdialog.h" #include "guiconfig.h" #include "tagconfig.h" #include "useractionsconfig.h" #include "serverimporter.h" #include "servertrackimporter.h" /** * Constructor. * * @param platformTools platform specific tools * @param app application context * @param parent parent widget */ KdeMainWindow::KdeMainWindow(IPlatformTools* platformTools, Kid3Application* app, QWidget* parent) : KXmlGuiWindow(parent), BaseMainWindow(this, platformTools, app), m_platformTools(platformTools), m_fileOpenRecent(nullptr), m_settingsShowStatusbar(nullptr), m_settingsAutoHideTags(nullptr), m_settingsShowHidePicture(nullptr) { init(); } /** Only defined for generation of translation files */ #define MAIN_TOOLBAR_FOR_PO QT_TRANSLATE_NOOP("@default", "Main Toolbar") /** * Init menu and toolbar actions. */ void KdeMainWindow::initActions() { KActionCollection* collection = actionCollection(); #if KCONFIGWIDGETS_VERSION >= 0x051700 QAction* action = KStandardAction::open( impl(), &BaseMainWindowImpl::slotFileOpen, collection); #else QAction* action = KStandardAction::open( impl(), SLOT(slotFileOpen()), collection); #endif action->setStatusTip(tr("Open files")); #if KCONFIGWIDGETS_VERSION >= 0x051700 m_fileOpenRecent = KStandardAction::openRecent( this, &KdeMainWindow::slotFileOpenRecentUrl, collection); #else m_fileOpenRecent = KStandardAction::openRecent( this, SLOT(slotFileOpenRecentUrl(QUrl)), collection); #endif m_fileOpenRecent->setStatusTip(tr("Opens a recently used folder")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::revert( app(), &Kid3Application::revertFileModifications, collection); #else action = KStandardAction::revert( app(), SLOT(revertFileModifications()), collection); #endif action->setStatusTip( tr("Reverts the changes of all or the selected files")); collection->setDefaultShortcuts(action, KStandardShortcut::shortcut(KStandardShortcut::Undo)); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::save( impl(), &BaseMainWindowImpl::slotFileSave, collection); #else action = KStandardAction::save( impl(), SLOT(slotFileSave()), collection); #endif action->setStatusTip(tr("Saves the changed files")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::quit( impl(), &BaseMainWindowImpl::slotFileQuit, collection); #else action = KStandardAction::quit( impl(), SLOT(slotFileQuit()), collection); #endif action->setStatusTip(tr("Quits the application")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::selectAll( form(), &Kid3Form::selectAllFiles, collection); #else action = KStandardAction::selectAll( form(), SLOT(selectAllFiles()), collection); #endif action->setStatusTip(tr("Select all files")); action->setShortcut(QKeySequence(QLatin1String("Alt+Shift+A"))); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::deselect( form(), &Kid3Form::deselectAllFiles, collection); #else action = KStandardAction::deselect( form(), SLOT(deselectAllFiles()), collection); #endif action->setStatusTip(tr("Deselect all files")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::find( impl(), &BaseMainWindowImpl::find, collection); #else action = KStandardAction::find( impl(), SLOT(find()), collection); #endif action->setStatusTip(tr("Find")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::replace( impl(), &BaseMainWindowImpl::findReplace, collection); #else action = KStandardAction::replace( impl(), SLOT(findReplace()), collection); #endif action->setStatusTip(tr("Find and replace")); setStandardToolBarMenuEnabled(true); createStandardStatusBarAction(); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::keyBindings( this, &KdeMainWindow::slotSettingsShortcuts, collection); #else action = KStandardAction::keyBindings( this, SLOT(slotSettingsShortcuts()), collection); #endif action->setStatusTip(tr("Configure Shortcuts")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::configureToolbars( this, &KdeMainWindow::slotSettingsToolbars, collection); #else action = KStandardAction::configureToolbars( this, SLOT(slotSettingsToolbars()), collection); #endif action->setStatusTip(tr("Configure Toolbars")); #if KCONFIGWIDGETS_VERSION >= 0x051700 m_settingsShowStatusbar = KStandardAction::showStatusbar( this, &KdeMainWindow::slotSettingsShowStatusbar, collection); #else m_settingsShowStatusbar = KStandardAction::showStatusbar( this, SLOT(slotSettingsShowStatusbar()), collection); #endif m_settingsShowStatusbar->setStatusTip(tr("Enables/disables the statusbar")); #if KCONFIGWIDGETS_VERSION >= 0x051700 action = KStandardAction::preferences( this, &KdeMainWindow::slotSettingsConfigure, collection); #else action = KStandardAction::preferences( this, SLOT(slotSettingsConfigure()), collection); #endif action->setStatusTip(tr("Preferences dialog")); action = new QAction(QIcon::fromTheme(QLatin1String("document-open")), tr("O&pen Folder..."), this); action->setStatusTip(tr("Opens a folder")); collection->setDefaultShortcut(action, QKeySequence(Qt::CTRL + Qt::Key_D)); collection->addAction(QLatin1String("open_directory"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotFileOpenDirectory); action = new QAction(QIcon::fromTheme(QLatin1String("view-refresh")), tr("Re&load"), this); action->setStatusTip(tr("Reload folder")); // When using the KDE version on GNOME, a dialog appears "There are two // actions (Replace..., Reload) that want to use the same shortcut (Ctrl+R)". // Avoid this by assigning Qt::Key_F5 instead of QKeySequence::Refresh. // The section "Standard Shortcuts" in the QKeySequence documentation lists // F5 as a key for "Refresh" on all platforms. collection->setDefaultShortcut(action, QKeySequence(Qt::Key_F5)); collection->addAction(QLatin1String("reload"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotFileReload); action = new QAction(tr("Unload"), this); collection->addAction(QLatin1String("unload"), action); connect(action, &QAction::triggered, app(), &Kid3Application::unloadAllTags); action = new QAction(QIcon::fromTheme(QLatin1String("document-import")), tr("&Import..."), this); action->setStatusTip(tr("Import from file or clipboard")); action->setData(-1); collection->addAction(QLatin1String("import"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotImport); int importerIdx = 0; const auto sis = app()->getServerImporters(); for (const ServerImporter* si : sis) { QString serverName(QCoreApplication::translate("@default", si->name())); QString actionName = QString::fromLatin1(si->name()).toLower() .remove(QLatin1Char(' ')); int dotPos = actionName.indexOf(QLatin1Char('.')); if (dotPos != -1) actionName.truncate(dotPos); actionName = QLatin1String("import_") + actionName; action = new QAction(tr("Import from %1...").arg(serverName), this); action->setData(importerIdx); action->setStatusTip(tr("Import from %1").arg(serverName)); collection->addAction(actionName, action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotImport); ++importerIdx; } const auto stis = app()->getServerTrackImporters(); for (const ServerTrackImporter* si : stis) { QString serverName(QCoreApplication::translate("@default", si->name())); QString actionName = QString::fromLatin1(si->name()).toLower() .remove(QLatin1Char(' ')); int dotPos = actionName.indexOf(QLatin1Char('.')); if (dotPos != -1) actionName.truncate(dotPos); actionName = QLatin1String("import_") + actionName; action = new QAction(tr("Import from %1...").arg(serverName), this); action->setStatusTip(tr("Import from %1").arg(serverName)); action->setData(importerIdx); collection->addAction(actionName, action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotImport); ++importerIdx; } action = new QAction(tr("Import from Tags..."), this); action->setStatusTip(tr("Import from Tags")); collection->addAction(QLatin1String("import_tags"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotTagImport); action = new QAction(tr("Automatic I&mport..."), this); action->setStatusTip(tr("Automatic import")); collection->addAction(QLatin1String("batch_import"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotBatchImport); action = new QAction(tr("&Browse Cover Art..."), this); action->setStatusTip(tr("Browse album cover artwork")); collection->addAction(QLatin1String("browse_cover_art"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotBrowseCoverArt); action = new QAction(QIcon::fromTheme(QLatin1String("document-export")), tr("&Export..."), this); action->setStatusTip(tr("Export to file or clipboard")); collection->addAction(QLatin1String("export"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotExport); action = new QAction(QIcon::fromTheme(QLatin1String("view-media-playlist")), tr("&Create Playlist..."), this); action->setStatusTip(tr("Create M3U Playlist")); collection->addAction(QLatin1String("create_playlist"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotPlaylistDialog); action = new QAction(tr("Apply &Filename Format"), this); action->setStatusTip(tr("Apply Filename Format")); collection->addAction(QLatin1String("apply_filename_format"), action); connect(action, &QAction::triggered, app(), &Kid3Application::applyFilenameFormat); action = new QAction(tr("Apply &Tag Format"), this); action->setStatusTip(tr("Apply Tag Format")); collection->addAction(QLatin1String("apply_id3_format"), action); connect(action, &QAction::triggered, app(), &Kid3Application::applyTagFormat); action = new QAction(tr("Apply Text &Encoding"), this); action->setStatusTip(tr("Apply Text Encoding")); collection->addAction(QLatin1String("apply_text_encoding"), action); connect(action, &QAction::triggered, app(), &Kid3Application::applyTextEncoding); action = new QAction(tr("&Rename Folder..."), this); action->setStatusTip(tr("Rename Folder")); collection->addAction(QLatin1String("rename_directory"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotRenameDirectory); action = new QAction(tr("&Number Tracks..."), this); action->setStatusTip(tr("Number Tracks")); collection->addAction(QLatin1String("number_tracks"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotNumberTracks); action = new QAction(tr("F&ilter..."), this); action->setStatusTip(tr("Filter")); collection->addAction(QLatin1String("filter"), action); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::slotFilter); const TagConfig& tagCfg = TagConfig::instance(); if (tagCfg.taggedFileFeatures() & TaggedFile::TF_ID3v24) { action = new QAction(tr("Convert ID3v2.3 to ID3v2.&4"), this); action->setStatusTip(tr("Convert ID3v2.3 to ID3v2.4")); collection->addAction(QLatin1String("convert_to_id3v24"), action); connect(action, &QAction::triggered, app(), &Kid3Application::convertToId3v24); if (tagCfg.taggedFileFeatures() & TaggedFile::TF_ID3v23) { action = new QAction(tr("Convert ID3v2.4 to ID3v2.&3"), this); action->setStatusTip(tr("Convert ID3v2.4 to ID3v2.3")); collection->addAction(QLatin1String("convert_to_id3v23"), action); connect(action, &QAction::triggered, app(), &Kid3Application::convertToId3v23); } } #ifdef HAVE_QTMULTIMEDIA action = new QAction(QIcon::fromTheme(QLatin1String("media-playback-start")), tr("&Play"), this); action->setStatusTip(tr("Play")); collection->addAction(QLatin1String("play"), action); connect(action, &QAction::triggered, app(), &Kid3Application::playAudio); #endif m_settingsShowHidePicture = new KToggleAction(tr("Show &Picture"), this); m_settingsShowHidePicture->setStatusTip(tr("Show Picture")); m_settingsShowHidePicture->setCheckable(true); collection->addAction(QLatin1String("hide_picture"), m_settingsShowHidePicture); connect(m_settingsShowHidePicture, &QAction::triggered, impl(), &BaseMainWindowImpl::slotSettingsShowHidePicture); m_settingsAutoHideTags = new KToggleAction(tr("Auto &Hide Tags"), this); m_settingsAutoHideTags->setStatusTip(tr("Auto Hide Tags")); m_settingsAutoHideTags->setCheckable(true); collection->addAction(QLatin1String("auto_hide_tags"), m_settingsAutoHideTags); connect(m_settingsAutoHideTags, &QAction::triggered, impl(), &BaseMainWindowImpl::slotSettingsAutoHideTags); action = new QAction(tr("Select All in &Folder"), this); action->setStatusTip(tr("Select all files in the current folder")); collection->addAction(QLatin1String("select_all_in_directory"), action); connect(action, &QAction::triggered, app(), &Kid3Application::selectAllInDirectory); action = new QAction(tr("&Invert Selection"), this); collection->addAction(QLatin1String("invert_selection"), action); connect(action, &QAction::triggered, app(), &Kid3Application::invertSelection); action = new QAction(QIcon::fromTheme(QLatin1String("go-previous")), tr("&Previous File"), this); action->setStatusTip(tr("Select previous file")); collection->setDefaultShortcuts(action, KStandardShortcut::shortcut(KStandardShortcut::Prior)); collection->addAction(QLatin1String("previous_file"), action); connect(action, &QAction::triggered, form(), &Kid3Form::selectPreviousTaggedFile); action = new QAction(QIcon::fromTheme(QLatin1String("go-next")), tr("&Next File"), this); action->setStatusTip(tr("Select next file")); collection->setDefaultShortcuts(action, KStandardShortcut::shortcut(KStandardShortcut::Next)); collection->addAction(QLatin1String("next_file"), action); connect(action, &QAction::triggered, form(), &Kid3Form::selectNextTaggedFile); FOR_ALL_TAGS(tagNr) { Frame::TagNumber otherTagNr = tagNr == Frame::Tag_1 ? Frame::Tag_2 : tagNr == Frame::Tag_2 ? Frame::Tag_1 : Frame::Tag_NumValues; QString tagStr = Frame::tagNumberToString(tagNr); Kid3ApplicationTagContext* appTag = app()->tag(tagNr); Kid3FormTagContext* formTag = form()->tag(tagNr); QString actionPrefix = tr("Tag %1").arg(tagStr) + QLatin1String(": "); action = new QAction(tr("Filename") + QLatin1String(": ") + tr("From Tag %1").arg(tagStr), this); collection->addAction(QLatin1String("filename_from_v") + tagStr, action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::getFilenameFromTags); tagStr = QLatin1Char('v') + tagStr + QLatin1Char('_'); action = new QAction(actionPrefix + tr("From Filename"), this); collection->addAction(tagStr + QLatin1String("from_filename"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::getTagsFromFilename); if (otherTagNr < Frame::Tag_NumValues) { QString otherTagStr = Frame::tagNumberToString(otherTagNr); action = new QAction(actionPrefix + tr("From Tag %1").arg(otherTagStr), this); collection->addAction(tagStr + QLatin1String("from_v") + otherTagStr, action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::copyToOtherTag); } action = new QAction(actionPrefix + tr("Copy"), this); collection->addAction(tagStr + QLatin1String("copy"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::copyTags); action = new QAction(actionPrefix + tr("Paste"), this); collection->addAction(tagStr + QLatin1String("paste"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::pasteTags); action = new QAction(actionPrefix + tr("Remove"), this); collection->addAction(tagStr + QLatin1String("remove"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::removeTags); action = new QAction(actionPrefix + tr("Focus"), this); collection->addAction(tagStr + QLatin1String("focus"), action); connect(action, &QAction::triggered, formTag, &Kid3FormTagContext::setFocusTag); if (tagNr != Frame::Tag_Id3v1) { actionPrefix += tr("Frames:") + QLatin1Char(' '); action = new QAction(actionPrefix + tr("Edit"), this); collection->addAction(tagStr + QLatin1String("frames_edit"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::editFrame); action = new QAction(actionPrefix + tr("Add"), this); collection->addAction(tagStr + QLatin1String("frames_add"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::addFrame); action = new QAction(actionPrefix + tr("Delete"), this); collection->addAction(tagStr + QLatin1String("frames_delete"), action); connect(action, &QAction::triggered, appTag, &Kid3ApplicationTagContext::deleteFrame); } } action = new QAction(tr("Filename") + QLatin1String(": ") + tr("Focus"), this); collection->addAction(QLatin1String("filename_focus"), action); connect(action, &QAction::triggered, form(), &Kid3Form::setFocusFilename); action = new QAction(tr("File List") + QLatin1String(": ") + tr("Focus"), this); collection->addAction(QLatin1String("filelist_focus"), action); connect(action, &QAction::triggered, form(), &Kid3Form::setFocusFileList); action = new QAction(tr("&Rename"), this); collection->setDefaultShortcut(action, QKeySequence(Qt::Key_F2)); action->setShortcutContext(Qt::WidgetShortcut); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::renameFile); // This action is not made configurable because its shortcut F2 conflicts // with a section shortcut and there seems to be no way to avoid it with // KShortcutsDialog. The same applies to the shortcut with the Delete key. // collection->addAction(QLatin1String("filelist_rename"), action); form()->getFileList()->setRenameAction(action); action = new QAction(tr("&Move to Trash"), this); collection->setDefaultShortcut(action, QKeySequence::Delete); action->setShortcutContext(Qt::WidgetShortcut); connect(action, &QAction::triggered, impl(), &BaseMainWindowImpl::deleteFile); // collection->addAction(QLatin1String("filelist_delete"), action); form()->getFileList()->setDeleteAction(action); action = new QAction(tr("Folder List") + QLatin1String(": ") + tr("Focus"), this); collection->addAction(QLatin1String("dirlist_focus"), action); connect(action, &QAction::triggered, form(), &Kid3Form::setFocusDirList); FileList* fileList = form()->getFileList(); // Do not support user action keyboard shortcuts with KDE 4, it would only // print "Attempt to use QAction (..) with KXMLGUIFactory!" warnings. connect(fileList, &FileList::userActionAdded, this, &KdeMainWindow::onUserActionAdded); connect(fileList, &FileList::userActionRemoved, this, &KdeMainWindow::onUserActionRemoved); fileList->initUserActions(); const UserActionsConfig& userActionsCfg = UserActionsConfig::instance(); connect(&userActionsCfg, &UserActionsConfig::contextMenuCommandsChanged, fileList, &FileList::initUserActions); const auto sectionShortcuts = SectionActions::defaultShortcuts(); QString actionPrefix = tr("Section") + QLatin1String(": "); for (auto it = sectionShortcuts.constBegin(); it != sectionShortcuts.constEnd(); ++it) { const auto& tpl = *it; action = new QAction(actionPrefix + std::get<1>(tpl), this); action->setShortcutContext(Qt::WidgetShortcut); // The action is only used to configure the shortcuts. Disabling it will // also avoid "that want to use the same shortcut" error dialogs. action->setEnabled(false); collection->setDefaultShortcut(action, std::get<2>(tpl)); collection->addAction(std::get<0>(tpl), action); } createGUI(); } /** * Get keyboard shortcuts. * @return mapping of action names to key sequences. */ QMap KdeMainWindow::shortcutsMap() const { QMap map; if (KActionCollection* collection = actionCollection()) { const auto actions = collection->actions(); for (QAction* action : actions) { if (action) { QString name = action->objectName(); if (!name.isEmpty()) { map.insert(name, action->shortcut()); } } } } return map; } /** * Add directory to recent files list. * * @param dirName path to directory */ void KdeMainWindow::addDirectoryToRecentFiles(const QString& dirName) { QUrl url; url.setPath(dirName); m_fileOpenRecent->addUrl(url); } /** * Read settings from the configuration. */ void KdeMainWindow::readConfig() { setAutoSaveSettings(); m_settingsShowHidePicture->setChecked(!GuiConfig::instance().hidePicture()); m_settingsAutoHideTags->setChecked(GuiConfig::instance().autoHideTags()); auto cfg = KSharedConfig::openConfig(); m_fileOpenRecent->loadEntries(cfg->group("Recent Files")); QString entry = cfg->group("MainWindow").readEntry("StatusBar", "Enabled"); bool statusBarVisible = entry != QLatin1String("Disabled"); if (m_settingsShowStatusbar) { m_settingsShowStatusbar->setChecked(statusBarVisible); } setStatusBarVisible(statusBarVisible); } /** * Store geometry and recent files in settings. */ void KdeMainWindow::saveConfig() { m_fileOpenRecent->saveEntries(KSharedConfig::openConfig()->group("Recent Files")); } /** * Set main window caption. * * @param caption caption without application name * @param modified true if any file is modified */ void KdeMainWindow::setWindowCaption(const QString& caption, bool modified) { setCaption(caption, modified); } /** * Get action for Settings/Auto Hide Tags. * @return action. */ QAction* KdeMainWindow::autoHideTagsAction() { return m_settingsAutoHideTags; } /** * Get action for Settings/Hide Picture. * @return action. */ QAction* KdeMainWindow::showHidePictureAction() { return m_settingsShowHidePicture; } /** * Update modification state before closing. * Called on closeEvent() of window. * If anything was modified, save after asking user. * Save options before closing. * This method is called by closeEvent(), which occurs when the * window is closed or slotFileQuit() (Quit menu) is selected. * * @return false if user canceled, * true will quit the application. */ bool KdeMainWindow::queryClose() { return queryBeforeClosing(); } /** * Saves the window properties to the session config file. * * @param cfg application configuration */ void KdeMainWindow::saveProperties(KConfigGroup& cfg) { cfg.writeEntry("dirname", app()->getDirName()); } /** * Reads the session config file and restores the application's state. * * @param cfg application configuration */ void KdeMainWindow::readProperties(const KConfigGroup& cfg) { app()->openDirectory({cfg.readEntry("dirname", "")}); } /** * Open recent directory. * * @param dir directory to open */ void KdeMainWindow::slotFileOpenRecentUrl(const QUrl& url) { openRecentDirectory(url.path()); } /** * Shortcuts configuration. */ void KdeMainWindow::slotSettingsShortcuts() { if (KShortcutsDialog::configure( actionCollection(), KShortcutsEditor::LetterShortcutsAllowed, this) == QDialog::Accepted) { impl()->applyChangedShortcuts(); } } /** * Toolbars configuration. */ void KdeMainWindow::slotSettingsToolbars() { KEditToolBar dlg(actionCollection()); if (dlg.exec()) { createGUI(); } } /** * Statusbar configuration. */ void KdeMainWindow::slotSettingsShowStatusbar() { setStatusBarVisible(m_settingsShowStatusbar->isChecked()); setSettingsDirty(); } /** * Preferences. */ void KdeMainWindow::slotSettingsConfigure() { QString caption(tr("Configure - Kid3")); KConfigSkeleton* configSkeleton = new KConfigSkeleton; auto dialog = new KdeConfigDialog(m_platformTools, this, caption, configSkeleton); dialog->setConfig(); if (dialog->exec() == QDialog::Accepted) { dialog->getConfig(); impl()->applyChangedConfiguration(); } delete configSkeleton; } /** * Add user action to collection. * @param name name of action * @param action action to add */ void KdeMainWindow::onUserActionAdded(const QString& name, QAction* action) { KActionCollection* collection = actionCollection(); collection->addAction(name, action); } /** * Remove user action from collection. * @param name name of action * @param action action to remove */ void KdeMainWindow::onUserActionRemoved(const QString& name, QAction* action) { Q_UNUSED(name) KActionCollection* collection = actionCollection(); collection->takeAction(action); }