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