File indexing completed on 2024-04-28 04:21:22

0001 // SPDX-FileCopyrightText: 2003-2020 The KPhotoAlbum Development Team
0002 // SPDX-FileCopyrightText: 2021-2022 Johannes Zarl-Zierl <johannes@zarl-zierl.at>
0003 //
0004 // SPDX-License-Identifier: GPL-2.0-or-later
0005 
0006 #include "KeyboardEventHandler.h"
0007 
0008 #include "CellGeometry.h"
0009 #include "ThumbnailModel.h"
0010 #include "ThumbnailWidget.h"
0011 #include "VideoThumbnailCycler.h"
0012 #include "enums.h"
0013 
0014 #include <DB/CategoryCollection.h>
0015 #include <DB/ImageDB.h>
0016 #include <MainWindow/DirtyIndicator.h>
0017 #include <kpabase/SettingsData.h>
0018 
0019 ThumbnailView::KeyboardEventHandler::KeyboardEventHandler(ThumbnailFactory *factory)
0020     : ThumbnailComponent(factory)
0021 {
0022 }
0023 
0024 bool ThumbnailView::KeyboardEventHandler::keyPressEvent(QKeyEvent *event)
0025 {
0026     if (event->modifiers() == Qt::NoModifier && event->key() == Qt::Key_Escape) {
0027         if (model()->isFiltered()) {
0028             model()->clearFilter();
0029             return true;
0030         }
0031     }
0032     // tokens
0033     if (event->key() >= Qt::Key_A && event->key() <= Qt::Key_Z) {
0034         const QString token = event->text().toUpper().left(1);
0035         if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::ShiftModifier) {
0036             // toggle tokens
0037             bool mustRemoveToken = false;
0038             bool hadHit = false;
0039 
0040             const DB::FileNameList selection = widget()->selection(event->modifiers() == Qt::NoModifier ? NoExpandCollapsedStacks : IncludeAllStacks);
0041             const DB::CategoryPtr tokensCategory = DB::ImageDB::instance()->categoryCollection()->categoryForSpecial(DB::Category::TokensCategory);
0042             for (const DB::FileName &fileName : selection) {
0043                 DB::ImageInfoPtr info = DB::ImageDB::instance()->info(fileName);
0044                 if (!hadHit) {
0045                     mustRemoveToken = info->hasCategoryInfo(tokensCategory->name(), token);
0046                     hadHit = true;
0047                 }
0048 
0049                 if (mustRemoveToken)
0050                     info->removeCategoryInfo(tokensCategory->name(), token);
0051                 else
0052                     info->addCategoryInfo(tokensCategory->name(), token);
0053 
0054                 model()->updateCell(fileName);
0055             }
0056 
0057             tokensCategory->addItem(token);
0058             MainWindow::DirtyIndicator::markDirty();
0059             return true;
0060         }
0061         if (event->modifiers() == (Qt::AltModifier | Qt::ShiftModifier)) {
0062             // filter view
0063             const QString tokensCategory = DB::ImageDB::instance()->categoryCollection()->categoryForSpecial(DB::Category::TokensCategory)->name();
0064             model()->toggleCategoryFilter(tokensCategory, token);
0065             return true;
0066         }
0067     }
0068 
0069     // rating
0070     if (event->key() >= Qt::Key_0 && event->key() <= Qt::Key_5) {
0071         bool ok;
0072         const short rating = 2 * event->text().left(1).toShort(&ok, 10);
0073         if (ok) {
0074             if (event->modifiers() == Qt::NoModifier || event->modifiers() == Qt::ShiftModifier) {
0075                 // set rating
0076                 const DB::FileNameList selection = widget()->selection(event->modifiers() == Qt::NoModifier ? NoExpandCollapsedStacks : IncludeAllStacks);
0077                 for (const DB::FileName &fileName : selection) {
0078                     DB::ImageInfoPtr info = DB::ImageDB::instance()->info(fileName);
0079                     info->setRating(rating);
0080                 }
0081                 MainWindow::DirtyIndicator::markDirty();
0082                 return true;
0083             }
0084         }
0085     }
0086 
0087     if (event->key() == Qt::Key_Control && widget()->isItemUnderCursorSelected())
0088         VideoThumbnailCycler::instance()->stopCycle();
0089 
0090     if (event->key() == Qt::Key_Return) {
0091         Q_EMIT showSelection();
0092         return true;
0093     }
0094 
0095     if (event->key() == Qt::Key_Slash) {
0096         Q_EMIT showSearch();
0097         return true;
0098     }
0099 
0100     return false;
0101 }
0102 
0103 /**
0104    Handle key release event.
0105    \return true if the event should propagate
0106 */
0107 bool ThumbnailView::KeyboardEventHandler::keyReleaseEvent(QKeyEvent *event)
0108 {
0109     if (widget()->m_wheelResizing && event->key() == Qt::Key_Control) {
0110         widget()->m_gridResizeInteraction.leaveGridResizingMode();
0111         widget()->m_wheelResizing = false;
0112 
0113         return false; // Don't propagate the event - I'm not sure why.
0114     }
0115 
0116     if (event->key() == Qt::Key_Control)
0117         VideoThumbnailCycler::instance()->setActive(widget()->mediaIdUnderCursor());
0118 
0119     return true;
0120 }
0121 
0122 // vi:expandtab:tabstop=4 shiftwidth=4:
0123 
0124 #include "moc_KeyboardEventHandler.cpp"