diff --git a/.gitignore b/.gitignore index 0b823ea..4e47391 100644 --- a/.gitignore +++ b/.gitignore @@ -52,4 +52,5 @@ compile_commands.json *creator.user* /build/* -.vscode \ No newline at end of file +.vscode +tags diff --git a/CMakeLists.txt b/CMakeLists.txt index 8538766..fee3c2f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,8 +20,8 @@ find_package(KF5WindowSystem) find_package(KF5Config) qt5_add_dbus_adaptor(DBUS_SOURCES - com.cutefish.FileManager.xml - application.h Application) + com.cutefish.FileManager.xml + application.h Application) add_executable(cutefish-filemanager main.cpp diff --git a/README.md b/README.md index 1118b52..ba3863e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ -# File Manager +# File Manager Vi version Cutefish File Manager, simple to use, beautiful, and retain the classic PC interactive design. +On this branch, the Cutefish File Manager has an even easier way to browse your files thanks to the +vi mode. Instead of the classical shortcuts, vim fans will be pleased to use some of the vim shortcuts +to browse their files. + ![screenshot](screenshots/Screenshot_20211025_151224.png) ## Dependencies @@ -29,6 +33,7 @@ sudo pacman -S extra-cmake-modules qt5-base qt5-quickcontrols2 taglib kio ## Build ```shell +git checkout vi-mode mkdir build cd build cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr .. diff --git a/helper/shortcut.cpp b/helper/shortcut.cpp index c5ed6bb..c280267 100644 --- a/helper/shortcut.cpp +++ b/helper/shortcut.cpp @@ -43,43 +43,62 @@ void ShortCut::install(QObject *target) } } +// bool ShortCut::noShortcuts(QObject *obj, QEvent *e) +// { +// QKeyEvent *keyEvent = static_cast(e); + +// if (e->type() == QEvent::KeyPress) { +// // int keyInt = keyEvent->modifiers() + keyEvent->key(); + +// if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { +// emit open(); +// } else if (keyEvent->key() == Qt::Key_C && keyEvent->modifiers() & Qt::ControlModifier) { +// emit copy(); +// } else if (keyEvent->key() == Qt::Key_X && keyEvent->modifiers() & Qt::ControlModifier) { +// emit cut(); +// } else if (keyEvent->key() == Qt::Key_W && keyEvent->modifiers() & Qt::ControlModifier) { +// emit close(); +// } else if (keyEvent->key() == Qt::Key_V && keyEvent->modifiers() & Qt::ControlModifier) { +// emit paste(); +// } else if (keyEvent->key() == Qt::Key_F2) { +// emit rename(); +// } else if (keyEvent->key() == Qt::Key_L && keyEvent->modifiers() & Qt::ControlModifier) { +// emit openPathEditor(); +// } else if (keyEvent->key() == Qt::Key_A && keyEvent->modifiers() & Qt::ControlModifier) { +// emit selectAll(); +// } else if (keyEvent->key() == Qt::Key_Backspace) { +// emit backspace(); +// } else if (keyEvent->key() == Qt::Key_Delete) { +// emit deleteFile(); +// } else if (keyEvent->key() == Qt::Key_F5) { +// emit refresh(); +// } else if (keyEvent->key() == Qt::Key_H && keyEvent->modifiers() & Qt::ControlModifier) { +// emit showHidden(); +// } else if (keyEvent->key() == Qt::Key_Z && keyEvent->modifiers() & Qt::ControlModifier) { +// emit undo(); +// } else if (keyEvent->key() >= Qt::Key_A && keyEvent->key() <= Qt::Key_Z) { +// // Handle select +// // KeyboardSearchManager::self()->addKeys(keyEvent->text()); +// emit keyPressed(keyEvent->text()); +// keyEvent->ignore(); +// } +// } + +// return QObject::eventFilter(obj, e); +// } + bool ShortCut::eventFilter(QObject *obj, QEvent *e) { - if (e->type() == QEvent::KeyPress) { - QKeyEvent *keyEvent = static_cast(e); - // int keyInt = keyEvent->modifiers() + keyEvent->key(); + if (e->type() != QEvent::KeyPress) { + return QObject::eventFilter(obj, e); + } + + QKeyEvent *keyEvent = static_cast(e); + int key = keyEvent->key(); - if (keyEvent->key() == Qt::Key_Enter || keyEvent->key() == Qt::Key_Return) { - emit open(); - } else if (keyEvent->key() == Qt::Key_C && keyEvent->modifiers() & Qt::ControlModifier) { - emit copy(); - } else if (keyEvent->key() == Qt::Key_X && keyEvent->modifiers() & Qt::ControlModifier) { - emit cut(); - } else if (keyEvent->key() == Qt::Key_W && keyEvent->modifiers() & Qt::ControlModifier) { - emit close(); - } else if (keyEvent->key() == Qt::Key_V && keyEvent->modifiers() & Qt::ControlModifier) { - emit paste(); - } else if (keyEvent->key() == Qt::Key_F2) { - emit rename(); - } else if (keyEvent->key() == Qt::Key_L && keyEvent->modifiers() & Qt::ControlModifier) { - emit openPathEditor(); - } else if (keyEvent->key() == Qt::Key_A && keyEvent->modifiers() & Qt::ControlModifier) { - emit selectAll(); - } else if (keyEvent->key() == Qt::Key_Backspace) { - emit backspace(); - } else if (keyEvent->key() == Qt::Key_Delete) { - emit deleteFile(); - } else if (keyEvent->key() == Qt::Key_F5) { - emit refresh(); - } else if (keyEvent->key() == Qt::Key_H && keyEvent->modifiers() & Qt::ControlModifier) { - emit showHidden(); - } else if (keyEvent->key() == Qt::Key_Z && keyEvent->modifiers() & Qt::ControlModifier) { - emit undo(); - } else if (keyEvent->key() >= Qt::Key_A && keyEvent->key() <= Qt::Key_Z) { - // Handle select - // KeyboardSearchManager::self()->addKeys(keyEvent->text()); - emit keyPressed(keyEvent->text()); - keyEvent->ignore(); + for (const fun_shortcut &shortcut: Normal_Shortcuts) { + if (key == shortcut.key) { + shortcut.action(); } } diff --git a/helper/shortcut.h b/helper/shortcut.h index 9d9dfbf..fb5c7f0 100644 --- a/helper/shortcut.h +++ b/helper/shortcut.h @@ -19,8 +19,7 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA . * ***************************************************************************/ -#ifndef SHORTCUT_H -#define SHORTCUT_H +#pragma once #include @@ -28,32 +27,58 @@ class ShortCut : public QObject { Q_OBJECT -public: - explicit ShortCut(QObject *parent = nullptr); - - Q_INVOKABLE void install(QObject *target = nullptr); - -signals: - void open(); - void copy(); - void cut(); - void paste(); - void rename(); - void refresh(); - void openPathEditor(); - void selectAll(); - void backspace(); - void deleteFile(); - void showHidden(); - void keyPressed(const QString &text); - void close(); - void undo(); - -protected: - bool eventFilter(QObject *obj, QEvent *e) override; - -private: - QObject *m_object; -}; + public: + explicit ShortCut(QObject *parent = nullptr); + + Q_INVOKABLE void install(QObject *target = nullptr); + + signals: + void open(); + void copy(); + void cut(); + void paste(); + void rename(); + void refresh(); + void openPathEditor(); + void selectAll(); + void backspace(); + void deleteFile(); + void showHidden(); + void keyPressed(const QString &text); + void close(); + void undo(); + + protected: + bool eventFilter(QObject *obj, QEvent *e) override; -#endif // SHORTCUT_H + private: + QObject *m_object; + + // This is a structure composed of : + // - a key (the shortcut) + // - an action (the function pointer) + typedef struct { + Qt::Key key; + std::function action; + } fun_shortcut; + + // This array contains structures where keys are associated + // with an action. You only have to loop on this array, compare + // its key with the one you received, and execute its action + const fun_shortcut Normal_Shortcuts[14] = { + { Qt::Key_Y, [&]() { return copy(); } }, + { Qt::Key_P, [&]() { return paste(); } }, + { Qt::Key_R, [&]() { return rename(); } }, + { Qt::Key_Return, [&]() { return open(); } }, + { Qt::Key_Enter, [&]() { return open(); } }, + { Qt::Key_Percent, [&]() { return showHidden(); } }, + { Qt::Key_U, [&]() { return undo(); } }, + { Qt::Key_D, [&]() { return cut(); } }, + { Qt::Key_X, [&]() { return deleteFile(); } }, + { Qt::Key_Q, [&]() { return close(); } }, + { Qt::Key_A, [&]() { return refresh(); } }, + { Qt::Key_Colon, [&]() { return openPathEditor(); } }, + { Qt::Key_V, [&]() { return selectAll(); } }, + { Qt::Key_Backspace, [&]() { return backspace(); } } + }; +};