File indexing completed on 2025-02-02 04:56:52

0001 /***************************************************************************
0002  * SPDX-FileCopyrightText: 2022 S. MANKOWSKI stephane@mankowski.fr
0003  * SPDX-FileCopyrightText: 2022 G. DE BURE support@mankowski.fr
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  ***************************************************************************/
0006 /** @file
0007  * This file is a plugin for bookmarks management.
0008  *
0009  * @author Stephane MANKOWSKI / Guillaume DE BURE
0010  */
0011 #include "skgbookmarkplugindockwidget.h"
0012 
0013 #include <kicondialog.h>
0014 
0015 #include <qevent.h>
0016 #include <qheaderview.h>
0017 #include <qmenu.h>
0018 
0019 #include "skgbookmark_settings.h"
0020 #include "skgdocument.h"
0021 #include "skginterfaceplugin.h"
0022 #include "skgmainpanel.h"
0023 #include "skgnodeobject.h"
0024 #include "skgobjectmodelbase.h"
0025 #include "skgsortfilterproxymodel.h"
0026 #include "skgtraces.h"
0027 #include "skgtransactionmng.h"
0028 
0029 bool SKGBookmarkPluginDockWidget::m_middleClick = false;
0030 
0031 SKGBookmarkPluginDockWidget::SKGBookmarkPluginDockWidget(QWidget* iParent, SKGDocument* iDocument)
0032     : SKGWidget(iParent, iDocument), m_mainMenu(nullptr), m_actDelete(nullptr), m_actRename(nullptr), m_actChangeIcon(nullptr), m_actAddBookmark(nullptr), m_actAddBookmarks(nullptr),
0033       m_actAddBookmarkGroup(nullptr), m_actSetAutostart(nullptr), m_actUnsetAutostart(nullptr), m_modelview(nullptr)
0034 {
0035     SKGTRACEINFUNC(1)
0036     if (iDocument == nullptr) {
0037         return;
0038     }
0039 
0040     ui.setupUi(this);
0041 
0042     QPalette newPalette = QApplication::palette();
0043     newPalette.setColor(QPalette::Base, Qt::transparent);
0044     ui.kBookmarksList->setPalette(newPalette);
0045     ui.kBookmarksList->setRootIsDecorated(false);
0046     ui.kBookmarksList->setAnimated(false);  // Not compatible with double click
0047     ui.kBookmarksList->setEditTriggers(QAbstractItemView::NoEditTriggers);
0048 
0049     ui.kTools->setIcon(SKGServices::fromTheme(QStringLiteral("configure")));
0050 
0051     ui.kBookmarksList->setContextMenuPolicy(Qt::CustomContextMenu);
0052     connect(ui.kBookmarksList, &SKGTreeView::customContextMenuRequested, this, &SKGBookmarkPluginDockWidget::showMenu);
0053 
0054     // Add model
0055     m_modelview = new SKGObjectModelBase(getDocument(), QStringLiteral("v_node"), QStringLiteral("1=1 ORDER BY f_sortorder, t_name"), this, QStringLiteral("rd_node_id"));
0056     auto modelproxy = new SKGSortFilterProxyModel(this);
0057     modelproxy->setSourceModel(m_modelview);
0058     ui.kBookmarksList->setModel(modelproxy);
0059 
0060     connect(ui.kFilterEdit, &QLineEdit::textChanged, this, [ = ](const QString & itext) {
0061         modelproxy->setFilterKeyColumn(-1);
0062         modelproxy->setFilterCaseSensitivity(Qt::CaseInsensitive);
0063         modelproxy->setFilterFixedString(itext);
0064     });
0065 
0066     connect(ui.kBookmarksList, &SKGTreeView::selectionChangedDelayed, this, &SKGBookmarkPluginDockWidget::refresh);
0067     connect(ui.kBookmarksList, &SKGTreeView::pressed, this, &SKGBookmarkPluginDockWidget::onBeforeOpenBookmark);
0068     connect(ui.kBookmarksList, &SKGTreeView::pressed, this, &SKGBookmarkPluginDockWidget::onOpenBookmark);
0069     connect(ui.kBookmarksList, &SKGTreeView::doubleClicked, this, &SKGBookmarkPluginDockWidget::onOpenBookmarkFolder);
0070     connect(SKGMainPanel::getMainPanel(), &SKGMainPanel::currentPageChanged, this, &SKGBookmarkPluginDockWidget::onPageChanged);
0071 
0072     connect(m_modelview, &SKGObjectModelBase::beforeReset, ui.kBookmarksList, &SKGTreeView::saveSelection);
0073     connect(m_modelview, &SKGObjectModelBase::afterReset, ui.kBookmarksList, &SKGTreeView::resetSelection);
0074 
0075     ui.kBookmarksList->setTextResizable(false);
0076 
0077     // Refresh action states
0078     refresh();
0079 }
0080 
0081 SKGBookmarkPluginDockWidget::~SKGBookmarkPluginDockWidget()
0082 {
0083     SKGTRACEINFUNC(1)
0084     m_mainMenu = nullptr;
0085     m_actDelete = nullptr;
0086     m_actRename = nullptr;
0087     m_actChangeIcon = nullptr;
0088     m_actAddBookmark = nullptr;
0089     m_actAddBookmarks = nullptr;
0090     m_actAddBookmarkGroup = nullptr;
0091     m_actSetAutostart = nullptr;
0092     m_actUnsetAutostart = nullptr;
0093     m_modelview = nullptr;
0094 }
0095 
0096 QWidget* SKGBookmarkPluginDockWidget::mainWidget()
0097 {
0098     return ui.kBookmarksList;
0099 }
0100 
0101 void SKGBookmarkPluginDockWidget::initMenu()
0102 {
0103     if (m_mainMenu == nullptr) {
0104         // Build contextual menu
0105         m_mainMenu = new QMenu(ui.kBookmarksList);
0106         QAction* actExpandAll = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("format-indent-more")), i18nc("Noun, user action", "Expand all"));
0107         connect(actExpandAll, &QAction::triggered, ui.kBookmarksList, &SKGTreeView::expandAll);
0108 
0109         QAction* actCollapseAll = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("format-indent-less")), i18nc("Noun, user action", "Collapse all"));
0110         connect(actCollapseAll, &QAction::triggered, ui.kBookmarksList, &SKGTreeView::collapseAll);
0111         ui.kBookmarksList->insertAction(nullptr, actCollapseAll);
0112 
0113         m_mainMenu->addSeparator();
0114 
0115         m_actAddBookmark = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("list-add")), i18nc("Verb", "Bookmark current page"));
0116         connect(m_actAddBookmark, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onAddBookmark);
0117 
0118         m_actAddBookmarks = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("list-add")), i18nc("Verb", "Bookmark all pages"));
0119         connect(m_actAddBookmarks, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onAddBookmarks);
0120 
0121         m_actAddBookmarkGroup = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("folder-new")), i18nc("Verb", "Add bookmark group"));
0122         connect(m_actAddBookmarkGroup, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onAddBookmarkGroup);
0123 
0124         m_mainMenu->addSeparator();
0125 
0126         m_actDelete = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("edit-delete")), i18nc("Verb, delete an item", "Delete"));
0127         connect(m_actDelete, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onRemoveBookmark);
0128 
0129         m_mainMenu->addSeparator();
0130 
0131         m_actSetAutostart = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("media-playback-start")), i18nc("Verb, automatically load when the application is started", "Autostart"));
0132         connect(m_actSetAutostart, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onSetAutostart);
0133 
0134         m_actUnsetAutostart = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("media-playback-stop")), i18nc("Verb", "Remove Autostart"));
0135         connect(m_actUnsetAutostart, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onUnsetAutostart);
0136 
0137         m_actRename = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("edit-rename")), i18nc("Verb, change the name of an item", "Rename"));
0138         m_actRename->setShortcut(Qt::Key_F2);
0139         connect(m_actRename, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onRenameBookmark);
0140 
0141         m_actChangeIcon = m_mainMenu->addAction(SKGServices::fromTheme(QStringLiteral("edit-image-face-add")), i18nc("Verb, change the icon of an item", "Change icon…"));
0142         connect(m_actChangeIcon, &QAction::triggered, this, &SKGBookmarkPluginDockWidget::onChangeIconBookmark);
0143 
0144         m_mainMenu->addSeparator();
0145         m_mainMenu->addAction(SKGMainPanel::getMainPanel()->getGlobalAction(QStringLiteral("tab_overwritebookmark")));
0146 
0147         ui.kTools->setMenu(m_mainMenu);
0148     }
0149 }
0150 
0151 void SKGBookmarkPluginDockWidget::showMenu(const QPoint iPos)
0152 {
0153     initMenu();
0154     m_mainMenu->popup(ui.kBookmarksList->mapToGlobal(iPos));
0155 }
0156 
0157 void SKGBookmarkPluginDockWidget::onSetAutostart()
0158 {
0159     SKGTRACEINFUNC(10)
0160     setAutostart(QStringLiteral("Y"));
0161 }
0162 
0163 void SKGBookmarkPluginDockWidget::onUnsetAutostart()
0164 {
0165     SKGTRACEINFUNC(10)
0166     setAutostart(QStringLiteral("N"));
0167 }
0168 
0169 void SKGBookmarkPluginDockWidget::setAutostart(const QString& value)
0170 {
0171     SKGTRACEINFUNC(10)
0172     SKGObjectBase::SKGListSKGObjectBase selectedBookmarks = getSelectedObjects();
0173 
0174     SKGError err;
0175 
0176     // foreach selected bookmark, set the t_autostart attribute to 'y' or 'n'
0177     {
0178         int nb = selectedBookmarks.count();
0179         SKGBEGINPROGRESSTRANSACTION(*getDocument(), value == QStringLiteral("Y") ? i18nc("Noun, name of the user action", "Autostart bookmarks") : i18nc("Noun, name of the user action", "Do not Autostart bookmarks"), err, nb)
0180         for (int i = 0 ; !err && i < nb  ; ++i) {
0181             SKGNodeObject bookmark(selectedBookmarks.at(i));
0182             err = bookmark.setAttribute(QStringLiteral("t_autostart"), value);
0183             IFOKDO(err, bookmark.save())
0184 
0185             // Send message
0186             IFOKDO(err, bookmark.getDocument()->sendMessage(i18nc("An information message", "The Autostart status of bookmark '%1' has been changed", bookmark.getDisplayName()), SKGDocument::Hidden))
0187 
0188             IFOKDO(err, getDocument()->stepForward(i + 1))
0189         }
0190     }
0191 
0192     // status bar
0193     IFOKDO(err, SKGError(0, value == QStringLiteral("Y") ? i18nc("Successful message after an user action", "Autostart bookmarks") : i18nc("Successful message after an user action", "Do not Autostart bookmarks")))
0194     SKGMainPanel::displayErrorMessage(err);
0195 }
0196 
0197 
0198 void SKGBookmarkPluginDockWidget::openBookmark(const SKGNodeObject& iNode, bool iFirstInNewPage, bool iPin)
0199 {
0200     SKGTRACEINFUNC(1)
0201     QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
0202 
0203     QVector<SKGNodeObject> nodes;
0204     nodes.reserve(20);
0205     nodes.push_back(iNode);
0206 
0207     int setForcusOn = 0;
0208     int nbTab = SKGMainPanel::getMainPanel()->countPages();
0209     if (nbTab != 0) {
0210         setForcusOn = nbTab - 1;
0211 
0212         SKGTabPage* cPage = SKGMainPanel::getMainPanel()->currentPage();
0213         if (m_middleClick || ((cPage != nullptr) && cPage->isPin())) {
0214             setForcusOn = nbTab;
0215         } else {
0216             setForcusOn = SKGMainPanel::getMainPanel()->currentPageIndex();
0217         }
0218     }
0219 
0220     int tabNumberForNextOpen = (m_middleClick || iFirstInNewPage ? -1 : SKGMainPanel::getMainPanel()->currentPageIndex());
0221     for (int i = 0; i < nodes.count(); ++i) {  // WARNING: This list is modified dynamically
0222         SKGNodeObject selectedNode = nodes.at(i);
0223         QStringList data = SKGServices::splitCSVLine(selectedNode.getData());
0224         if (data.count() > 2) {
0225             // This bookmark has information ==> we open it
0226             SKGTabPage* page = SKGMainPanel::getMainPanel()->openPage(SKGMainPanel::getMainPanel()->getPluginByName(data[0]), tabNumberForNextOpen, data[2], selectedNode.getName(), SKGServices::intToString(selectedNode.getID()), i == nodes.count() - 1);
0227             if (page != nullptr) {
0228                 if (skgbookmark_settings::pinhomebookmarks()) {
0229                     page->setPin(iPin);
0230                 }
0231                 SKGTabWidget* tab = SKGMainPanel::getMainPanel()->getTabWidget();
0232                 if (tab != nullptr) {
0233                     tab->setTabIcon(tab->indexOf(page), selectedNode.getIcon());
0234                 }
0235                 selectedNode.opened = true;
0236                 tabNumberForNextOpen = -1;
0237             }
0238         } else {
0239             // This bookmark is a folder ==> we open children by recursion
0240             SKGObjectBase::SKGListSKGObjectBase children;
0241             selectedNode.getNodes(children);
0242             for (const auto& item : qAsConst(children)) {
0243                 nodes.push_back(SKGNodeObject(item));
0244             }
0245         }
0246     }
0247     QApplication::restoreOverrideCursor();
0248 
0249     // Set focus on first page
0250     SKGMainPanel::getMainPanel()->setCurrentPage(setForcusOn);
0251 }
0252 
0253 void SKGBookmarkPluginDockWidget::onBeforeOpenBookmark()
0254 {
0255     m_middleClick = (QApplication::keyboardModifiers() & Qt::ControlModifier) != 0u || (QApplication::mouseButtons() & Qt::MidButton) != 0u;
0256 }
0257 
0258 void SKGBookmarkPluginDockWidget::onOpenBookmark(const QModelIndex& index)
0259 {
0260     SKGTRACEINFUNC(1)
0261     if (!(QApplication::mouseButtons() & Qt::RightButton)) {
0262         auto* proxyModel = qobject_cast<QSortFilterProxyModel*>(ui.kBookmarksList->model());
0263         auto* model = qobject_cast<SKGObjectModelBase*>(proxyModel->sourceModel());
0264         if (model != nullptr) {
0265             SKGNodeObject node(model->getObject(proxyModel->mapToSource(index)));
0266             if (!node.isFolder()) {
0267                 openBookmark(node);
0268             }
0269         }
0270     }
0271 }
0272 
0273 void SKGBookmarkPluginDockWidget::onOpenBookmarkFolder(const QModelIndex& index)
0274 {
0275     SKGTRACEINFUNC(1)
0276     if (!(QApplication::mouseButtons() & Qt::RightButton)) {
0277         auto* proxyModel = qobject_cast<QSortFilterProxyModel*>(ui.kBookmarksList->model());
0278         auto* model = qobject_cast<SKGObjectModelBase*>(proxyModel->sourceModel());
0279         if (model != nullptr) {
0280             SKGNodeObject node(model->getObject(proxyModel->mapToSource(index)));
0281             if (node.isFolder()) {
0282                 openBookmark(node);
0283             }
0284         }
0285     }
0286 }
0287 
0288 void SKGBookmarkPluginDockWidget::onAddBookmarkGroup()
0289 {
0290     SKGTRACEINFUNC(1)
0291     SKGError err;
0292     SKGNodeObject node;
0293     {
0294         // Get current selection name
0295         QString name;
0296         SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0297         if (!bookmarks.isEmpty()) {
0298             SKGNodeObject parentNode(bookmarks.at(0));
0299             if (!parentNode.isFolder()) {
0300                 // This is not a folder, we have to take the parent
0301                 SKGNodeObject parentNodeTmp;
0302                 parentNode.getParentNode(parentNodeTmp);
0303                 parentNode = parentNodeTmp;
0304             }
0305             name = parentNode.getFullName();
0306         }
0307 
0308         // Add current name
0309         if (!name.isEmpty()) {
0310             name += OBJECTSEPARATOR;
0311         }
0312         name += i18nc("Default name for bookmark", "New bookmark");
0313 
0314         // Create bookmark folder
0315         SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Bookmark folder creation '%1'", name), err)
0316         IFOKDO(err, SKGNodeObject::createPathNode(getDocument(), name, node, true))
0317 
0318         // Send message
0319         IFOKDO(err, node.getDocument()->sendMessage(i18nc("An information message", "The bookmark folder '%1' has been added", node.getDisplayName()), SKGDocument::Hidden))
0320     }
0321 
0322     // status bar
0323     IFOK(err) {
0324         ui.kBookmarksList->selectObject(node.getUniqueID());
0325         err = SKGError(0, i18nc("Successful message after an user action", "Bookmark group created"));
0326     }
0327     SKGMainPanel::displayErrorMessage(err);
0328 }
0329 
0330 void SKGBookmarkPluginDockWidget::onAddBookmarks()
0331 {
0332     SKGTRACEINFUNC(1)
0333     SKGError err;
0334     SKGNodeObject rootNode;
0335     {
0336         // Get current selection name
0337         QString name;
0338         SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0339         if (!bookmarks.isEmpty()) {
0340             SKGNodeObject parentNode(bookmarks.at(0));
0341             if (!parentNode.isFolder()) {
0342                 // This is not a folder, we have to take the parent
0343                 SKGNodeObject parentNodeTmp;
0344                 parentNode.getParentNode(parentNodeTmp);
0345                 parentNode = parentNodeTmp;
0346             }
0347             name = parentNode.getFullName();
0348         }
0349 
0350         // Add current name
0351         if (!name.isEmpty()) {
0352             name += OBJECTSEPARATOR;
0353         }
0354         name += i18nc("Default name for bookmark", "New bookmark");
0355 
0356         // Create bookmark folder
0357         SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Bookmarks creation"), err)
0358         err = SKGNodeObject::createPathNode(getDocument(), name, rootNode, true);
0359         int nb = SKGMainPanel::getMainPanel()->countPages();
0360         for (int i = 0; !err && i < nb; ++i) {
0361             SKGNodeObject node;
0362             err = createNodeFromPage(SKGMainPanel::getMainPanel()->page(i), rootNode, node);
0363 
0364             // Send message
0365             IFOKDO(err, node.getDocument()->sendMessage(i18nc("An information message", "The bookmark '%1' has been added", node.getDisplayName()), SKGDocument::Hidden))
0366         }
0367     }
0368 
0369     // status bar
0370     IFOK(err) {
0371         ui.kBookmarksList->selectObject(rootNode.getUniqueID());
0372         err = SKGError(0, i18nc("Successful message after an user action", "Bookmarks created"));
0373     }
0374     SKGMainPanel::displayErrorMessage(err);
0375 }
0376 
0377 void SKGBookmarkPluginDockWidget::onAddBookmark()
0378 {
0379     SKGTRACEINFUNC(1)
0380     SKGError err;
0381 
0382     // Get current page
0383     SKGNodeObject node;
0384     {
0385         // Get current selection
0386         SKGNodeObject parentNode(getDocument(), 0);
0387         SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0388         if (!bookmarks.isEmpty()) {
0389             parentNode = bookmarks.at(0);
0390         }
0391 
0392         // Create bookmark
0393         err = createNodeFromPage(SKGMainPanel::getMainPanel()->currentPage(), parentNode, node);
0394     }
0395     // status bar
0396     IFOK(err) {
0397         ui.kBookmarksList->selectObject(node.getUniqueID());
0398         err = SKGError(0, i18nc("Successful message after an user action", "Bookmark created"));
0399     }
0400     SKGMainPanel::displayErrorMessage(err);
0401 }
0402 
0403 SKGError SKGBookmarkPluginDockWidget::createNodeFromPage(SKGTabPage* iPage, const SKGNodeObject& iParentNode, SKGNodeObject& oCreatedNode)
0404 {
0405     SKGTRACEINFUNC(1)
0406     SKGError err;
0407 
0408     // Get current page
0409     oCreatedNode = SKGNodeObject();
0410     if (iPage != nullptr) {
0411         // Get current selection name
0412         QString name;
0413         SKGNodeObject parentNode = iParentNode;
0414         if (!parentNode.isFolder()) {
0415             // This is not a folder, we have to take the parent
0416             SKGNodeObject parentNodeTmp;
0417             parentNode.getParentNode(parentNodeTmp);
0418             parentNode = parentNodeTmp;
0419         }
0420         name = parentNode.getFullName();
0421 
0422         // Add current name
0423         if (!name.isEmpty()) {
0424             name += OBJECTSEPARATOR;
0425         }
0426 
0427         QString defaultName = iPage->objectName();
0428         QString defaultIcon;
0429 
0430         // Get title and icon from tab (in case of changed in bookmark)
0431         auto tab = SKGMainPanel::getMainPanel()->getTabWidget();
0432         if (tab) {
0433             auto index = tab->indexOf(iPage);
0434             if (index != -1) {
0435                 defaultName = tab-> tabText(index);
0436                 defaultIcon = tab-> tabIcon(index).name();
0437             }
0438         }
0439         name += defaultName.replace("&", "");
0440 
0441         // Create bookmark
0442         SKGBEGINTRANSACTION(*iParentNode.getDocument(), i18nc("Noun, name of the user action", "Bookmark creation '%1'", name), err)
0443         err = SKGNodeObject::createPathNode(iParentNode.getDocument(), name, oCreatedNode, true);
0444         IFOK(err) {
0445             QString value = SKGServices::stringToCsv(iPage->objectName()) % ';' %
0446                             SKGServices::stringToCsv(defaultName) % ';' %
0447                             SKGServices::stringToCsv(iPage->getState());
0448 
0449             err = oCreatedNode.setData(value);
0450             IFOKDO(err, oCreatedNode.setIcon(defaultIcon))
0451             IFOKDO(err, oCreatedNode.save())
0452 
0453             // Send message
0454             IFOKDO(err, oCreatedNode.getDocument()->sendMessage(i18nc("An information message", "The bookmark '%1' has been added", oCreatedNode.getDisplayName()), SKGDocument::Hidden))
0455         }
0456     }
0457     return err;
0458 }
0459 
0460 void SKGBookmarkPluginDockWidget::onRenameBookmark()
0461 {
0462     SKGTRACEINFUNC(1)
0463 
0464     QItemSelectionModel* selModel = ui.kBookmarksList->selectionModel();
0465     auto* proxyModel = qobject_cast< QSortFilterProxyModel* >(ui.kBookmarksList->model());
0466     if ((proxyModel != nullptr) && (selModel != nullptr)) {
0467         auto* model = qobject_cast<SKGObjectModelBase*>(proxyModel->sourceModel());
0468         if (model != nullptr) {
0469             QModelIndexList indexes = selModel->selectedRows();
0470             if (indexes.count() == 1) {
0471                 ui.kBookmarksList->edit(indexes.at(0));
0472             }
0473         }
0474     }
0475 }
0476 
0477 void SKGBookmarkPluginDockWidget::onChangeIconBookmark()
0478 {
0479     SKGTRACEINFUNC(1)
0480 
0481     SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0482     if (bookmarks.count() == 1) {
0483         SKGNodeObject node(bookmarks.at(0));
0484         KIconDialog diag(this);
0485         diag.setup(KIconLoader::NoGroup);
0486         QString icon = diag.openDialog();
0487         if (!icon.isEmpty()) {
0488             SKGError err;
0489             {
0490                 SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Bookmark icon change"), err)
0491                 err = node.setIcon(icon);
0492                 IFOKDO(err, node.save())
0493 
0494                 // Send message
0495                 IFOKDO(err, node.getDocument()->sendMessage(i18nc("An information message", "The icon of the bookmark '%1' has been changed", node.getDisplayName()), SKGDocument::Hidden))
0496             }
0497             // status bar
0498             IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Bookmark icon changed")))
0499             SKGMainPanel::displayErrorMessage(err);
0500         }
0501     }
0502 }
0503 
0504 
0505 void SKGBookmarkPluginDockWidget::onRemoveBookmark()
0506 {
0507     SKGTRACEINFUNC(1)
0508     SKGError err;
0509     {
0510         SKGBEGINTRANSACTION(*getDocument(), i18nc("Noun, name of the user action", "Bookmark delete"), err)
0511         // Get current selection
0512         SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0513         int nb = bookmarks.count();
0514         for (int i = 0; i < nb && !err; ++i) {
0515             SKGNodeObject node(bookmarks.at(i));
0516             err = node.remove();
0517         }
0518     }
0519 
0520     // status bar
0521     IFOKDO(err, SKGError(0, i18nc("Successful message after an user action", "Bookmark deleted")))
0522     SKGMainPanel::displayErrorMessage(err);
0523 }
0524 
0525 void SKGBookmarkPluginDockWidget::onBookmarkEditorChanged()
0526 {
0527     SKGTRACEINFUNC(10)
0528 
0529     // Enable bookmark buttons
0530     int nbSelectedObjects = getNbSelectedObjects();
0531     bool testAdd = getDocument()->getMainDatabase() != nullptr && nbSelectedObjects <= 1;
0532     if (m_actAddBookmarkGroup != nullptr) {
0533         m_actAddBookmarkGroup->setEnabled(testAdd);
0534     }
0535     if (m_actAddBookmark != nullptr) {
0536         m_actAddBookmark->setEnabled(testAdd && SKGMainPanel::getMainPanel()->currentPageIndex() >= 0);
0537     }
0538     if (m_actAddBookmarks != nullptr) {
0539         m_actAddBookmarks->setEnabled(testAdd && SKGMainPanel::getMainPanel()->currentPageIndex() >= 0);
0540     }
0541     if (m_actDelete != nullptr) {
0542         m_actDelete->setEnabled(nbSelectedObjects > 0);
0543     }
0544     if (m_actRename != nullptr) {
0545         m_actRename->setEnabled(nbSelectedObjects == 1);
0546     }
0547     if (m_actChangeIcon != nullptr) {
0548         m_actChangeIcon->setEnabled(nbSelectedObjects == 1);
0549     }
0550 }
0551 
0552 void SKGBookmarkPluginDockWidget::refresh()
0553 {
0554     SKGTRACEINFUNC(10)
0555     // Bookmarks
0556     SKGObjectBase::SKGListSKGObjectBase bookmarks = getSelectedObjects();
0557     int nbSelectedObjects = bookmarks.count();
0558     if (nbSelectedObjects == 1) {
0559         SKGNodeObject node(bookmarks.at(0));
0560         if (m_actSetAutostart != nullptr) {
0561             m_actSetAutostart->setEnabled(node.getAttribute(QStringLiteral("t_autostart")) != QStringLiteral("Y"));
0562         }
0563         if (m_actUnsetAutostart != nullptr) {
0564             m_actUnsetAutostart->setEnabled(node.getAttribute(QStringLiteral("t_autostart")) == QStringLiteral("Y"));
0565         }
0566     } else {
0567         if (m_actSetAutostart != nullptr) {
0568             m_actSetAutostart->setEnabled(nbSelectedObjects > 1);
0569         }
0570         if (m_actUnsetAutostart != nullptr) {
0571             m_actUnsetAutostart->setEnabled(nbSelectedObjects > 1);
0572         }
0573     }
0574 
0575     onBookmarkEditorChanged();
0576 }
0577 
0578 void SKGBookmarkPluginDockWidget::onPageChanged()
0579 {
0580     // Set current selection of dock
0581     QString id;
0582     SKGTabPage* cPage = SKGMainPanel::getMainPanel()->currentPage();
0583     if (cPage != nullptr) {
0584         id = cPage->getBookmarkID();
0585     }
0586     ui.kBookmarksList->selectObject(id % "-node");
0587 }
0588 
0589 void SKGBookmarkPluginDockWidget::resizeEvent(QResizeEvent* iEvent)
0590 {
0591     if (iEvent != nullptr) {
0592         QSize newSize = iEvent->size();
0593 
0594         // Compute icon size
0595         int s = qMax(qMin(newSize.width() / 5, 64), 16);
0596         ui.kBookmarksList->setIconSize(QSize(s, s));
0597     }
0598 
0599     QWidget::resizeEvent(iEvent);
0600 }
0601 
0602