diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 51594dc..0000000 --- a/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -debian/*.debhelper -debian/*.log -debian/*.substvars -debian/debhelper-build-stamp -debian/files - -debian/pcmanfm-qt/ - diff --git a/AUTHORS b/AUTHORS deleted file mode 100644 index e7604db..0000000 --- a/AUTHORS +++ /dev/null @@ -1,6 +0,0 @@ -Upstream Authors: - LXQt team: https://lxqt.org - Hong Jen Yee (PCMan) - -Copyright: - Copyright (c) 2013-2017 LXQt team diff --git a/CHANGELOG b/CHANGELOG deleted file mode 100644 index c9ba01d..0000000 --- a/CHANGELOG +++ /dev/null @@ -1,750 +0,0 @@ - -pcmanfm-qt-0.13.0 / 2018-05-21 -============================== - - * Check minimum version of libfm-qt - * Bumped minor version to 13 - * Spanish translation update - * Avoid using the old FmPath struct in libfm and use libfm-qt Fm::FilePath instead. - * Just changed a label in Preferences - * Replace the deprecated Fm::MountOperation::mount() with Fm::MountOperation::mountEnclosingVolume(). - * Cleanup - * Migrate to the new libfm-qt Fm::FileLauncher API. - * CMake: Prevent in-source builds - * Use new libfm-qt Fm::Archiver API. (#660) - * Fixed tab close button setting - * Optionally select newly created files - * fixes http -> https - * Fixed some lxde mentions - * Drop usage of Fm::IconTheme - * Add symlink target info to statusbar - * Add Simplified Chinese desktop entries (#640) - * Follow GLib to know if a file is hidden - * Remember hidden Places items between sessions - * Drop Qt foreach - * Use QString Use multi-arg - * Prevent a possible c++11 range-loop detach container (QList) - * Don't call QList::first() on temporary - * Warnings (#625) - * move config to /usr/share/pcmanfm-qt/lxqt - * Fixed the setting for "backup as hidden"" (#614) - * Sweep a desktop mess under the carpet - * cmake: Don't set CMP0063 - * cmake: Handle CMP0071 - Mark DBus files with SKIP_AUTOGEN - * cmake: Handle CMP0071 related to UI files. - * Refer to PCManFM-Qt in desktop entries - * Add Spanish desktop entries - * Use QChars - * Simplify if statements - * Const it - * Fix typos, move encloseWithBidiMarks to private and fix its behaviour - * Fix direction of statusbar message - * Give context to singleShot() - * Added a short comment - * Wait for events to be processed before chdir - * Rename progress dialog - * Basic bulk rename - * Really cancel multiple renaming on cancelling - * Initialize dragStarted_ in constructor - * Compact disconnection format - * Tab DND - * View tool-buttons - -0.12.0 / 2017-10-21 -=================== - - * Release 0.12.0: Update changelog - * Set Version - * removed dangeling symlink to debian dir - * Text eliding, long texts and newline - * Update status message appropriately - * fixup...use static const - * Fix icon sizes - * Just fixed my typo in search settings (#574) - * Lithuanian translation - * Lithuanian translation - * Disable menubar actions that cannot be used - * Save and restore search settings - * Don't export github templates - * Wallpaper Slide Show - * Inline renaming with F2 for detailed list view (#554) - * Inline renaming with F2 - * Fix showing/hiding hidden files (#535) - * Don't select or scroll to child folder on reloading (#536) - * Replace customized DesktopItemDelegate hacks with the standard Fm::FolderItemDelegate provided by libfm-qt. (#529) - * liblxqt version make no sense here - * Copied issue template - * Fix Ctrl+A on desktop (#526) - * Update statusbar size info when needed - * Drops Qt5Core_VERSION_STRING - * set Qt::AA_UseHighDpiPixmaps to true - * Fix jerky desktop items - * Place dropped item at drop position (#504) - * Make custom pos checkbox work for multiple items (#499) - * Fix crash on removing desktop items with custom position (#496) - * Fix cursor on hovering desktop items - * Fix pressing RETURN in location bar - * Remove the old tilde replacement - * Included LXQTConfigVars - * Fixed config/CMakeLists.txt - removed not needed things - * Added merged autostart and config to CMakeLists.txt - * Updated *_da.desktop files and removed *_da_DK.desktop files - * Update desktop entries and Replace fr_FR by fr - * lxqt-rc.xml: Change default config install path - * PCManFM-Qt: Update default wallpaper (#49) - * Merge pull request #48 from lxde/pcmanfm-qt-sort-order - * Settings Openbox updated. - * Default key shortcuts added to lxqt-globalkeysd. - * Use lxqt-sudo in pcmanfm-qt config file by default. - * Update Greek translation (el) Remove country variant from language code - * CMake: Adds Runtime and Devel install COMPONENTs - * Coding style changes - * Adds double quotes to everything that may break - * Updates the build system to use the Targets infrastructure - * adjust default wallpaper to default theme - * Drops hardcoded /etc/xdg paths - * Updated german translation, replaced Qt4 by Qt in all xsession/translations - * Updates translations infrastructure - * Update the required minimum cmake version - * remove dead template lines switch OnlyShowIn from Razor -> LXQt stringchanges LxQt -> LXQt - * Add session.conf and windowmanagers.conf. - * Support lxqt-session and add necessary xdg autostart desktop entry files. - * Rename dirs and replace razor with lxqt. Install lxqt.conf to /etc/xdg/lxqt and provide theme config. - * Properly set default wallpaper for pcmanfm-qt. Comment out openbox config handling in startlxde-qt since it's not needed. - * Remove custom openbox config file in desktop.conf temporarily until lxsession is fixed. - * Fix file paths, replacing razor with lxqt. * Remove Alt+F2 and Ctrl+Esc from openbox config file to avoid conflicts with lxqt-panel & lxqt-globalkeys. - * Add default configuration files for lxde-qt session. - * Use const iterators (Fix a FTBFS in debug mode) (#483) - * Fixed desktop items movement - * Fixes some pedantic bugs - * Correct alignment of small icons on desktop - * Rename namespace Fm2 to Fm. - * Remove unused header includes. - * Fix a bug in correct tab page dir path which causes problems of file searching. - * Fix incorrect URI of application menu. - * Fix the broken folder reload. - * Fix incorrect title update of tabs. - * Add basic error handling when folder loading is failed. - * Port status message handling to the new libfm C++ API. - * Use Fm2::Path::homePath() API. - * Use the new libfm C++ terminal emulator APIs. - * Adopt to changes of libfm C++ APIs. - * Deprecate the use of Fm::Thumbnailer. - * Replace all NULL with C++ 11 nullptr. - * Initial port to the new C++ libfm API. - * DesktopWindow: Render tilled wallpaper manually - * Use const iterators - * Checks bookmarks iterators validity (#444) - -0.11.3 / 2017-01-14 -=================== - - * Release 0.11.3: Update changelog - * remove 0.11.3 changelog entries - * Bump patch version - * Release 0.11.3: Update changelog - * Add a workaround for the Qt5 bug which causes broken wallpaper background. - * Update AUTHORS - -0.11.2 / 2016-12-21 -=================== - - * Release 0.11.2: Update changelog - * Use static_cast instead of the C style cast - * Fix sign-compare warnings - * Prevent wrong clearing of filter-bar with path buttons (#432) - * bump patch version (#429) - * Add *da.desktop files - * Re-layout on Changing Display Name. (#355) - * Add Pathbar Separator - * New tab on middle clicking a path button - * Make dialogue "About" point out it's the Qt version of PCManFM. (#421) - * CMake: Drop finding XCB - * Avoid code duplication. - * Added a wallpaper zooming option - * Implement a "Connect to server" dialog for easily mounting remote filesystems. Add new API PCManFM::MainWindow::lastActive() to get last active window. - * Use the new button-style path bar by default. Properly handle the editing of button-style path bar. - * Add missing ui file. - * Move the pcmanfm-qt_pt_BR.ts file to lxqt-l10n repo. - * Remove context menu from toolbar and menubar - * Support button-style path bar and adjust the layout of the view menu slightly. - * Create pcmanfm-qt_fr.desktop - * Create pcmanfm-qt-desktop-pref_fr.desktop - * Adds Build PROJECT_NAME with Qt version message - * Moved LIBFM_DATA_DIR compile definition from libfm-qt - * Use target_compile_definitions(). - * Use the new lxqt-build-tools package - * Added very basic .gitattributes - * remove "building with cpack" from CMakeLists.txt - not used anymore - * Add Catalan translations - * Added Brazilian Portuguese Translation (pt_BR) - -0.11.1 / 2016-09-24 -=================== - - * Release 0.11.1: Add changelog - * Bump version to 0.11.1 (#399) - * Extend README.md - * Ensure the existence of libfm dir. - * Fix the bug that breaks sort folder first option. - * Preserve per-folder view settings. * Code refactor and cleanup. * Use Fm::FolderConfig internally for storing the per-folder settings. - * Per-folder saving of sorting and view mode - * Use libfm-qt C++ wrappers instead of the original libfm C API whenever possible. - * Replace tilde with home path (#371) - * Fix -Wswitch warning - * Use LXQtCompilerSettings cmake module - * Replaces deprecated QStyleOptionViewItemV4 - * Fixes two typos (#381) - * Add Arabic Translations for Desktop Files - * I18N: Fix plural string (#374) - * Fix some icons for RTL (#366) - * Use a wide spread icon theme as fallback for the time beeing (#359) - * build: Use external translations - * ts-files removal (#352) - * Fix memory leak in main window tool bar (#350) - * Change "compact icon view" in "icon view" (#349) - * Merge pull request #341 from lxde/desktop_sort_settings - * Add some tooltips to Pref dialog - * Add setting for Desktop con size - * Fix a few compiler warnings - -0.11.0 / 2016-03-13 -=================== - - * Switch automatically to newly opened tabs - * Fixes libfm-qt dependency contradiction on README.md - * Optional fullwidth tabbar By default, the tabbar is stretched over the left pane too. This commit makes that optional with a check button in the UI page of the Preferences dialog. It's checked by default but if unchecked, the tabbar will be positioned right above the folder-view. - * A toolbar button appearing on hiding menubar It has a dropdown menu containing all menubar items, is added to the end of toolbar, after a separator, when menubar is hidden and is removed (hidden) with its separator when menubar is shown. - * fix new grep 2.23 behaviour for the time beeing - * Bump year - * Bump version number to 0.11.0, preparing for a new release. - * Add hide menu bar menu entry - * Add menubar actions to the main window - * Return focus to the folder view when hitting escape - * Added options for min. item margins. Also included a fix (or workaround) for text shadow resetting. - * Added shortcut(s) for filterbar. Also added Ctrl+F, in addition to F3, for the search utility and cleared filter string for all tabs when closing the filterbar. - * Make it possible to hide the menu bar - * Set quit shortcut from the ui file - * Update the tab bar visibility when the settings change - * Add quit shortcut - * Always draw the text shadow on desktop. Also fixed the selected text color. - * Update czech translation (by Petr Balíček ) - * Improve french translation - * Move the XdndWorkaround to libfm-qt internal instead. - * Fixed a crash on right clicking trashed files. - * Select all of the text in the path entry when focusing it using shortcut keys Alt+D and Ctrl+L. - * Use lxqt-sudo as the default su tool instead of gksu. - * Add some ``beautiful'' workarounds that bypass Qt bug #49947 and 47981. This should fix the bug lxqt/#688 temporarily. - * Prevent large gaps at desktop bottom - * Update pcmanfm-qt_it.ts - * Let the style engine draw the text selection rect on desktop. - * options: Make options of wallpaper-mode switch untranslatable - * turkiash translate files added - * Fix --wallpaper-mode description in translations - * Polish translation updated - * Polish translation updated - * Fix --show-pref option not switching to next name - * Add config values for customizing "places" (not implemented yet). - * Updated Russian translation Removed ru_RU files - -0.10.1 / 2015-12-05 -=================== - - * hide 'Create New...' menu for files - * Russian translation update - * Deal with CMAKE POLICY 0063 - * Use CMAKE_CXX_VISIBILITY_PRESET and CMAKE_VISIBILITY_INLINES_HIDDEN - * Adds Clang support to symbols visibility - * Fix typo in setting key - * hide 'Paste' in file context menu - * restore 'Open with...' for directories in left panel - * Fix referencing generated headers in translations - * CMake: Drop qt5_use_modules() - * CMake: Use the new libfm-qt Targets - * Move libfm-qt to its own repository. - -split-libfm-qt / 2015-11-24 -=========================== - - * Fix typos in man page - * Update French translation - * Tab context menu for closing other tabs - * Italian translation updates - * Add bindings to Ctrl+PgUp/Ctrl+PgDn. - * Update French translation of GPL license - * Fix a random crash related to editing the bookmarks by disconnecting from GObject signals properly. - * Fix a crash triggered when unmounting a volume from the side pane. - * Avoid duplicated volumes and mounts in the side panel. (This fixes the mtp:// problem.) - * Select the item of the previously folder in current folder view if it's a direct child of the current folder. - * Fix missing null pointer check in Fm::Path::parent() and use nullptr instead of NULL in path.h. - * Code cleanup, «using» directive only if necessary - * Upgrade of pcmanfm-qt to C++11 - * Fix setting a SIGTERM handler with undefined flags - * Fix two typos in README - * Force the root config dir on the root instance - * Fix --version option not displaying version - * hu translations updated - * Fixed several problems with item selection and alignment - * Fix CMake LICENSE path - * Fix compiling with Qt < 5.4 - * Move LICENSE file - * Check for null pointers. - * Changed the static wentUp to the private variable wentUp_. - * Select the folder from where we have gone up. - -0.10.0 / 2015-11-02 -=================== - - * Release 0.10.0 - * Remove unnecessary qDebug traces - * Update zh_TW translations. - * Update translations. - * Provide an option in the view menu to turn off the filter bar (turned off by default). - * The signal QAbstractItemView::iconSizeChanged is only available after Qt 5.5. Add workarounds for older Qt versions. - * Add more null pointer checks in the thumbnail loader to avoid crashes caused by older versions of libfm. - * Fix CPack README path - * Update translations - * Use markdown for README - * Bump minimum CMake to 3.0.2 - * Reduce margin and spacing of the central widget - * Avoid the column resizing tricks for the detailed list view when the view contains no columns. - * Improve the column width computation for the detailed view - * Some code cleanup. - * desktop: Makes the Desktop Folder Edit functionality optional - * desktop: Renames Advanced page config layout manager - * PlacesView: activate on click on the second column - * SidePane: reduce size of button's column width - * Remove ugly board of main window's central widget - * Added a filterbar + Handle virtually hidden files - * Russian translation update - * Prevent the desktop window from being closed accidentally. This fixes #194. - * mouse fix - * Update cs_CZ translation with the strings provided by petrbal in pull request #218. - * Add apply button to desktop preferences dialog - * Removed pcmanfm-qt.kdev4 and fixed .gitignore - * desktop: Makes the preferences dialog General page tighter - * Add a shortcut key "F3" for launching the file searching utility. * Small UI layout adjistment. - * Allow adding or removing paths in the file search dialog. Fix bugs in searching for documents. - * Try to implement file searching by using the new Fm::FileSearchDialog class. - * Fix a incorrecy free() in fm_search_free() API. - * Add Fm::Path::take() API to take the ownership of a raw FmPath pointer. - * Add class Fm::FileSearchDialog used to show a dialog for searching files. - * Add FmSearch API which is used to build a search:// URI. (implemented in C and might become part of libfm later). - * Fix #197 by using a different method to forward the XCB mouse events to the root window. - * Fix #195 - Crash when rightclick on item in trash. - * Add a null check for FmFileInfo in Fm::ProxyFolderModel::lessThan(). This closes #205. - * Fix (workaround) for right-click crash in placesview. - * Russian translation: update - * Italian translation: add desktop entry files, adjust TS files - * placesview: middle-click correct item to activate (fix of segfault) - * Paste into folder from its context menu. - * libfm-qt: updated german translation - * libfm-qt: lupdated translation files - * Add Greek (el) translation - * added support for mouse back/forward buttons - * Add few missing Polish translations and modify few existing. - * xdg main category added - * Update German translation - * fixed paths in .ts files + lupdate - * Update German translation - * Update Russian translation - * CMake: Remove unused INSTALL variables - * Support opening items in the bookmarks menu in new tabs or new windows. - * Add new signal prepareFileMenu() to Fm::SidePane and Fm::DirTree so there's a chance to customize the file menu before its shown. - * Port some missing config options from the gtk+ version of pcmanfm. - * Also show hidden dirs in the directory tree when the "Show Hidden" option in the menu is turned on. - * Fix #190 - Column layout is not always updated. - * Fix relative paths in command line arguments. Close lxde/pcmanfm-qt#170 - relative paths stated by xdg-open not considered. - * Create New menu actions, context menu in tree side pane, #163. - * Install SIGTERM handler to save settings when logging out, #157. - * Store side pane mode setting, #157. - * Adds UPDATE_TRANSLATIONS option to the top CMakeLists - * Fixes an translation regression - * Updates translations - * Handles .desktop files translations - * Uses LXQt lxqt_translate_ts() to handle translations - * Add German translation of pcmanfm-qt.desktop - * Fix lxde/lxqt#447 - missing actions in Places' context menus - * Remove trailing whitespaces - * polishing German translation - * Add menu items and shortcuts for new folder and blank file, fixes #163. - *_hu desktops added - * Display folders first when active and sort order descending, fixes #179. - * Avoid space wasted by incorrect decoration in detailed view columns, fixes #177. - * Avoid flickering column header while resizing manually, fixes #176. - * Update pcmanfm-qt_it.ts - * Fix loading new desktop dir - * Hungarian translation - * Fix #627 - long startup time. (This blocking is caused by checking the availability of "network:///".) - * Enable text selection in file properties dialog - * Fixes #168 - qunsetenv("QT_NO_GLIB"); required before constructing the application. - * Fix some memory leaks reported by valgrind. - * Fix warnings reported by cppcheck. - * Fix warnings reported by scan-build. - * Sort indicators in detailed view, store column and order in settings, fixes #109. - * Fix lxde/lxqt#512 - pcmanfm-qt: cannot delete to trash. - * Fix lxde/lxqt#512 - "pcmanfm-qt: cannot delete to trash" by using a safer way to check trash:/// support. - * Polish translations added - * Bumps version - * Rearrange tab order (tabstops) - * Use 'user-trash' icon for 'Move to Trash' - * The "Custom" option in the application chooser combo box inside file properties dialog is broken. Fix by preventing recursive signal handler invocation. - * The file property dialog does not show correct default applications. Fix a bug in AppChooserComboBox::setMimeType() that does incorrect app comparison. - * When converting an UID or GID to its name, show the number as string when the user or group does not exists. - -0.9.0 / 2015-02-05 -================== - - * Add more null checks. - * Fix #130 - Remember width of side panel. - * Portuguese update - * Add very basic "remaining time" display to the progress dialog. Fix lxde/lxqt#463 - Progress dialog of pcmanfm-qt does not show remaining time. - * Fix lxde/pcmanfm-qt#120 - Foucs "Rename" button when file name changed. - * remember maximized state - * Remove unnecessary '\n' charactor from the translated strings. - * Fix translations (the newly added string comes from the translation of libfm). - * Improve trash can handling: provide an option to delete the files if moving to trashcan fails. - * Fix broken filenames of translation files. - * Support NoUsbTrash option and fix #125 - "Move to trash " on mounted devices. - * Bump version numbers, preparing for a new release. - * Completely remove dependency on libqtxdg. - * More migration to Qt5 new signal/slot syntax for better type safety & speed. - * Migrade to new Qt5 signal/slot syntax for better type safety and speed. - * Fix the broken sorting option. - * Fix lxde/lxqt#448 - PCmanFM-QT renaming place bookmarks does nothing. - * Fix broken rememberWindowSize settings. - * Portuguese update - * Support linguistic sorting of file names. This fixes #105. - * Avoid using Qt 5.4 API if compiled with older Qt versions. Fix #121. - * Update the folder model & view after files are changed. - * Open folders in new tabs by middle clicking on items in the side pane. - * Support reordering of tabs using drag and drop. - * Portuguese update - * Fix a crash of the context menu of places view caused by change of items. - * Save the result of "Edit bookmarks" to gtk+3 bookmarks file instead of the deprecated ~/.gtkbookmarks file. This fixes bug #112 partially. - * Fix #396: pcmanfm-qt back and/or up does not remember position. - * Add spanish translations - * Adds GUI to change desktop dir in Desktop preferences. Uses libqtxdg. - * Add .gitignore - * Update Japanese translation - * Add German translation - * add Japanese translation - * Implement "UnTrash" for files in trash:/// and close lxde/lxqt#136. - * Handle command line URIs correctly and fix bug lxde/lxqt#414. - * Handle command line arguments with QCommandLineParser instead of using glib. Requires Qt >= 5.2. - * Add Russian translation - * Drop Qt4 support in code - * Clean up CMakeLists.txt and drop Qt4 support - * New files added from LXDE Pootle server based on templates - -0.8.0 / 2014-09-28 -================== - - * Commit from LXDE Pootle server by user Julius22.: 1007 of 1008 strings translated (2 need review). - * Commit from LXDE Pootle server by user Julius22.: 709 of 1008 strings translated (2 need review). - * Commit from LXDE Pootle server by user mbouzada.: 1008 of 1008 strings translated (0 need review). - * Commit from LXDE Pootle server by user mbouzada.: 891 of 1008 strings translated (0 need review). - * Commit from LXDE Pootle server by user mbouzada.: 615 of 1008 strings translated (0 need review). - * Commit from LXDE Pootle server by user mbouzada.: 364 of 364 strings translated (0 need review). - * New files added from LXDE Pootle server based on templates - * Keep CMAKE_CXX_FLAGS value - * Update ts files. - * Add manpage for pcmanfm-qt - * Add cs_CZ translation for libfm-qt. - * Commit from LXDE Pootle server by user dforsi.: 520 of 644 strings translated (0 need review). - * Commit from LXDE Pootle server by user dforsi.: 364 of 364 strings translated (0 need review). - * Commit from LXDE Pootle server by user dforsi.: 358 of 364 strings translated (0 need review). - * Change version number to 0.8 and update the info in the about dialog. - * Ensure that Qt 5.1 and above is used when built with Qt5 support. - * Bump package version number and library soversion to prepare for 0.2 release. - * queue relayout of desktop items when the desktop window is resized. - * Add cs_CZ translation for pcmanfm-qt. - * Fix broken Qt4 build. - * Fix bugs in multihead support and also add workaround for Qt5 bug #40681. * Handle switches between virtual desktop mode and non-virtual mode correctly. * Disable desktop wallpaper cache for non-primary screens. - * Correctly reposition desktop items when the icon size, font, or Qt style is changed. - * Slight improvement of the preference dialog for the newly added "remember window size" option. - * Fix #85 - Scrolling doesn't work in compact view. - * Hide UI elements that are not usable and disable trash can when gvfs is not available. * Add new API Fm::isUriSchemeSupported(). - * Avoid showing the popup menu when moving desktop items. - * Improve handling of file selection and fixing FolderView::selectAll(), which is reported in #45. Delay the handling of selectionChanged() signal to avoid too frequent UI updates. - * Little adjustment for the grid of the folder view to decrease unnecessary margins. - * Use a new way to optimize the size of filename display based on current view mode and font size. This also fixes lxde/lxde-qt #198 - PCmanFM-qt incorrectly displays 256x256 Thumbnails. - * Replace the very broken QDesktopWidget with QScreen in Qt 5 when handling multihead support. - * Fully support single click activation and auto-selection with associated options added to the preference dialog. - * Add single click and auto-selection on hover support to Fm::FolderView. - * Re-layout desktop icons properly on QEvent::StyleChange and QEvent::FontChange. - * Try to support multihead setup in virtual screen mode (used by XRandR). - * Handle QEvent::WinIdChange event and reset X11 window properties correctly. - * New files added from LXDE Pootle server based on templates - * New files added from LXDE Pootle server based on templates - * Support forced deletion of files which bypasses the trash can with "Shift+Delete" shortcut key. * Simplify shortcut setup code a little. - * Add proper keyboard shortcuts to the desktop window. This closes bug #67. - * Add an option to go to home directory when the currently shown folder is deleted or unmounted. - * Improve update of translations to avoid unnecessary regeneration of ts files. - * Improve handling of fallback icons. This closes bug #57. - * Fix the mark for current history item in the popup menu of forward and backward buttons. - * Translations are lost accidentally in a previous commit. Restore them all. - * Add a workaround for Qt bug 32567 which causes bug #251 of lxde/lxde-qt. Now the desktop window should monitor the change of work area correctly. - * Avoid ambiguity when including path.h from libfm-qt. - * Fix a crash in Fm::PlacesModel when gvfs is not available. This closes bug #35 - Ctrl+W closes all windows. - * Fix a memory leak and free the file info list properly when renaming files. - * Do not detect filename extension and select the whole filename by default while renaming directories. This closes bug #71 - Don't try to detect extensions on directories. * API changed: Fm::renameFile() now accepect FmFileInfo as its first parameter. - * Show browse history in the context menu of back and forward tool buttons. - * Remove an unnecessary slot. - * Backspace to go up - * Fix bug #80 - make execute in context menu doesn't do change permissions. - * Remove unnecessary matrix set on the background brush. - * Avoid unnecessary writes to the desktop icon config file. - * Revert "fixed selection issue #45" This patch breaks copying files by DND in icon view mode and moving desktop icons. - * Avoid unnecessary relayout. - * Fix lxde/lxde-qt #184 - cannot move icons on desktop. - * Support showing the desktop menu provided by the window manager. - * Use qss instead of QPalette to set the background color of ColorButton. This fixed bug #192 of lxde-qt. - * Adds option to remember last window size - * Replace hard-coded version number 0x050000 with QT_VERSION_CHECK(5, 0, 0) for better readability. - * Rename the library from libfm-qt to libfm-qt5 when built with Qt5. - * fixed selection issue #45 - * Make settings of size of icons be properly loaded - * Makes the "Show Hidden" option be saved in settings file and properly loaded. I don't understand why it was not done yet, bu here it is. - * Close tabs by middle click - * Fix middle click position calculation in detailed view mode - * Fix crash when context menu is requested but selection is empty - * Activate view items only if clicked with left mouse button - * Do not emit activated signal when keyboard modifiers are on. - * Splits the checks for needed libraries - * Removes duplicated include_directories() entry - * Replaces ${CMAKE_SOURCE_DIR} by ${PROJECT_SOURCE_DIR} - * Fix LICENSE. It's GPL2. Oops. - * Make sure clang compiler does not complain - * Clean up desktop files - * Install pkgconfig file of libfm-qt to correct location in FreeBSD - * Fix missing return values in several methods. - -0.7.0 / 2014-05-07 -================== - - * Update README - * Avoid endless popups of error dialogs when there are errors launching files. - * Fix encoding handling of filenames passed via command line arguments. - * Save thumbnails as png files correctly. - -0.6.99 / 2014-04-29 -=================== - - * Update AUTHORS and COPYING - * Cached the scaled version of the wallpaper as needed to speed up program startup. - * Correctly relayout items when the work area is changed - * Adjust size of the preference dialog - * Remember custom positions for desktop icons and fix #29. - * Use new FmTerminal APIs provided by libfm. Also fix #31. - * Add template support to the folder context menus and fix #39. - * Show "owner" in the detailed list view mode. * Fix a crash when switching to detailed list mode in qt5. - * Use xcb to set EWMH window type hint to the desktop window in Qt5. * Some more cleanup for the CMakeList.txt files - * Add initial support for Qt5. - * Try to fix #36 again. - * Fix a seg fault caused by the widget being deleted during glib signal handling. - * Code cleanup, removing unnecessary header inclusion to speed up compilation. - * Avoid further handling of MountOperation in the gio finished callback if the object is deleted. - * Last fix for #36 is incorrect. Fix it again. - * Delete the tab if the folder currently being shown is deleted or unmounted. - * Use modeless dialogs for app chooser and error reporting in Fm::FileLauncher and Fm::FileMenu. - * Add an small emblem for symlinks (using icon name "emblem-symbolic-link"). Fix bug #27. - * Add missing file to git. - * Move internal implementation details to private headers which are not installed to the system. - * Add Doxygen support for API doc generation. - * Fix a regression bug, hiding "Open with..." sub menu of Fm::FileMenu for selected folders. - * Implement Fm::AppChooserDialog and Fm::AppMenuView classes. * Add / menu item to Fm::FileMenu. * Add custom app to Fm::AppChooserComboBox. - * Add Fm::AppChooserComboBox and use it in Fm::FilePropsDialog. - * Redesign Fm::FileLauncher APIs to make it more usable. * Add Fm::FileMenu::setFileLauncher() and Fm::FolderView::setFileLauncher() APIs. * Move PCManFM::View::onFileClick() and other popup menu handling to Fm::FolderView. - * Improve Fm::FileLaucher to make it easy to derive subclasses. * Implement a special dialog for opening executable files (Fix bug #13 - it does not launch executables) - * Fix bug #28 - Tash can icon does not refresh when the trash can changes its empty/full status - * Load autocompletion list for Fm::PathEdit only when the widget has the keyboard focus to avoid unnecessary I/O. - * Add proper popup menu items for selected folders and fix #20 and #19. * Some code refactors, adding openFolders() and openFolderInTerminal() to Application class. - * Fix #25 - Amount of items in the folder is not refreshed when the folder content changes. * Update status bar text properly on switching tab pages, selection changes, and folder content changes. - * Fix the broken compiler definitions caused by previous commit. - * Fix bug #22 - Do not select file extension by default on file rename. * Avoid installing private headers (*_p.h files) - * Setup pcmanfm-qt to support optional Custom Actions Menubar detects if libfm was built with vala or not if so a fm-actions.h will exist and support will be compiled in if not, will still compile with no actions menu - * Don't append library suffix to library install path, but use it by default - * Allow installation path configuration with standard CMake X_INSTALL_DIR - * Support reordering bookmark items in the places view with DND. - * Support adding bookmarks to the places view using drag and drop - * Preparing for implementing dnd for places view. - * Improve the usability of icon view mode, fixing github bug #24. - * Fix crashes caused by invalid pointer access. - * Switch current dir of the folder view correctly with dir tree view in the side pane. - * Finish chdir operation for Fm::DirTreeView. - * Support hiding hidden folders from DirTreeModel. - * Move some methods from DirTreeModel to DirTreeModelItem and fix some row updating problems. - * Implement dynamic folder loading/unloading when expanding or collapsing dir tree nodes. * Enable horizontal scrollbar of dir tree view. - * Move some code from Fm::DirTreeModel to Fm::DirTreeModelItem. - * Partially implement Fm::DirTreeView and Fm::DirTreeModel. (not finished yet) - * Fix an invalid pointer - * Implment different modes for Fm::SidePane, matching libfm-qtk design. * Add basic skeleton for dir tree view/model. - * Fix the cosmetic defect introduced by the eject buttons in the places view. - * Add eject buttons to mounted volumes in the places side pane. - * Fix #18 New windows should always show up in front. - * Fix #18 New windows should always show up in front. - * Remove x-directory/normal, close github bug #6 and #17. - * Add a wrapper class Fm::Path for FmPath C struct. - * Do not emit StyleChange events if the icon theme is not really changed. - * Initialize icon_ member of PlacesModelItem correctly. - * Fix fallback icon when a platform plugin is abscent. * Make Fm::IconTheme::checkUpdate() a static function. - * Remove xsettings support. Use a cleaner way to detect config changes by monitor StyleChange events. * Add Fm::IconTheme::changed() signal which is emitted when the icon theme name is changed. * Replace nested Fm::PlacesModel::Item and related classes with their own separate toplevel classes. - * Fix the icon for files of unknown mime types, again. - * Fix the icon for files of unknown mime types. - * Add DES-EMA custom actions to the popup menus. - * Make it safe to create multiple Fm::LibFmQt objects and only initialize libfm once. - * Fix incorrect export symbols and use GNUInstallDirs for installation destination - * Correctly save new wallpaper config. - * Support changing wallpaper from command line & dbus. - * Read fallback default settings from /etc/xdg/pcmanfm-qt. - * Use the latest libfm thumbnailer APIs. - * Fix #3614873 - Thumbnails in icon view shown upside down for some jpegs. - * Adopt recent changes of libfm. FmIcon is essentially identical to GIcon now. - * Add a UI file for application chooser dialog. - * Correctly handle display names of folders in path entry auto-completion. - * Add a global header and add proper definition for LIBFM_QT_API macro. - * Put cmake_minimum_required(VERSION 2.8.6) at the right place. - * Add "Empty trash" and fix a memory leak. - * Fix persistent busy cursor when loading menu://applications/ - * Fix memory leaks for bookmarks. Fix the broken "Network" item in places. - * Select correct folder view mode in the preference dialog. - * Reduce memory usage: Paint the folder items with our own code instead of using a dirty hacks duplicating pixmaps. - * Reduce of size of QPixmapCache in the hope of decreasing memory usage. - * Add fallback icons for places item "applications" and "network". - * Paint the background of the whole desktop window with wallpaper, including the reserved spaces. - * Set workare with QSS does not work properly. Revert the change. - * Add class Fm::CachedFolderModel, a convinient way to share Fm::FolderModel objects and reduce memory usage. - * Resize the columns of detailed list view when items are inserted or removed. - * Optimize column widths in detailed list mode when the view is resized. - * Resize the left list widget in the preference dialog according to its content. - * Detect icon theme name automatically using Xsettings or other desktop-specific way. * Rename "IconThemeName" key in the config file to "FallbackIconThemeName". * Hide the icon theme selection combo box if an icon theme name is detected automatically. - * Only show thumbnails for the first column in detailed list mode. - * Use new "automoc" feature of cmake 2.8.6 and remove cumbersome #include "*.moc" code. - * Fix work area problems of desktop window. - * Trivial fix. - * Add additional custom filter support to ProxyFolderModel. - * Add some keyboard shortcuts to the main window - * Fix some memory leaks. - * Fix some compiler errors and update translations. - * Support the latest libfm trunk. Remove -fpermissive compiler flag and fix compiler errors/warnings. - * Adopt new libfm thumbnail APIs. - * Enable thumbnail related settings. - * Adopt the latest thumbnail API in libfm (thumbnail branch) to speed up loading. - * Workardound incorrect thumbnail painting caused by bug of QStyledItemDelegate. :-( - * Fix a crash caused by accessing data for invalid model index. - * Add basic thumbnail support (need the latest thumbnail branch of libfm). - -0.1 / 2013-03-26 -================ - - * Add soname 0.0.0 for libfm-qt, preparing for 0.1 release. - * Fix crashes caused by incorrect deletion of dialog objects. - * Update zh_TW translations and translation templates. - * Add Portuguese translation (pt). - * Add Lithuanian translation (lt_LT). - * Fix a crash caused by accessing data for invalid model index. - * Add a Qt designer ui file for "Find Files" utility (not yet implemented). - * Add archiver integration for file context menus. - * Add archiver integration to file context menus. - * Add mnemonics for menu items. Make confirm dialog before delete and trash can optional. - * Update side pane according to current dir. Little fix. - * Implement "Open in Terminal" and "Open as Root". - * Enable auto-run related options in preferences dialog. - * Implement "Auto Run" for newly inserted removable devices. - * Add "Edit Bookmarks" dialog. - * Implement "Invert Selection". Little fix of UI, add a Tool menu to main window. - * Implement "Create New" menu in the folder popup menu. - * Modify make rules for translations. Avoid deleting generated ts files when "make clean". Fix a small error in zh_TW translation. - * Add auto-completion to path entry bar. - * Rename Fm::Application to Fm::LibFmQt to decrease confusion. Set required Qt version to 4.6. - * Load translation files correctly for pcmanfm-qt and libfm-qt. - * Add basic skeleton for i18n (using Qt QTranslator & Qt Linguist). - * Add separate CMakeLists.txt files for pcmanfm and libfm-qt. Hide more implementation details from libfm-qt headers. - * Fix copyright notice in all source files. - * Install desktop entry files for pcmanfm-qt & its desktop preferences dialog. - * Install a pkgconfig file for libfm-qt for use in other projects. - * Fix typos causing crashes. - * Fix a memory error caused by incorrect array size. Fix incorrect spacing of icons. - * Finish chown and chmod supports. - * Try to add file opermission settings UI. - * Implement very basic drag and drop support. - * Supress the incorrect default dnd handling of QListView. - * Try to implement Dnd. - * Make desktop preferences accessible from popup menu of desktop window. - * Convert enum values to/from strings for saving/loading config files. - * Finish desktop preferences. - * Improve desktop preferences and apply settings (partially done). - * Add desktop preferences dialog. - * Apply side pane icon size correctly. Add basic skeleton for archiver integration. - * Set shortcuts for frequently used menu options. Implement "rename file" support. Hide tabs when there is only one tab left (optional). - * Delete windows properly when they're closed with setAttribute(Qt::WA_DeleteOnClose); Apply settings to windows after clicking OK in the preference dialog. - * Improve preferences dialog. Improve loading/saving of config file. - * Improve preferences dialog. Change base class of SidePane to QWidget. - * Add basic skeleton of preferences dialog options. - * Add -fno-exceptions to compiler flags. - * Fix a crash during updating View menu. - * Sync the state of folder popup menu and main menu bar. - * Implement sort options for main window. - * Fix file sorting options for Fm::FolderMenu. - * Correctly implement browse history and fix crashes. - * Add very simple browse history (back/forward) handling. - * Apply gcc visiblility attributes to export less symbols. - * Correctly handle file rename/overwrite during file operations. - * Exclude unnecessary files from CPack. - * Add COPYING, AUTHORS, and README and add basic CPack support. - * Build libfm-qt as a separate shared library and install haeder files. - * Little fix for desktop item text shadow. - * Add DesktopItemDelegate to draw better desktop icons. - * Add code used to draw desktop wallpapers. - * Improve folder popup menu. - * Add folder popup menu. Some UI polishing. - * Fix a little crash. - * Fix crashes when turning off desktop manager. - * Show popup menu for blank area of folders. - * Do some refactor to make Fm::FolderView cleaner. Add PCManFM::View to do file manager-specific operations. - * Add desktopManagerEnabled dbus property. Little fix for command line descriptions. - * Little fix. - * Little fix for translatable strings. - * Improve desktop management support (wallpaper & icons). - * Replace QCommandLine with glib GOptionContext for command line parsing. * Improve IPC. - * Add command line parsing and basic IPC via dbus. - * Try to use QCommandLine for command line parsing. - * Move application initialization code to PCManFM::Applicaion class. - * Move files for libfm-qt and pcmanfm-qt to separate subdirs. - * Implement cut and copy files to clipboard. - * Add a item delegate to overriding the incredibly small width of text label. Special thanks to razor-qt developers for the hint! - * Make Settings class more complete, add getters and setters. - * Trivial fix. - * Add PCManFM::Settings class for config file loading/saving. Enable dragging of items in Fm::Folderview (Dnd does not fully work yet). - * Add missing files again. - * Add missing files. - * Add the basic skeleton of "ask for rename or overwrite" dialog. - * Polishing file operation dialogs. - * Add a very primitive desktop icons window implementation. - * Add basic skeleton for preferences dialog. - * Put PCManFM specific classes under new namespace PCManFM. - * Implement very primitive and basic file operations and partial clipboard support. - * Fix bugs in Fm::FileLauncher (should not free string returned by DisplayString()). - * Add a combobox to file properties dialog to select default application. - * Implement context menu for places view to remove bookmarks and unmount volumes. Little fixes for mount operation. - * Fully implement GUI for GMountOperation. - * Implement Qt-based GUI for GMountOperation. - * Improve icon theme handling. - * Implement bookmarks menu. - * Update PlacesModel when volumes/mounts/bookmarks change. - * Improve volume mounting APIs. - * Improve internal implementation of Fm::PlacesModel. Add skelaton of file operation progress dialog. - * Handle file selection correctly. - * Improve the file properties dialog. - * Add primitive implementation of properties dialog. * Some UI polishing. - * Use Fm::ProxyFolderModel to do filter and sorting. * Little fix for Fm::IconTheme and Fm::PlacesView/Model. - * Rework Fm::IconTheme, replacing QPixmap with QIcon. Improve Fm::ProxyFolderModel and use it to implement showHidden(). - * Add a more professional about dialog. - * Little fix to ensure glib/GObject and libfm are correctly initialized. - * Use QTabBar + QStackedWidget to replace QTabWidget so we can share the same side pane among all tab pages. - * Slightly improve places view/model. - * Rename to pcmanfm-qt. * Implement tabbed-browsing. * Implement basic skeleton of GMountOperation. * Implement basic skeleton of Fm::PlacesView. - * Handle "returnPressed()" of the path entry. - * Use both of QListView and QTreeView to implement Fm::FolderView. - * Initial import, an attempt to create qt4 support for libfm. diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 5110cb1..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,69 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2) -project(pcmanfm-qt) - -# PcmanFm-Qt Version -set(PCMANFM_QT_VERSION_MAJOR 0) -set(PCMANFM_QT_VERSION_MINOR 13) -set(PCMANFM_QT_VERSION_PATCH 0) - -set(PCMANFM_QT_VERSION ${PCMANFM_QT_VERSION_MAJOR}.${PCMANFM_QT_VERSION_MINOR}.${PCMANFM_QT_VERSION_PATCH}) - -set(QT_MINIMUM_VERSION "5.7.1") -set(LXQTBT_MINIMUM_VERSION "0.5.0") -set(LIBFMQT_MINIMUM_VERSION "5.0.0") - -list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") - -find_package(Qt5Widgets ${QT_MINIMUM_VERSION} REQUIRED) -find_package(Qt5DBus ${QT_MINIMUM_VERSION} REQUIRED) -find_package(Qt5LinguistTools ${QT_MINIMUM_VERSION} REQUIRED) -find_package(Qt5X11Extras ${QT_MINIMUM_VERSION} REQUIRED) -find_package(fm-qt ${LIBFMQT_MINIMUM_VERSION} REQUIRED) -find_package(lxqt-build-tools ${LXQTBT_MINIMUM_VERSION} REQUIRED) - -message(STATUS "Building ${PROJECT_NAME} with Qt ${Qt5Core_VERSION}") - -option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF) -include(GNUInstallDirs) -include(LXQtPreventInSourceBuilds) -include(LXQtConfigVars) -include(LXQtTranslateTs) -include(LXQtTranslateDesktop) -include(LXQtCompilerSettings NO_POLICY_SCOPE) - -set(CMAKE_AUTOMOC TRUE) -set(CMAKE_AUTOUIC ON) -set(CMAKE_INCLUDE_CURRENT_DIR ON) - -add_subdirectory(pcmanfm) - -# manpage for pcmanfm-qt -configure_file( - "${CMAKE_CURRENT_SOURCE_DIR}/pcmanfm-qt.1.in" - "${CMAKE_CURRENT_BINARY_DIR}/pcmanfm-qt.1" - @ONLY -) -install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/pcmanfm-qt.1" - DESTINATION "${CMAKE_INSTALL_MANDIR}/man1" -) - -# add Doxygen support to generate API docs -# References: -# http://majewsky.wordpress.com/2010/08/14/tip-of-the-day-cmake-and-doxygen/ -# http://www.bluequartz.net/projects/EIM_Segmentation/SoftwareDocumentation/html/usewithcmakeproject.html -option(BUILD_DOCUMENTATION "Use Doxygen to create the HTML based API documentation" OFF) -if(BUILD_DOCUMENTATION) - find_package(Doxygen REQUIRED) - configure_file("${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in" "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile" @ONLY) - add_custom_target(doc ALL - ${DOXYGEN_EXECUTABLE} "${CMAKE_CURRENT_BINARY_DIR}/Doxyfile" - WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" - COMMENT "Generating API documentation with Doxygen" VERBATIM - ) - install(DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/docs" DESTINATION "${CMAKE_INSTALL_DOCDIR}") -endif() - -# merged from lxqt-common -add_subdirectory(autostart) -add_subdirectory(config) diff --git a/Doxyfile.in b/Doxyfile.in deleted file mode 100644 index 8378572..0000000 --- a/Doxyfile.in +++ /dev/null @@ -1,1890 +0,0 @@ -# Doxyfile 1.8.4 - -# This file describes the settings to be used by the documentation system -# doxygen (www.doxygen.org) for a project. -# -# All text after a double hash (##) is considered a comment and is placed -# in front of the TAG it is preceding . -# All text after a hash (#) is considered a comment and will be ignored. -# The format is: -# TAG = value [value, ...] -# For lists items can also be appended using: -# TAG + = value [value, ...] -# Values that contain spaces should be placed between quotes (" "). - -#--------------------------------------------------------------------------- -# Project related configuration options -#--------------------------------------------------------------------------- - -# This tag specifies the encoding used for all characters in the config file -# that follow. The default is UTF-8 which is also the encoding used for all -# text before the first occurrence of this tag. Doxygen uses libiconv (or the -# iconv built into libc) for the transcoding. See -# http://www.gnu.org/software/libiconv for the list of possible encodings. - -DOXYFILE_ENCODING = UTF-8 - -# The PROJECT_NAME tag is a single word (or sequence of words) that should -# identify the project. Note that if you do not use Doxywizard you need -# to put quotes around the project name if it contains spaces. - -PROJECT_NAME = "PCManFM-Qt" - -# The PROJECT_NUMBER tag can be used to enter a project or revision number. -# This could be handy for archiving the generated documentation or -# if some version control system is used. - -PROJECT_NUMBER = - -# Using the PROJECT_BRIEF tag one can provide an optional one line description -# for a project that appears at the top of each page and should give viewer -# a quick idea about the purpose of the project. Keep the description short. - -PROJECT_BRIEF = - -# With the PROJECT_LOGO tag one can specify an logo or icon that is -# included in the documentation. The maximum height of the logo should not -# exceed 55 pixels and the maximum width should not exceed 200 pixels. -# Doxygen will copy the logo to the output directory. - -PROJECT_LOGO = - -# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) -# base path where the generated documentation will be put. -# If a relative path is entered, it will be relative to the location -# where doxygen was started. If left blank the current directory will be used. - -OUTPUT_DIRECTORY = @PROJECT_BINARY_DIR@/docs - -# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create -# 4096 sub-directories (in 2 levels) under the output directory of each output -# format and will distribute the generated files over these directories. -# Enabling this option can be useful when feeding doxygen a huge amount of -# source files, where putting all generated files in the same directory would -# otherwise cause performance problems for the file system. - -CREATE_SUBDIRS = NO - -# The OUTPUT_LANGUAGE tag is used to specify the language in which all -# documentation generated by doxygen is written. Doxygen will use this -# information to generate all constant output in the proper language. -# The default language is English, other supported languages are: -# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, -# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, -# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English -# messages), Korean, Korean-en, Latvian, Lithuanian, Norwegian, Macedonian, -# Persian, Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, -# Slovak, Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. - -OUTPUT_LANGUAGE = English - -# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will -# include brief member descriptions after the members that are listed in -# the file and class documentation (similar to JavaDoc). -# Set to NO to disable this. - -BRIEF_MEMBER_DESC = YES - -# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend -# the brief description of a member or function before the detailed description. -# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the -# brief descriptions will be completely suppressed. - -REPEAT_BRIEF = YES - -# This tag implements a quasi-intelligent brief description abbreviator -# that is used to form the text in various listings. Each string -# in this list, if found as the leading text of the brief description, will be -# stripped from the text and the result after processing the whole list, is -# used as the annotated text. Otherwise, the brief description is used as-is. -# If left blank, the following values are used ("$name" is automatically -# replaced with the name of the entity): "The $name class" "The $name widget" -# "The $name file" "is" "provides" "specifies" "contains" -# "represents" "a" "an" "the" - -ABBREVIATE_BRIEF = - -# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then -# Doxygen will generate a detailed section even if there is only a brief -# description. - -ALWAYS_DETAILED_SEC = NO - -# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all -# inherited members of a class in the documentation of that class as if those -# members were ordinary class members. Constructors, destructors and assignment -# operators of the base classes will not be shown. - -INLINE_INHERITED_MEMB = NO - -# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full -# path before files name in the file list and in the header files. If set -# to NO the shortest path that makes the file name unique will be used. - -FULL_PATH_NAMES = NO - -# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag -# can be used to strip a user-defined part of the path. Stripping is -# only done if one of the specified strings matches the left-hand part of -# the path. The tag can be used to show relative paths in the file list. -# If left blank the directory from which doxygen is run is used as the -# path to strip. Note that you specify absolute paths here, but also -# relative paths, which will be relative from the directory where doxygen is -# started. - -STRIP_FROM_PATH = - -# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of -# the path mentioned in the documentation of a class, which tells -# the reader which header file to include in order to use a class. -# If left blank only the name of the header file containing the class -# definition is used. Otherwise one should specify the include paths that -# are normally passed to the compiler using the -I flag. - -STRIP_FROM_INC_PATH = - -# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter -# (but less readable) file names. This can be useful if your file system -# doesn't support long names like on DOS, Mac, or CD-ROM. - -SHORT_NAMES = NO - -# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen -# will interpret the first line (until the first dot) of a JavaDoc-style -# comment as the brief description. If set to NO, the JavaDoc -# comments will behave just like regular Qt-style comments -# (thus requiring an explicit @brief command for a brief description.) - -JAVADOC_AUTOBRIEF = NO - -# If the QT_AUTOBRIEF tag is set to YES then Doxygen will -# interpret the first line (until the first dot) of a Qt-style -# comment as the brief description. If set to NO, the comments -# will behave just like regular Qt-style comments (thus requiring -# an explicit \brief command for a brief description.) - -QT_AUTOBRIEF = NO - -# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen -# treat a multi-line C++ special comment block (i.e. a block of //! or /// -# comments) as a brief description. This used to be the default behaviour. -# The new default is to treat a multi-line C++ comment block as a detailed -# description. Set this tag to YES if you prefer the old behaviour instead. - -MULTILINE_CPP_IS_BRIEF = NO - -# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented -# member inherits the documentation from any documented member that it -# re-implements. - -INHERIT_DOCS = YES - -# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce -# a new page for each member. If set to NO, the documentation of a member will -# be part of the file/class/namespace that contains it. - -SEPARATE_MEMBER_PAGES = NO - -# The TAB_SIZE tag can be used to set the number of spaces in a tab. -# Doxygen uses this value to replace tabs by spaces in code fragments. - -TAB_SIZE = 4 - -# This tag can be used to specify a number of aliases that acts -# as commands in the documentation. An alias has the form "name = value". -# For example adding "sideeffect = \par Side Effects:\n" will allow you to -# put the command \sideeffect (or @sideeffect) in the documentation, which -# will result in a user-defined paragraph with heading "Side Effects:". -# You can put \n's in the value part of an alias to insert newlines. - -ALIASES = - -# This tag can be used to specify a number of word-keyword mappings (TCL only). -# A mapping has the form "name = value". For example adding -# "class = itcl::class" will allow you to use the command class in the -# itcl::class meaning. - -TCL_SUBST = - -# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C -# sources only. Doxygen will then generate output that is more tailored for C. -# For instance, some of the names that are used will be different. The list -# of all members will be omitted, etc. - -OPTIMIZE_OUTPUT_FOR_C = NO - -# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java -# sources only. Doxygen will then generate output that is more tailored for -# Java. For instance, namespaces will be presented as packages, qualified -# scopes will look different, etc. - -OPTIMIZE_OUTPUT_JAVA = NO - -# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran -# sources only. Doxygen will then generate output that is more tailored for -# Fortran. - -OPTIMIZE_FOR_FORTRAN = NO - -# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL -# sources. Doxygen will then generate output that is tailored for -# VHDL. - -OPTIMIZE_OUTPUT_VHDL = NO - -# Doxygen selects the parser to use depending on the extension of the files it -# parses. With this tag you can assign which parser to use for a given -# extension. Doxygen has a built-in mapping, but you can override or extend it -# using this tag. The format is ext = language, where ext is a file extension, -# and language is one of the parsers supported by doxygen: IDL, Java, -# Javascript, CSharp, C, C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, -# C++. For instance to make doxygen treat .inc files as Fortran files (default -# is PHP), and .f files as C (default is Fortran), use: inc = Fortran f = C. Note -# that for custom extensions you also need to set FILE_PATTERNS otherwise the -# files are not read by doxygen. - -EXTENSION_MAPPING = - -# If MARKDOWN_SUPPORT is enabled (the default) then doxygen pre-processes all -# comments according to the Markdown format, which allows for more readable -# documentation. See http://daringfireball.net/projects/markdown/ for details. -# The output of markdown processing is further processed by doxygen, so you -# can mix doxygen, HTML, and XML commands with Markdown formatting. -# Disable only in case of backward compatibilities issues. - -MARKDOWN_SUPPORT = YES - -# When enabled doxygen tries to link words that correspond to documented -# classes, or namespaces to their corresponding documentation. Such a link can -# be prevented in individual cases by by putting a % sign in front of the word -# or globally by setting AUTOLINK_SUPPORT to NO. - -AUTOLINK_SUPPORT = YES - -# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want -# to include (a tag file for) the STL sources as input, then you should -# set this tag to YES in order to let doxygen match functions declarations and -# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. -# func(std::string) {}). This also makes the inheritance and collaboration -# diagrams that involve STL classes more complete and accurate. - -BUILTIN_STL_SUPPORT = NO - -# If you use Microsoft's C++/CLI language, you should set this option to YES to -# enable parsing support. - -CPP_CLI_SUPPORT = NO - -# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. -# Doxygen will parse them like normal C++ but will assume all classes use public -# instead of private inheritance when no explicit protection keyword is present. - -SIP_SUPPORT = NO - -# For Microsoft's IDL there are propget and propput attributes to indicate -# getter and setter methods for a property. Setting this option to YES (the -# default) will make doxygen replace the get and set methods by a property in -# the documentation. This will only work if the methods are indeed getting or -# setting a simple type. If this is not the case, or you want to show the -# methods anyway, you should set this option to NO. - -IDL_PROPERTY_SUPPORT = YES - -# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC -# tag is set to YES, then doxygen will reuse the documentation of the first -# member in the group (if any) for the other members of the group. By default -# all members of a group must be documented explicitly. - -DISTRIBUTE_GROUP_DOC = NO - -# Set the SUBGROUPING tag to YES (the default) to allow class member groups of -# the same type (for instance a group of public functions) to be put as a -# subgroup of that type (e.g. under the Public Functions section). Set it to -# NO to prevent subgrouping. Alternatively, this can be done per class using -# the \nosubgrouping command. - -SUBGROUPING = YES - -# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and -# unions are shown inside the group in which they are included (e.g. using -# @ingroup) instead of on a separate page (for HTML and Man pages) or -# section (for LaTeX and RTF). - -INLINE_GROUPED_CLASSES = NO - -# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and -# unions with only public data fields or simple typedef fields will be shown -# inline in the documentation of the scope in which they are defined (i.e. file, -# namespace, or group documentation), provided this scope is documented. If set -# to NO (the default), structs, classes, and unions are shown on a separate -# page (for HTML and Man pages) or section (for LaTeX and RTF). - -INLINE_SIMPLE_STRUCTS = NO - -# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum -# is documented as struct, union, or enum with the name of the typedef. So -# typedef struct TypeS {} TypeT, will appear in the documentation as a struct -# with name TypeT. When disabled the typedef will appear as a member of a file, -# namespace, or class. And the struct will be named TypeS. This can typically -# be useful for C code in case the coding convention dictates that all compound -# types are typedef'ed and only the typedef is referenced, never the tag name. - -TYPEDEF_HIDES_STRUCT = NO - -# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This -# cache is used to resolve symbols given their name and scope. Since this can -# be an expensive process and often the same symbol appear multiple times in -# the code, doxygen keeps a cache of pre-resolved symbols. If the cache is too -# small doxygen will become slower. If the cache is too large, memory is wasted. -# The cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid -# range is 0..9, the default is 0, corresponding to a cache size of 2^16 = 65536 -# symbols. - -LOOKUP_CACHE_SIZE = 0 - -#--------------------------------------------------------------------------- -# Build related configuration options -#--------------------------------------------------------------------------- - -# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in -# documentation are documented, even if no documentation was available. -# Private class members and static file members will be hidden unless -# the EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES - -EXTRACT_ALL = NO - -# If the EXTRACT_PRIVATE tag is set to YES all private members of a class -# will be included in the documentation. - -EXTRACT_PRIVATE = NO - -# If the EXTRACT_PACKAGE tag is set to YES all members with package or internal -# scope will be included in the documentation. - -EXTRACT_PACKAGE = NO - -# If the EXTRACT_STATIC tag is set to YES all static members of a file -# will be included in the documentation. - -EXTRACT_STATIC = NO - -# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) -# defined locally in source files will be included in the documentation. -# If set to NO only classes defined in header files are included. - -EXTRACT_LOCAL_CLASSES = YES - -# This flag is only useful for Objective-C code. When set to YES local -# methods, which are defined in the implementation section but not in -# the interface are included in the documentation. -# If set to NO (the default) only methods in the interface are included. - -EXTRACT_LOCAL_METHODS = NO - -# If this flag is set to YES, the members of anonymous namespaces will be -# extracted and appear in the documentation as a namespace called -# 'anonymous_namespace{file}', where file will be replaced with the base -# name of the file that contains the anonymous namespace. By default -# anonymous namespaces are hidden. - -EXTRACT_ANON_NSPACES = NO - -# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all -# undocumented members of documented classes, files or namespaces. -# If set to NO (the default) these members will be included in the -# various overviews, but no documentation section is generated. -# This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_MEMBERS = NO - -# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all -# undocumented classes that are normally visible in the class hierarchy. -# If set to NO (the default) these classes will be included in the various -# overviews. This option has no effect if EXTRACT_ALL is enabled. - -HIDE_UNDOC_CLASSES = NO - -# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all -# friend (class|struct|union) declarations. -# If set to NO (the default) these declarations will be included in the -# documentation. - -HIDE_FRIEND_COMPOUNDS = NO - -# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any -# documentation blocks found inside the body of a function. -# If set to NO (the default) these blocks will be appended to the -# function's detailed documentation block. - -HIDE_IN_BODY_DOCS = NO - -# The INTERNAL_DOCS tag determines if documentation -# that is typed after a \internal command is included. If the tag is set -# to NO (the default) then the documentation will be excluded. -# Set it to YES to include the internal documentation. - -INTERNAL_DOCS = NO - -# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate -# file names in lower-case letters. If set to YES upper-case letters are also -# allowed. This is useful if you have classes or files whose names only differ -# in case and if your file system supports case sensitive file names. Windows -# and Mac users are advised to set this option to NO. - -CASE_SENSE_NAMES = YES - -# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen -# will show members with their full class and namespace scopes in the -# documentation. If set to YES the scope will be hidden. - -HIDE_SCOPE_NAMES = NO - -# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen -# will put a list of the files that are included by a file in the documentation -# of that file. - -SHOW_INCLUDE_FILES = YES - -# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen -# will list include files with double quotes in the documentation -# rather than with sharp brackets. - -FORCE_LOCAL_INCLUDES = NO - -# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] -# is inserted in the documentation for inline members. - -INLINE_INFO = YES - -# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen -# will sort the (detailed) documentation of file and class members -# alphabetically by member name. If set to NO the members will appear in -# declaration order. - -SORT_MEMBER_DOCS = YES - -# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the -# brief documentation of file, namespace and class members alphabetically -# by member name. If set to NO (the default) the members will appear in -# declaration order. - -SORT_BRIEF_DOCS = NO - -# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen -# will sort the (brief and detailed) documentation of class members so that -# constructors and destructors are listed first. If set to NO (the default) -# the constructors will appear in the respective orders defined by -# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. -# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO -# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. - -SORT_MEMBERS_CTORS_1ST = NO - -# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the -# hierarchy of group names into alphabetical order. If set to NO (the default) -# the group names will appear in their defined order. - -SORT_GROUP_NAMES = NO - -# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be -# sorted by fully-qualified names, including namespaces. If set to -# NO (the default), the class list will be sorted only by class name, -# not including the namespace part. -# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. -# Note: This option applies only to the class list, not to the -# alphabetical list. - -SORT_BY_SCOPE_NAME = NO - -# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to -# do proper type resolution of all parameters of a function it will reject a -# match between the prototype and the implementation of a member function even -# if there is only one candidate or it is obvious which candidate to choose -# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen -# will still accept a match between prototype and implementation in such cases. - -STRICT_PROTO_MATCHING = NO - -# The GENERATE_TODOLIST tag can be used to enable (YES) or -# disable (NO) the todo list. This list is created by putting \todo -# commands in the documentation. - -GENERATE_TODOLIST = YES - -# The GENERATE_TESTLIST tag can be used to enable (YES) or -# disable (NO) the test list. This list is created by putting \test -# commands in the documentation. - -GENERATE_TESTLIST = YES - -# The GENERATE_BUGLIST tag can be used to enable (YES) or -# disable (NO) the bug list. This list is created by putting \bug -# commands in the documentation. - -GENERATE_BUGLIST = YES - -# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or -# disable (NO) the deprecated list. This list is created by putting -# \deprecated commands in the documentation. - -GENERATE_DEPRECATEDLIST = YES - -# The ENABLED_SECTIONS tag can be used to enable conditional -# documentation sections, marked by \if section-label ... \endif -# and \cond section-label ... \endcond blocks. - -ENABLED_SECTIONS = - -# The MAX_INITIALIZER_LINES tag determines the maximum number of lines -# the initial value of a variable or macro consists of for it to appear in -# the documentation. If the initializer consists of more lines than specified -# here it will be hidden. Use a value of 0 to hide initializers completely. -# The appearance of the initializer of individual variables and macros in the -# documentation can be controlled using \showinitializer or \hideinitializer -# command in the documentation regardless of this setting. - -MAX_INITIALIZER_LINES = 30 - -# Set the SHOW_USED_FILES tag to NO to disable the list of files generated -# at the bottom of the documentation of classes and structs. If set to YES the -# list will mention the files that were used to generate the documentation. - -SHOW_USED_FILES = YES - -# Set the SHOW_FILES tag to NO to disable the generation of the Files page. -# This will remove the Files entry from the Quick Index and from the -# Folder Tree View (if specified). The default is YES. - -SHOW_FILES = YES - -# Set the SHOW_NAMESPACES tag to NO to disable the generation of the -# Namespaces page. -# This will remove the Namespaces entry from the Quick Index -# and from the Folder Tree View (if specified). The default is YES. - -SHOW_NAMESPACES = YES - -# The FILE_VERSION_FILTER tag can be used to specify a program or script that -# doxygen should invoke to get the current version for each file (typically from -# the version control system). Doxygen will invoke the program by executing (via -# popen()) the command , where is the value of -# the FILE_VERSION_FILTER tag, and is the name of an input file -# provided by doxygen. Whatever the program writes to standard output -# is used as the file version. See the manual for examples. - -FILE_VERSION_FILTER = - -# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed -# by doxygen. The layout file controls the global structure of the generated -# output files in an output format independent way. To create the layout file -# that represents doxygen's defaults, run doxygen with the -l option. -# You can optionally specify a file name after the option, if omitted -# DoxygenLayout.xml will be used as the name of the layout file. - -LAYOUT_FILE = - -# The CITE_BIB_FILES tag can be used to specify one or more bib files -# containing the references data. This must be a list of .bib files. The -# .bib extension is automatically appended if omitted. Using this command -# requires the bibtex tool to be installed. See also -# http://en.wikipedia.org/wiki/BibTeX for more info. For LaTeX the style -# of the bibliography can be controlled using LATEX_BIB_STYLE. To use this -# feature you need bibtex and perl available in the search path. Do not use -# file names with spaces, bibtex cannot handle them. - -CITE_BIB_FILES = - -#--------------------------------------------------------------------------- -# configuration options related to warning and progress messages -#--------------------------------------------------------------------------- - -# The QUIET tag can be used to turn on/off the messages that are generated -# by doxygen. Possible values are YES and NO. If left blank NO is used. - -QUIET = NO - -# The WARNINGS tag can be used to turn on/off the warning messages that are -# generated by doxygen. Possible values are YES and NO. If left blank -# NO is used. - -WARNINGS = YES - -# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings -# for undocumented members. If EXTRACT_ALL is set to YES then this flag will -# automatically be disabled. - -WARN_IF_UNDOCUMENTED = YES - -# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for -# potential errors in the documentation, such as not documenting some -# parameters in a documented function, or documenting parameters that -# don't exist or using markup commands wrongly. - -WARN_IF_DOC_ERROR = YES - -# The WARN_NO_PARAMDOC option can be enabled to get warnings for -# functions that are documented, but have no documentation for their parameters -# or return value. If set to NO (the default) doxygen will only warn about -# wrong or incomplete parameter documentation, but not about the absence of -# documentation. - -WARN_NO_PARAMDOC = NO - -# The WARN_FORMAT tag determines the format of the warning messages that -# doxygen can produce. The string should contain the $file, $line, and $text -# tags, which will be replaced by the file and line number from which the -# warning originated and the warning text. Optionally the format may contain -# $version, which will be replaced by the version of the file (if it could -# be obtained via FILE_VERSION_FILTER) - -WARN_FORMAT = "$file:$line: $text" - -# The WARN_LOGFILE tag can be used to specify a file to which warning -# and error messages should be written. If left blank the output is written -# to stderr. - -WARN_LOGFILE = - -#--------------------------------------------------------------------------- -# configuration options related to the input files -#--------------------------------------------------------------------------- - -# The INPUT tag can be used to specify the files and/or directories that contain -# documented source files. You may enter file names like "myfile.cpp" or -# directories like "/usr/src/myproject". Separate the files or directories -# with spaces. - -INPUT = "@PROJECT_SOURCE_DIR@/libfm-qt" "@PROJECT_SOURCE_DIR@/pcmanfm" - -# This tag can be used to specify the character encoding of the source files -# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is -# also the default input encoding. Doxygen uses libiconv (or the iconv built -# into libc) for the transcoding. See http://www.gnu.org/software/libiconv for -# the list of possible encodings. - -INPUT_ENCODING = UTF-8 - -# If the value of the INPUT tag contains directories, you can use the -# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank the following patterns are tested: -# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh -# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py -# *.f90 *.f *.for *.vhd *.vhdl - -FILE_PATTERNS = - -# The RECURSIVE tag can be used to turn specify whether or not subdirectories -# should be searched for input files as well. Possible values are YES and NO. -# If left blank NO is used. - -RECURSIVE = NO - -# The EXCLUDE tag can be used to specify files and/or directories that should be -# excluded from the INPUT source files. This way you can easily exclude a -# subdirectory from a directory tree whose root is specified with the INPUT tag. -# Note that relative paths are relative to the directory from which doxygen is -# run. - -EXCLUDE = - -# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or -# directories that are symbolic links (a Unix file system feature) are excluded -# from the input. - -EXCLUDE_SYMLINKS = NO - -# If the value of the INPUT tag contains directories, you can use the -# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude -# certain files from those directories. Note that the wildcards are matched -# against the file with absolute path, so to exclude all test directories -# for example use the pattern */test/* - -EXCLUDE_PATTERNS = */*_p.h - -# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names -# (namespaces, classes, functions, etc.) that should be excluded from the -# output. The symbol name can be a fully qualified name, a word, or if the -# wildcard * is used, a substring. Examples: ANamespace, AClass, -# AClass::ANamespace, ANamespace::*Test - -EXCLUDE_SYMBOLS = FakeTr _* LibFmQtData - -# The EXAMPLE_PATH tag can be used to specify one or more files or -# directories that contain example code fragments that are included (see -# the \include command). - -EXAMPLE_PATH = - -# If the value of the EXAMPLE_PATH tag contains directories, you can use the -# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp -# and *.h) to filter out the source-files in the directories. If left -# blank all files are included. - -EXAMPLE_PATTERNS = - -# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be -# searched for input files to be used with the \include or \dontinclude -# commands irrespective of the value of the RECURSIVE tag. -# Possible values are YES and NO. If left blank NO is used. - -EXAMPLE_RECURSIVE = NO - -# The IMAGE_PATH tag can be used to specify one or more files or -# directories that contain image that are included in the documentation (see -# the \image command). - -IMAGE_PATH = - -# The INPUT_FILTER tag can be used to specify a program that doxygen should -# invoke to filter for each input file. Doxygen will invoke the filter program -# by executing (via popen()) the command , where -# is the value of the INPUT_FILTER tag, and is the name of an -# input file. Doxygen will then use the output that the filter program writes -# to standard output. -# If FILTER_PATTERNS is specified, this tag will be ignored. -# Note that the filter must not add or remove lines; it is applied before the -# code is scanned, but not when the output code is generated. If lines are added -# or removed, the anchors will not be placed correctly. - -INPUT_FILTER = - -# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern -# basis. -# Doxygen will compare the file name with each pattern and apply the -# filter if there is a match. -# The filters are a list of the form: -# pattern = filter (like *.cpp = my_cpp_filter). See INPUT_FILTER for further -# info on how filters are used. If FILTER_PATTERNS is empty or if -# non of the patterns match the file name, INPUT_FILTER is applied. - -FILTER_PATTERNS = - -# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using -# INPUT_FILTER) will be used to filter the input files when producing source -# files to browse (i.e. when SOURCE_BROWSER is set to YES). - -FILTER_SOURCE_FILES = NO - -# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file -# pattern. A pattern will override the setting for FILTER_PATTERN (if any) -# and it is also possible to disable source filtering for a specific pattern -# using *.ext = (so without naming a filter). This option only has effect when -# FILTER_SOURCE_FILES is enabled. - -FILTER_SOURCE_PATTERNS = - -# If the USE_MD_FILE_AS_MAINPAGE tag refers to the name of a markdown file that -# is part of the input, its contents will be placed on the main page -# (index.html). This can be useful if you have a project on for instance GitHub -# and want reuse the introduction page also for the doxygen output. - -USE_MDFILE_AS_MAINPAGE = - -#--------------------------------------------------------------------------- -# configuration options related to source browsing -#--------------------------------------------------------------------------- - -# If the SOURCE_BROWSER tag is set to YES then a list of source files will -# be generated. Documented entities will be cross-referenced with these sources. -# Note: To get rid of all source code in the generated output, make sure also -# VERBATIM_HEADERS is set to NO. - -SOURCE_BROWSER = NO - -# Setting the INLINE_SOURCES tag to YES will include the body -# of functions and classes directly in the documentation. - -INLINE_SOURCES = NO - -# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct -# doxygen to hide any special comment blocks from generated source code -# fragments. Normal C, C++ and Fortran comments will always remain visible. - -STRIP_CODE_COMMENTS = YES - -# If the REFERENCED_BY_RELATION tag is set to YES -# then for each documented function all documented -# functions referencing it will be listed. - -REFERENCED_BY_RELATION = NO - -# If the REFERENCES_RELATION tag is set to YES -# then for each documented function all documented entities -# called/used by that function will be listed. - -REFERENCES_RELATION = NO - -# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) -# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from -# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will -# link to the source code. -# Otherwise they will link to the documentation. - -REFERENCES_LINK_SOURCE = YES - -# If the USE_HTAGS tag is set to YES then the references to source code -# will point to the HTML generated by the htags(1) tool instead of doxygen -# built-in source browser. The htags tool is part of GNU's global source -# tagging system (see http://www.gnu.org/software/global/global.html). You -# will need version 4.8.6 or higher. - -USE_HTAGS = NO - -# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen -# will generate a verbatim copy of the header file for each class for -# which an include is specified. Set to NO to disable this. - -VERBATIM_HEADERS = YES - -#--------------------------------------------------------------------------- -# configuration options related to the alphabetical class index -#--------------------------------------------------------------------------- - -# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index -# of all compounds will be generated. Enable this if the project -# contains a lot of classes, structs, unions or interfaces. - -ALPHABETICAL_INDEX = YES - -# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then -# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns -# in which this list will be split (can be a number in the range [1..20]) - -COLS_IN_ALPHA_INDEX = 5 - -# In case all classes in a project start with a common prefix, all -# classes will be put under the same header in the alphabetical index. -# The IGNORE_PREFIX tag can be used to specify one or more prefixes that -# should be ignored while generating the index headers. - -IGNORE_PREFIX = - -#--------------------------------------------------------------------------- -# configuration options related to the HTML output -#--------------------------------------------------------------------------- - -# If the GENERATE_HTML tag is set to YES (the default) Doxygen will -# generate HTML output. - -GENERATE_HTML = YES - -# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `html' will be used as the default path. - -HTML_OUTPUT = html - -# The HTML_FILE_EXTENSION tag can be used to specify the file extension for -# each generated HTML page (for example: .htm,.php,.asp). If it is left blank -# doxygen will generate files with .html extension. - -HTML_FILE_EXTENSION = .html - -# The HTML_HEADER tag can be used to specify a personal HTML header for -# each generated HTML page. If it is left blank doxygen will generate a -# standard header. Note that when using a custom header you are responsible -# for the proper inclusion of any scripts and style sheets that doxygen -# needs, which is dependent on the configuration options used. -# It is advised to generate a default header using "doxygen -w html -# header.html footer.html stylesheet.css YourConfigFile" and then modify -# that header. Note that the header is subject to change so you typically -# have to redo this when upgrading to a newer version of doxygen or when -# changing the value of configuration settings such as GENERATE_TREEVIEW! - -HTML_HEADER = - -# The HTML_FOOTER tag can be used to specify a personal HTML footer for -# each generated HTML page. If it is left blank doxygen will generate a -# standard footer. - -HTML_FOOTER = - -# The HTML_STYLESHEET tag can be used to specify a user-defined cascading -# style sheet that is used by each HTML page. It can be used to -# fine-tune the look of the HTML output. If left blank doxygen will -# generate a default style sheet. Note that it is recommended to use -# HTML_EXTRA_STYLESHEET instead of this one, as it is more robust and this -# tag will in the future become obsolete. - -HTML_STYLESHEET = - -# The HTML_EXTRA_STYLESHEET tag can be used to specify an additional -# user-defined cascading style sheet that is included after the standard -# style sheets created by doxygen. Using this option one can overrule -# certain style aspects. This is preferred over using HTML_STYLESHEET -# since it does not replace the standard style sheet and is therefor more -# robust against future updates. Doxygen will copy the style sheet file to -# the output directory. - -HTML_EXTRA_STYLESHEET = - -# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or -# other source files which should be copied to the HTML output directory. Note -# that these files will be copied to the base HTML output directory. Use the -# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these -# files. In the HTML_STYLESHEET file, use the file name only. Also note that -# the files will be copied as-is; there are no commands or markers available. - -HTML_EXTRA_FILES = - -# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. -# Doxygen will adjust the colors in the style sheet and background images -# according to this color. Hue is specified as an angle on a colorwheel, -# see http://en.wikipedia.org/wiki/Hue for more information. -# For instance the value 0 represents red, 60 is yellow, 120 is green, -# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. -# The allowed range is 0 to 359. - -HTML_COLORSTYLE_HUE = 220 - -# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of -# the colors in the HTML output. For a value of 0 the output will use -# grayscales only. A value of 255 will produce the most vivid colors. - -HTML_COLORSTYLE_SAT = 100 - -# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to -# the luminance component of the colors in the HTML output. Values below -# 100 gradually make the output lighter, whereas values above 100 make -# the output darker. The value divided by 100 is the actual gamma applied, -# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, -# and 100 does not change the gamma. - -HTML_COLORSTYLE_GAMMA = 80 - -# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML -# page will contain the date and time when the page was generated. Setting -# this to NO can help when comparing the output of multiple runs. - -HTML_TIMESTAMP = YES - -# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML -# documentation will contain sections that can be hidden and shown after the -# page has loaded. - -HTML_DYNAMIC_SECTIONS = NO - -# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of -# entries shown in the various tree structured indices initially; the user -# can expand and collapse entries dynamically later on. Doxygen will expand -# the tree to such a level that at most the specified number of entries are -# visible (unless a fully collapsed tree already exceeds this amount). -# So setting the number of entries 1 will produce a full collapsed tree by -# default. 0 is a special value representing an infinite number of entries -# and will result in a full expanded tree by default. - -HTML_INDEX_NUM_ENTRIES = 100 - -# If the GENERATE_DOCSET tag is set to YES, additional index files -# will be generated that can be used as input for Apple's Xcode 3 -# integrated development environment, introduced with OSX 10.5 (Leopard). -# To create a documentation set, doxygen will generate a Makefile in the -# HTML output directory. Running make will produce the docset in that -# directory and running "make install" will install the docset in -# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find -# it at startup. -# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html -# for more information. - -GENERATE_DOCSET = NO - -# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the -# feed. A documentation feed provides an umbrella under which multiple -# documentation sets from a single provider (such as a company or product suite) -# can be grouped. - -DOCSET_FEEDNAME = "Doxygen generated docs" - -# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that -# should uniquely identify the documentation set bundle. This should be a -# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen -# will append .docset to the name. - -DOCSET_BUNDLE_ID = org.doxygen.Project - -# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely -# identify the documentation publisher. This should be a reverse domain-name -# style string, e.g. com.mycompany.MyDocSet.documentation. - -DOCSET_PUBLISHER_ID = org.doxygen.Publisher - -# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. - -DOCSET_PUBLISHER_NAME = Publisher - -# If the GENERATE_HTMLHELP tag is set to YES, additional index files -# will be generated that can be used as input for tools like the -# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) -# of the generated HTML documentation. - -GENERATE_HTMLHELP = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can -# be used to specify the file name of the resulting .chm file. You -# can add a path in front of the file if the result should not be -# written to the html output directory. - -CHM_FILE = - -# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can -# be used to specify the location (absolute path including file name) of -# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run -# the HTML help compiler on the generated index.hhp. - -HHC_LOCATION = - -# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag -# controls if a separate .chi index file is generated (YES) or that -# it should be included in the master .chm file (NO). - -GENERATE_CHI = NO - -# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING -# is used to encode HtmlHelp index (hhk), content (hhc) and project file -# content. - -CHM_INDEX_ENCODING = - -# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag -# controls whether a binary table of contents is generated (YES) or a -# normal table of contents (NO) in the .chm file. - -BINARY_TOC = NO - -# The TOC_EXPAND flag can be set to YES to add extra items for group members -# to the contents of the HTML help documentation and to the tree view. - -TOC_EXPAND = NO - -# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and -# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated -# that can be used as input for Qt's qhelpgenerator to generate a -# Qt Compressed Help (.qch) of the generated HTML documentation. - -GENERATE_QHP = NO - -# If the QHG_LOCATION tag is specified, the QCH_FILE tag can -# be used to specify the file name of the resulting .qch file. -# The path specified is relative to the HTML output folder. - -QCH_FILE = - -# The QHP_NAMESPACE tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#namespace - -QHP_NAMESPACE = org.doxygen.Project - -# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating -# Qt Help Project output. For more information please see -# http://doc.trolltech.com/qthelpproject.html#virtual-folders - -QHP_VIRTUAL_FOLDER = doc - -# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to -# add. For more information please see -# http://doc.trolltech.com/qthelpproject.html#custom-filters - -QHP_CUST_FILTER_NAME = - -# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the -# custom filter to add. For more information please see -# -# Qt Help Project / Custom Filters. - -QHP_CUST_FILTER_ATTRS = - -# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this -# project's -# filter section matches. -# -# Qt Help Project / Filter Attributes. - -QHP_SECT_FILTER_ATTRS = - -# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can -# be used to specify the location of Qt's qhelpgenerator. -# If non-empty doxygen will try to run qhelpgenerator on the generated -# .qhp file. - -QHG_LOCATION = - -# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files -# will be generated, which together with the HTML files, form an Eclipse help -# plugin. To install this plugin and make it available under the help contents -# menu in Eclipse, the contents of the directory containing the HTML and XML -# files needs to be copied into the plugins directory of eclipse. The name of -# the directory within the plugins directory should be the same as -# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before -# the help appears. - -GENERATE_ECLIPSEHELP = NO - -# A unique identifier for the eclipse help plugin. When installing the plugin -# the directory name containing the HTML and XML files should also have -# this name. - -ECLIPSE_DOC_ID = org.doxygen.Project - -# The DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) -# at top of each HTML page. The value NO (the default) enables the index and -# the value YES disables it. Since the tabs have the same information as the -# navigation tree you can set this option to NO if you already set -# GENERATE_TREEVIEW to YES. - -DISABLE_INDEX = NO - -# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index -# structure should be generated to display hierarchical information. -# If the tag value is set to YES, a side panel will be generated -# containing a tree-like index structure (just like the one that -# is generated for HTML Help). For this to work a browser that supports -# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). -# Windows users are probably better off using the HTML help feature. -# Since the tree basically has the same information as the tab index you -# could consider to set DISABLE_INDEX to NO when enabling this option. - -GENERATE_TREEVIEW = NO - -# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values -# (range [0,1..20]) that doxygen will group on one line in the generated HTML -# documentation. Note that a value of 0 will completely suppress the enum -# values from appearing in the overview section. - -ENUM_VALUES_PER_LINE = 4 - -# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be -# used to set the initial width (in pixels) of the frame in which the tree -# is shown. - -TREEVIEW_WIDTH = 250 - -# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open -# links to external symbols imported via tag files in a separate window. - -EXT_LINKS_IN_WINDOW = NO - -# Use this tag to change the font size of Latex formulas included -# as images in the HTML documentation. The default is 10. Note that -# when you change the font size after a successful doxygen run you need -# to manually remove any form_*.png images from the HTML output directory -# to force them to be regenerated. - -FORMULA_FONTSIZE = 10 - -# Use the FORMULA_TRANPARENT tag to determine whether or not the images -# generated for formulas are transparent PNGs. Transparent PNGs are -# not supported properly for IE 6.0, but are supported on all modern browsers. -# Note that when changing this option you need to delete any form_*.png files -# in the HTML output before the changes have effect. - -FORMULA_TRANSPARENT = YES - -# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax -# (see http://www.mathjax.org) which uses client side Javascript for the -# rendering instead of using prerendered bitmaps. Use this if you do not -# have LaTeX installed or if you want to formulas look prettier in the HTML -# output. When enabled you may also need to install MathJax separately and -# configure the path to it using the MATHJAX_RELPATH option. - -USE_MATHJAX = NO - -# When MathJax is enabled you can set the default output format to be used for -# the MathJax output. Supported types are HTML-CSS, NativeMML (i.e. MathML) and -# SVG. The default value is HTML-CSS, which is slower, but has the best -# compatibility. - -MATHJAX_FORMAT = HTML-CSS - -# When MathJax is enabled you need to specify the location relative to the -# HTML output directory using the MATHJAX_RELPATH option. The destination -# directory should contain the MathJax.js script. For instance, if the mathjax -# directory is located at the same level as the HTML output directory, then -# MATHJAX_RELPATH should be ../mathjax. The default value points to -# the MathJax Content Delivery Network so you can quickly see the result without -# installing MathJax. -# However, it is strongly recommended to install a local -# copy of MathJax from http://www.mathjax.org before deployment. - -MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest - -# The MATHJAX_EXTENSIONS tag can be used to specify one or MathJax extension -# names that should be enabled during MathJax rendering. - -MATHJAX_EXTENSIONS = - -# The MATHJAX_CODEFILE tag can be used to specify a file with javascript -# pieces of code that will be used on startup of the MathJax code. - -MATHJAX_CODEFILE = - -# When the SEARCHENGINE tag is enabled doxygen will generate a search box -# for the HTML output. The underlying search engine uses javascript -# and DHTML and should work on any modern browser. Note that when using -# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets -# (GENERATE_DOCSET) there is already a search function so this one should -# typically be disabled. For large projects the javascript based search engine -# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. - -SEARCHENGINE = YES - -# When the SERVER_BASED_SEARCH tag is enabled the search engine will be -# implemented using a web server instead of a web client using Javascript. -# There are two flavours of web server based search depending on the -# EXTERNAL_SEARCH setting. When disabled, doxygen will generate a PHP script for -# searching and an index file used by the script. When EXTERNAL_SEARCH is -# enabled the indexing and searching needs to be provided by external tools. -# See the manual for details. - -SERVER_BASED_SEARCH = NO - -# When EXTERNAL_SEARCH is enabled doxygen will no longer generate the PHP -# script for searching. Instead the search results are written to an XML file -# which needs to be processed by an external indexer. Doxygen will invoke an -# external search engine pointed to by the SEARCHENGINE_URL option to obtain -# the search results. Doxygen ships with an example indexer (doxyindexer) and -# search engine (doxysearch.cgi) which are based on the open source search -# engine library Xapian. See the manual for configuration details. - -EXTERNAL_SEARCH = NO - -# The SEARCHENGINE_URL should point to a search engine hosted by a web server -# which will returned the search results when EXTERNAL_SEARCH is enabled. -# Doxygen ships with an example search engine (doxysearch) which is based on -# the open source search engine library Xapian. See the manual for configuration -# details. - -SEARCHENGINE_URL = - -# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed -# search data is written to a file for indexing by an external tool. With the -# SEARCHDATA_FILE tag the name of this file can be specified. - -SEARCHDATA_FILE = searchdata.xml - -# When SERVER_BASED_SEARCH AND EXTERNAL_SEARCH are both enabled the -# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is -# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple -# projects and redirect the results back to the right project. - -EXTERNAL_SEARCH_ID = - -# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen -# projects other than the one defined by this configuration file, but that are -# all added to the same external search index. Each project needs to have a -# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id -# of to a relative location where the documentation can be found. -# The format is: EXTRA_SEARCH_MAPPINGS = id1 = loc1 id2 = loc2 ... - -EXTRA_SEARCH_MAPPINGS = - -#--------------------------------------------------------------------------- -# configuration options related to the LaTeX output -#--------------------------------------------------------------------------- - -# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will -# generate Latex output. - -GENERATE_LATEX = NO - -# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `latex' will be used as the default path. - -LATEX_OUTPUT = latex - -# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be -# invoked. If left blank `latex' will be used as the default command name. -# Note that when enabling USE_PDFLATEX this option is only used for -# generating bitmaps for formulas in the HTML output, but not in the -# Makefile that is written to the output directory. - -LATEX_CMD_NAME = latex - -# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to -# generate index for LaTeX. If left blank `makeindex' will be used as the -# default command name. - -MAKEINDEX_CMD_NAME = makeindex - -# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact -# LaTeX documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_LATEX = NO - -# The PAPER_TYPE tag can be used to set the paper type that is used -# by the printer. Possible values are: a4, letter, legal and -# executive. If left blank a4 will be used. - -PAPER_TYPE = a4 - -# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX -# packages that should be included in the LaTeX output. - -EXTRA_PACKAGES = - -# The LATEX_HEADER tag can be used to specify a personal LaTeX header for -# the generated latex document. The header should contain everything until -# the first chapter. If it is left blank doxygen will generate a -# standard header. Notice: only use this tag if you know what you are doing! - -LATEX_HEADER = - -# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for -# the generated latex document. The footer should contain everything after -# the last chapter. If it is left blank doxygen will generate a -# standard footer. Notice: only use this tag if you know what you are doing! - -LATEX_FOOTER = - -# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images -# or other source files which should be copied to the LaTeX output directory. -# Note that the files will be copied as-is; there are no commands or markers -# available. - -LATEX_EXTRA_FILES = - -# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated -# is prepared for conversion to pdf (using ps2pdf). The pdf file will -# contain links (just like the HTML output) instead of page references -# This makes the output suitable for online browsing using a pdf viewer. - -PDF_HYPERLINKS = YES - -# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of -# plain latex in the generated Makefile. Set this option to YES to get a -# higher quality PDF documentation. - -USE_PDFLATEX = YES - -# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. -# command to the generated LaTeX files. This will instruct LaTeX to keep -# running if errors occur, instead of asking the user for help. -# This option is also used when generating formulas in HTML. - -LATEX_BATCHMODE = NO - -# If LATEX_HIDE_INDICES is set to YES then doxygen will not -# include the index chapters (such as File Index, Compound Index, etc.) -# in the output. - -LATEX_HIDE_INDICES = NO - -# If LATEX_SOURCE_CODE is set to YES then doxygen will include -# source code with syntax highlighting in the LaTeX output. -# Note that which sources are shown also depends on other settings -# such as SOURCE_BROWSER. - -LATEX_SOURCE_CODE = NO - -# The LATEX_BIB_STYLE tag can be used to specify the style to use for the -# bibliography, e.g. plainnat, or ieeetr. The default style is "plain". See -# http://en.wikipedia.org/wiki/BibTeX for more info. - -LATEX_BIB_STYLE = plain - -#--------------------------------------------------------------------------- -# configuration options related to the RTF output -#--------------------------------------------------------------------------- - -# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output -# The RTF output is optimized for Word 97 and may not look very pretty with -# other RTF readers or editors. - -GENERATE_RTF = NO - -# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `rtf' will be used as the default path. - -RTF_OUTPUT = rtf - -# If the COMPACT_RTF tag is set to YES Doxygen generates more compact -# RTF documents. This may be useful for small projects and may help to -# save some trees in general. - -COMPACT_RTF = NO - -# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated -# will contain hyperlink fields. The RTF file will -# contain links (just like the HTML output) instead of page references. -# This makes the output suitable for online browsing using WORD or other -# programs which support those fields. -# Note: wordpad (write) and others do not support links. - -RTF_HYPERLINKS = NO - -# Load style sheet definitions from file. Syntax is similar to doxygen's -# config file, i.e. a series of assignments. You only have to provide -# replacements, missing definitions are set to their default value. - -RTF_STYLESHEET_FILE = - -# Set optional variables used in the generation of an rtf document. -# Syntax is similar to doxygen's config file. - -RTF_EXTENSIONS_FILE = - -#--------------------------------------------------------------------------- -# configuration options related to the man page output -#--------------------------------------------------------------------------- - -# If the GENERATE_MAN tag is set to YES (the default) Doxygen will -# generate man pages - -GENERATE_MAN = NO - -# The MAN_OUTPUT tag is used to specify where the man pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `man' will be used as the default path. - -MAN_OUTPUT = man - -# The MAN_EXTENSION tag determines the extension that is added to -# the generated man pages (default is the subroutine's section .3) - -MAN_EXTENSION = .3 - -# If the MAN_LINKS tag is set to YES and Doxygen generates man output, -# then it will generate one additional man file for each entity -# documented in the real man page(s). These additional files -# only source the real man page, but without them the man command -# would be unable to find the correct page. The default is NO. - -MAN_LINKS = NO - -#--------------------------------------------------------------------------- -# configuration options related to the XML output -#--------------------------------------------------------------------------- - -# If the GENERATE_XML tag is set to YES Doxygen will -# generate an XML file that captures the structure of -# the code including all documentation. - -GENERATE_XML = NO - -# The XML_OUTPUT tag is used to specify where the XML pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be -# put in front of it. If left blank `xml' will be used as the default path. - -XML_OUTPUT = xml - -# The XML_SCHEMA tag can be used to specify an XML schema, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_SCHEMA = - -# The XML_DTD tag can be used to specify an XML DTD, -# which can be used by a validating XML parser to check the -# syntax of the XML files. - -XML_DTD = - -# If the XML_PROGRAMLISTING tag is set to YES Doxygen will -# dump the program listings (including syntax highlighting -# and cross-referencing information) to the XML output. Note that -# enabling this will significantly increase the size of the XML output. - -XML_PROGRAMLISTING = YES - -#--------------------------------------------------------------------------- -# configuration options related to the DOCBOOK output -#--------------------------------------------------------------------------- - -# If the GENERATE_DOCBOOK tag is set to YES Doxygen will generate DOCBOOK files -# that can be used to generate PDF. - -GENERATE_DOCBOOK = NO - -# The DOCBOOK_OUTPUT tag is used to specify where the DOCBOOK pages will be put. -# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in -# front of it. If left blank docbook will be used as the default path. - -DOCBOOK_OUTPUT = docbook - -#--------------------------------------------------------------------------- -# configuration options for the AutoGen Definitions output -#--------------------------------------------------------------------------- - -# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will -# generate an AutoGen Definitions (see autogen.sf.net) file -# that captures the structure of the code including all -# documentation. Note that this feature is still experimental -# and incomplete at the moment. - -GENERATE_AUTOGEN_DEF = NO - -#--------------------------------------------------------------------------- -# configuration options related to the Perl module output -#--------------------------------------------------------------------------- - -# If the GENERATE_PERLMOD tag is set to YES Doxygen will -# generate a Perl module file that captures the structure of -# the code including all documentation. Note that this -# feature is still experimental and incomplete at the -# moment. - -GENERATE_PERLMOD = NO - -# If the PERLMOD_LATEX tag is set to YES Doxygen will generate -# the necessary Makefile rules, Perl scripts and LaTeX code to be able -# to generate PDF and DVI output from the Perl module output. - -PERLMOD_LATEX = NO - -# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be -# nicely formatted so it can be parsed by a human reader. -# This is useful -# if you want to understand what is going on. -# On the other hand, if this -# tag is set to NO the size of the Perl module output will be much smaller -# and Perl will parse it just the same. - -PERLMOD_PRETTY = YES - -# The names of the make variables in the generated doxyrules.make file -# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. -# This is useful so different doxyrules.make files included by the same -# Makefile don't overwrite each other's variables. - -PERLMOD_MAKEVAR_PREFIX = - -#--------------------------------------------------------------------------- -# Configuration options related to the preprocessor -#--------------------------------------------------------------------------- - -# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will -# evaluate all C-preprocessor directives found in the sources and include -# files. - -ENABLE_PREPROCESSING = YES - -# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro -# names in the source code. If set to NO (the default) only conditional -# compilation will be performed. Macro expansion can be done in a controlled -# way by setting EXPAND_ONLY_PREDEF to YES. - -MACRO_EXPANSION = NO - -# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES -# then the macro expansion is limited to the macros specified with the -# PREDEFINED and EXPAND_AS_DEFINED tags. - -EXPAND_ONLY_PREDEF = NO - -# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files -# pointed to by INCLUDE_PATH will be searched when a #include is found. - -SEARCH_INCLUDES = YES - -# The INCLUDE_PATH tag can be used to specify one or more directories that -# contain include files that are not input files but should be processed by -# the preprocessor. - -INCLUDE_PATH = - -# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard -# patterns (like *.h and *.hpp) to filter out the header-files in the -# directories. If left blank, the patterns specified with FILE_PATTERNS will -# be used. - -INCLUDE_FILE_PATTERNS = - -# The PREDEFINED tag can be used to specify one or more macro names that -# are defined before the preprocessor is started (similar to the -D option of -# gcc). The argument of the tag is a list of macros of the form: name -# or name = definition (no spaces). If the definition and the = are -# omitted = 1 is assumed. To prevent a macro definition from being -# undefined via #undef or recursively expanded use the : = operator -# instead of the = operator. - -PREDEFINED = - -# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then -# this tag can be used to specify a list of macro names that should be expanded. -# The macro definition that is found in the sources will be used. -# Use the PREDEFINED tag if you want to use a different macro definition that -# overrules the definition found in the source code. - -EXPAND_AS_DEFINED = - -# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then -# doxygen's preprocessor will remove all references to function-like macros -# that are alone on a line, have an all uppercase name, and do not end with a -# semicolon, because these will confuse the parser if not removed. - -SKIP_FUNCTION_MACROS = YES - -#--------------------------------------------------------------------------- -# Configuration::additions related to external references -#--------------------------------------------------------------------------- - -# The TAGFILES option can be used to specify one or more tagfiles. For each -# tag file the location of the external documentation should be added. The -# format of a tag file without this location is as follows: -# -# TAGFILES = file1 file2 ... -# Adding location for the tag files is done as follows: -# -# TAGFILES = file1 = loc1 "file2 = loc2" ... -# where "loc1" and "loc2" can be relative or absolute paths -# or URLs. Note that each tag file must have a unique name (where the name does -# NOT include the path). If a tag file is not located in the directory in which -# doxygen is run, you must also specify the path to the tagfile here. - -TAGFILES = - -# When a file name is specified after GENERATE_TAGFILE, doxygen will create -# a tag file that is based on the input files it reads. - -GENERATE_TAGFILE = - -# If the ALLEXTERNALS tag is set to YES all external classes will be listed -# in the class index. If set to NO only the inherited external classes -# will be listed. - -ALLEXTERNALS = NO - -# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed -# in the modules index. If set to NO, only the current project's groups will -# be listed. - -EXTERNAL_GROUPS = YES - -# If the EXTERNAL_PAGES tag is set to YES all external pages will be listed -# in the related pages index. If set to NO, only the current project's -# pages will be listed. - -EXTERNAL_PAGES = YES - -# The PERL_PATH should be the absolute path and name of the perl script -# interpreter (i.e. the result of `which perl'). - -PERL_PATH = /usr/bin/perl - -#--------------------------------------------------------------------------- -# Configuration options related to the dot tool -#--------------------------------------------------------------------------- - -# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will -# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base -# or super classes. Setting the tag to NO turns the diagrams off. Note that -# this option also works with HAVE_DOT disabled, but it is recommended to -# install and use dot, since it yields more powerful graphs. - -CLASS_DIAGRAMS = YES - -# You can define message sequence charts within doxygen comments using the \msc -# command. Doxygen will then run the mscgen tool (see -# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the -# documentation. The MSCGEN_PATH tag allows you to specify the directory where -# the mscgen tool resides. If left empty the tool is assumed to be found in the -# default search path. - -MSCGEN_PATH = - -# If set to YES, the inheritance and collaboration graphs will hide -# inheritance and usage relations if the target is undocumented -# or is not a class. - -HIDE_UNDOC_RELATIONS = YES - -# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is -# available from the path. This tool is part of Graphviz, a graph visualization -# toolkit from AT&T and Lucent Bell Labs. The other options in this section -# have no effect if this option is set to NO (the default) - -HAVE_DOT = NO - -# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is -# allowed to run in parallel. When set to 0 (the default) doxygen will -# base this on the number of processors available in the system. You can set it -# explicitly to a value larger than 0 to get control over the balance -# between CPU load and processing speed. - -DOT_NUM_THREADS = 0 - -# By default doxygen will use the Helvetica font for all dot files that -# doxygen generates. When you want a differently looking font you can specify -# the font name using DOT_FONTNAME. You need to make sure dot is able to find -# the font, which can be done by putting it in a standard location or by setting -# the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the -# directory containing the font. - -DOT_FONTNAME = Helvetica - -# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. -# The default size is 10pt. - -DOT_FONTSIZE = 10 - -# By default doxygen will tell dot to use the Helvetica font. -# If you specify a different font using DOT_FONTNAME you can use DOT_FONTPATH to -# set the path where dot can find it. - -DOT_FONTPATH = - -# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect inheritance relations. Setting this tag to YES will force the -# CLASS_DIAGRAMS tag to NO. - -CLASS_GRAPH = YES - -# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for each documented class showing the direct and -# indirect implementation dependencies (inheritance, containment, and -# class references variables) of the class with other documented classes. - -COLLABORATION_GRAPH = YES - -# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen -# will generate a graph for groups, showing the direct groups dependencies - -GROUP_GRAPHS = YES - -# If the UML_LOOK tag is set to YES doxygen will generate inheritance and -# collaboration diagrams in a style similar to the OMG's Unified Modeling -# Language. - -UML_LOOK = NO - -# If the UML_LOOK tag is enabled, the fields and methods are shown inside -# the class node. If there are many fields or methods and many nodes the -# graph may become too big to be useful. The UML_LIMIT_NUM_FIELDS -# threshold limits the number of items for each type to make the size more -# manageable. Set this to 0 for no limit. Note that the threshold may be -# exceeded by 50% before the limit is enforced. - -UML_LIMIT_NUM_FIELDS = 10 - -# If set to YES, the inheritance and collaboration graphs will show the -# relations between templates and their instances. - -TEMPLATE_RELATIONS = NO - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT -# tags are set to YES then doxygen will generate a graph for each documented -# file showing the direct and indirect include dependencies of the file with -# other documented files. - -INCLUDE_GRAPH = YES - -# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and -# HAVE_DOT tags are set to YES then doxygen will generate a graph for each -# documented header file showing the documented files that directly or -# indirectly include this file. - -INCLUDED_BY_GRAPH = YES - -# If the CALL_GRAPH and HAVE_DOT options are set to YES then -# doxygen will generate a call dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable call graphs -# for selected functions only using the \callgraph command. - -CALL_GRAPH = NO - -# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then -# doxygen will generate a caller dependency graph for every global function -# or class method. Note that enabling this option will significantly increase -# the time of a run. So in most cases it will be better to enable caller -# graphs for selected functions only using the \callergraph command. - -CALLER_GRAPH = NO - -# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen -# will generate a graphical hierarchy of all classes instead of a textual one. - -GRAPHICAL_HIERARCHY = YES - -# If the DIRECTORY_GRAPH and HAVE_DOT tags are set to YES -# then doxygen will show the dependencies a directory has on other directories -# in a graphical way. The dependency relations are determined by the #include -# relations between the files in the directories. - -DIRECTORY_GRAPH = YES - -# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images -# generated by dot. Possible values are svg, png, jpg, or gif. -# If left blank png will be used. If you choose svg you need to set -# HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible in IE 9+ (other browsers do not have this requirement). - -DOT_IMAGE_FORMAT = png - -# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to -# enable generation of interactive SVG images that allow zooming and panning. -# Note that this requires a modern browser other than Internet Explorer. -# Tested and working are Firefox, Chrome, Safari, and Opera. For IE 9+ you -# need to set HTML_FILE_EXTENSION to xhtml in order to make the SVG files -# visible. Older versions of IE do not have SVG support. - -INTERACTIVE_SVG = NO - -# The tag DOT_PATH can be used to specify the path where the dot tool can be -# found. If left blank, it is assumed the dot tool can be found in the path. - -DOT_PATH = - -# The DOTFILE_DIRS tag can be used to specify one or more directories that -# contain dot files that are included in the documentation (see the -# \dotfile command). - -DOTFILE_DIRS = - -# The MSCFILE_DIRS tag can be used to specify one or more directories that -# contain msc files that are included in the documentation (see the -# \mscfile command). - -MSCFILE_DIRS = - -# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of -# nodes that will be shown in the graph. If the number of nodes in a graph -# becomes larger than this value, doxygen will truncate the graph, which is -# visualized by representing a node as a red box. Note that doxygen if the -# number of direct children of the root node in a graph is already larger than -# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note -# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. - -DOT_GRAPH_MAX_NODES = 50 - -# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the -# graphs generated by dot. A depth value of 3 means that only nodes reachable -# from the root by following a path via at most 3 edges will be shown. Nodes -# that lay further from the root node will be omitted. Note that setting this -# option to 1 or 2 may greatly reduce the computation time needed for large -# code bases. Also note that the size of a graph can be further restricted by -# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. - -MAX_DOT_GRAPH_DEPTH = 0 - -# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent -# background. This is disabled by default, because dot on Windows does not -# seem to support this out of the box. Warning: Depending on the platform used, -# enabling this option may lead to badly anti-aliased labels on the edges of -# a graph (i.e. they become hard to read). - -DOT_TRANSPARENT = NO - -# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output -# files in one run (i.e. multiple -o and -T options on the command line). This -# makes dot run faster, but since only newer versions of dot (>1.8.10) -# support this, this feature is disabled by default. - -DOT_MULTI_TARGETS = YES - -# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will -# generate a legend page explaining the meaning of the various boxes and -# arrows in the dot generated graphs. - -GENERATE_LEGEND = YES - -# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will -# remove the intermediate dot files that are used to generate -# the various graphs. - -DOT_CLEANUP = YES diff --git a/LICENSE b/LICENSE deleted file mode 100644 index d8cf7d4..0000000 --- a/LICENSE +++ /dev/null @@ -1,280 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS diff --git a/README.md b/README.md deleted file mode 100644 index 6040939..0000000 --- a/README.md +++ /dev/null @@ -1,62 +0,0 @@ -# PCManFM-Qt - -## Overview - -PCManFM-Qt is the Qt port of PCManFM, the file manager of [LXDE](https://lxde.org). - -In LXQt sessions it is in addition used to handle the desktop. Nevertheless it -can be used independently of LXQt as well. - -PCManFM-Qt is licensed under the terms of the -[GPLv2](https://www.gnu.org/licenses/gpl-2.0.en.html) or any later version. See -file LICENSE for its full text. - -## Installation - -### Compiling source code - -Runtime dependencies are qtx11extras, lxmenu-data, -[liblxqt](https://github.com/lxqt/liblxqt) and -[libfm-qt](https://github.com/lxqt/libfm-qt). -Additional build dependencies are CMake and optionally Git to pull latest VCS -checkouts. The localization files were outsourced to repository -[lxqt-l10n](https://github.com/lxqt/lxqt-l10n) so the corresponding dependencies -are needed, too. Please refer to this repository's `README.md` for further information. - -Code configuration is handled by CMake. CMake variable `CMAKE_INSTALL_PREFIX` -has to be set to `/usr` on most operating systems, depending on the way library -paths are dealt with on 64bit systems variables like `CMAKE_INSTALL_LIBDIR` may -have to be set as well. - -To build run `make`, to install `make install` which accepts variable `DESTDIR` -as usual. - -### Binary packages - -Official binary packages are available in Arch Linux, Debian (as of Debian stretch), -Fedora (version 0.10.0 only so far) and openSUSE (Leap 42.1 and Tumbleweed). - -## Usage - -The file manager functionality should be self-explanatory, handling of the -desktop deserves some notes: - -To handle the desktop binary `pcmanfm-qt` has to be launched with switch -`--desktop` set. Optionally switch `--profile` can be used to safe settings -specific to certain session types like the different desktop environments. -In LXQt sessions, PCManFM-Qt is launched with theses switches set as -[LXQt Module](https://github.com/lxqt/lxqt-session#lxqt-modules). - -To configure the desktop there's a dialogue "Desktop Preferences". Technically -it corresponds with launching `pcmanfm-qt` with switch `--desktop-pref` set. It -is available in the desktop's context menu and included as topic "Desktop" in -sub-menu Preferences - LXQt settings of the panel's main menu as well as the -[Configuration Center](https://github.com/lxqt/lxqt-config#configuration-center) -of lxqt-config. - -All switches (command line options) mentioned above are explained in detail in -`man 1 pcmanfm-qt`. - -## Development - -Issues should go to the tracker of PCManFM-Qt at https://github.com/lxqt/pcmanfm-qt/issues. diff --git a/autostart/CMakeLists.txt b/autostart/CMakeLists.txt deleted file mode 100644 index 5f596a5..0000000 --- a/autostart/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR) - -file(GLOB DESKTOP_FILES_IN *.desktop.in) - -# Translations ********************************** -lxqt_translate_desktop(DESKTOP_FILES - SOURCES - ${DESKTOP_FILES_IN} -) -add_custom_target(autostart_desktop_files ALL DEPENDS ${DESKTOP_FILES}) -#************************************************ - -install(FILES - ${DESKTOP_FILES} - DESTINATION "${LXQT_ETC_XDG_DIR}/autostart" - COMPONENT Runtime -) diff --git a/autostart/lxqt-desktop.desktop.in b/autostart/lxqt-desktop.desktop.in deleted file mode 100644 index b5ba08d..0000000 --- a/autostart/lxqt-desktop.desktop.in +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Desktop -Exec=pcmanfm-qt --desktop --profile=lxqt -TryExec=pcmanfm-qt -OnlyShowIn=LXQt; -X-LXQt-Module=true - -#TRANSLATIONS_DIR=translations diff --git a/autostart/translations/lxqt-desktop_ar.desktop b/autostart/translations/lxqt-desktop_ar.desktop deleted file mode 100644 index 488c8f2..0000000 --- a/autostart/translations/lxqt-desktop_ar.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ar]=سطح المكتب diff --git a/autostart/translations/lxqt-desktop_cs.desktop b/autostart/translations/lxqt-desktop_cs.desktop deleted file mode 100644 index 41772aa..0000000 --- a/autostart/translations/lxqt-desktop_cs.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[cs]=Plocha diff --git a/autostart/translations/lxqt-desktop_cs_CZ.desktop b/autostart/translations/lxqt-desktop_cs_CZ.desktop deleted file mode 100644 index baeb22a..0000000 --- a/autostart/translations/lxqt-desktop_cs_CZ.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[cs_CZ]=Plocha diff --git a/autostart/translations/lxqt-desktop_da.desktop b/autostart/translations/lxqt-desktop_da.desktop deleted file mode 100644 index 27a277c..0000000 --- a/autostart/translations/lxqt-desktop_da.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[da]=Skrivebord diff --git a/autostart/translations/lxqt-desktop_de.desktop b/autostart/translations/lxqt-desktop_de.desktop deleted file mode 100644 index 032c706..0000000 --- a/autostart/translations/lxqt-desktop_de.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[de]=Arbeitsfläche diff --git a/autostart/translations/lxqt-desktop_el.desktop b/autostart/translations/lxqt-desktop_el.desktop deleted file mode 100644 index 6794a7a..0000000 --- a/autostart/translations/lxqt-desktop_el.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[el]=Επιφάνεια εργασίας diff --git a/autostart/translations/lxqt-desktop_eo.desktop b/autostart/translations/lxqt-desktop_eo.desktop deleted file mode 100644 index 5eed7a0..0000000 --- a/autostart/translations/lxqt-desktop_eo.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[eo]=Labortablo diff --git a/autostart/translations/lxqt-desktop_es.desktop b/autostart/translations/lxqt-desktop_es.desktop deleted file mode 100644 index cc88ff1..0000000 --- a/autostart/translations/lxqt-desktop_es.desktop +++ /dev/null @@ -1 +0,0 @@ -Name[es]=Escritorio diff --git a/autostart/translations/lxqt-desktop_es_VE.desktop b/autostart/translations/lxqt-desktop_es_VE.desktop deleted file mode 100644 index f6f5cef..0000000 --- a/autostart/translations/lxqt-desktop_es_VE.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[es_VE]=Escritorio diff --git a/autostart/translations/lxqt-desktop_eu.desktop b/autostart/translations/lxqt-desktop_eu.desktop deleted file mode 100644 index b5d67f1..0000000 --- a/autostart/translations/lxqt-desktop_eu.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[eu]=Mahaigaina diff --git a/autostart/translations/lxqt-desktop_fi.desktop b/autostart/translations/lxqt-desktop_fi.desktop deleted file mode 100644 index 00bc361..0000000 --- a/autostart/translations/lxqt-desktop_fi.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[fi]=Työpöytä diff --git a/autostart/translations/lxqt-desktop_fr.desktop b/autostart/translations/lxqt-desktop_fr.desktop deleted file mode 100644 index 5ec4dae..0000000 --- a/autostart/translations/lxqt-desktop_fr.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[fr]=Bureau diff --git a/autostart/translations/lxqt-desktop_hu.desktop b/autostart/translations/lxqt-desktop_hu.desktop deleted file mode 100644 index f562df9..0000000 --- a/autostart/translations/lxqt-desktop_hu.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[hu]=Asztal diff --git a/autostart/translations/lxqt-desktop_ia.desktop b/autostart/translations/lxqt-desktop_ia.desktop deleted file mode 100644 index 084a547..0000000 --- a/autostart/translations/lxqt-desktop_ia.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ia]=Scriptorio diff --git a/autostart/translations/lxqt-desktop_it_IT.desktop b/autostart/translations/lxqt-desktop_it_IT.desktop deleted file mode 100644 index cf53f2f..0000000 --- a/autostart/translations/lxqt-desktop_it_IT.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[it_IT]=Desktop diff --git a/autostart/translations/lxqt-desktop_ja.desktop b/autostart/translations/lxqt-desktop_ja.desktop deleted file mode 100644 index 997c2ca..0000000 --- a/autostart/translations/lxqt-desktop_ja.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ja]=デスクトップ diff --git a/autostart/translations/lxqt-desktop_lt.desktop b/autostart/translations/lxqt-desktop_lt.desktop deleted file mode 100644 index e32a241..0000000 --- a/autostart/translations/lxqt-desktop_lt.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[lt]=Darbalaukis diff --git a/autostart/translations/lxqt-desktop_nl.desktop b/autostart/translations/lxqt-desktop_nl.desktop deleted file mode 100644 index 9d5a268..0000000 --- a/autostart/translations/lxqt-desktop_nl.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[nl]=Bureaublad diff --git a/autostart/translations/lxqt-desktop_pl_PL.desktop b/autostart/translations/lxqt-desktop_pl_PL.desktop deleted file mode 100644 index 8842c2e..0000000 --- a/autostart/translations/lxqt-desktop_pl_PL.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[pl_PL]=Pulpit diff --git a/autostart/translations/lxqt-desktop_pt.desktop b/autostart/translations/lxqt-desktop_pt.desktop deleted file mode 100644 index 168881a..0000000 --- a/autostart/translations/lxqt-desktop_pt.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[pt]=Área de trabalho diff --git a/autostart/translations/lxqt-desktop_pt_BR.desktop b/autostart/translations/lxqt-desktop_pt_BR.desktop deleted file mode 100644 index 525b1cf..0000000 --- a/autostart/translations/lxqt-desktop_pt_BR.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[pt_BR]=Área de trabalho diff --git a/autostart/translations/lxqt-desktop_ro_RO.desktop b/autostart/translations/lxqt-desktop_ro_RO.desktop deleted file mode 100644 index 67c3c8c..0000000 --- a/autostart/translations/lxqt-desktop_ro_RO.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ro_RO]=Desktop diff --git a/autostart/translations/lxqt-desktop_ru.desktop b/autostart/translations/lxqt-desktop_ru.desktop deleted file mode 100644 index 212067a..0000000 --- a/autostart/translations/lxqt-desktop_ru.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ru]=Pабочий стол diff --git a/autostart/translations/lxqt-desktop_ru_RU.desktop b/autostart/translations/lxqt-desktop_ru_RU.desktop deleted file mode 100644 index cd0ea09..0000000 --- a/autostart/translations/lxqt-desktop_ru_RU.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[ru_RU]=Рабочий стол diff --git a/autostart/translations/lxqt-desktop_sl.desktop b/autostart/translations/lxqt-desktop_sl.desktop deleted file mode 100644 index b22f360..0000000 --- a/autostart/translations/lxqt-desktop_sl.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[sl]=Namizje diff --git a/autostart/translations/lxqt-desktop_th_TH.desktop b/autostart/translations/lxqt-desktop_th_TH.desktop deleted file mode 100644 index 9884b62..0000000 --- a/autostart/translations/lxqt-desktop_th_TH.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[th_TH]=เดสก์ท็อป diff --git a/autostart/translations/lxqt-desktop_tr.desktop b/autostart/translations/lxqt-desktop_tr.desktop deleted file mode 100644 index 4de2076..0000000 --- a/autostart/translations/lxqt-desktop_tr.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[tr]=Masaüstü diff --git a/autostart/translations/lxqt-desktop_uk.desktop b/autostart/translations/lxqt-desktop_uk.desktop deleted file mode 100644 index c31081a..0000000 --- a/autostart/translations/lxqt-desktop_uk.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[uk]=Стільниця diff --git a/autostart/translations/lxqt-desktop_zh_CN.desktop b/autostart/translations/lxqt-desktop_zh_CN.desktop deleted file mode 100644 index a6312e1..0000000 --- a/autostart/translations/lxqt-desktop_zh_CN.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[zh_CN]=桌面 diff --git a/autostart/translations/lxqt-desktop_zh_TW.desktop b/autostart/translations/lxqt-desktop_zh_TW.desktop deleted file mode 100644 index e474b74..0000000 --- a/autostart/translations/lxqt-desktop_zh_TW.desktop +++ /dev/null @@ -1,2 +0,0 @@ -# Translations -Name[zh_TW]=桌面 diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt deleted file mode 100644 index c86bfb3..0000000 --- a/config/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -# install default config files to /etc/xdg - -configure_file(pcmanfm-qt/lxqt/settings.conf.in pcmanfm-qt/lxqt/settings.conf @ONLY) -install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/pcmanfm-qt/lxqt/settings.conf" - DESTINATION "${CMAKE_INSTALL_DATADIR}/pcmanfm-qt/lxqt" - COMPONENT Runtime -) diff --git a/config/pcmanfm-qt/lxqt/settings.conf.in b/config/pcmanfm-qt/lxqt/settings.conf.in deleted file mode 100644 index b7ef002..0000000 --- a/config/pcmanfm-qt/lxqt/settings.conf.in +++ /dev/null @@ -1,53 +0,0 @@ -[System] -IconThemeName=elementary -SuCommand=lxqt-sudo %s -TerminalCommand= -Archiver=file-roller -SIUnit=false -TerminalDirCommand=xterm -TerminalExecCommand=xterm -e %s - -[Behavior] -BookmarkOpenMethod=0 -UseTrash=true -SingleClick=false -ConfirmDelete=true - -[Desktop] -WallpaperMode=stretch -Wallpaper=@LXQT_SHARE_DIR@/themes/frost/lxqt-origami-light.png -BgColor=#000000 -FgColor=#ffffff -ShadowColor=#000000 -ShowHidden=false -SortOrder=ascending -SortColumn=name -Font="Sans Serif,10,-1,5,50,0,0,0,0,0" - -[Volume] -MountOnStartup=true -MountRemovable=true -AutoRun=true - -[FolderView] -Mode=icon -ShowHidden=false -SortOrder=ascending -SortColumn=name -BigIconSize=48 -SmallIconSize=24 -SidePaneIconSize=24 -ThumbnailIconSize=128 - -[Window] -Width=640 -Height=480 -AlwaysShowTabs=false -ShowTabClose=true -SplitterPos=150 -SidePaneMode=0 - -[Thumbnail] -ShowThumbnails=true -MaxThumbnailFileSize=4096 -ThumbnailLocalFilesOnly=true diff --git a/pcmanfm-qt.1.in b/pcmanfm-qt.1.in deleted file mode 100644 index 81bd758..0000000 --- a/pcmanfm-qt.1.in +++ /dev/null @@ -1,51 +0,0 @@ -.TH PCManFM-Qt "1" "September 2014" "@CMAKE_PROJECT_NAME@ @PCMANFM_QT_VERSION@" "User Commands" -.SH NAME -PCManFM-Qt \- A lightweight Qt-based file manager for X Window. -.SH SYNOPSIS -pcmanfm\-qt [OPTION...] [FILE1, FILE2,...] -.SH DESCRIPTION -PCMan File Manager Qt (\fBPCManFM-Qt\fP) is an extremely fast, lightweight, yet -feature-rich file manager with tabbed browsing. It is the default file manager -for the lightweight desktop environment \fBLXQt\fP. -.SH OPTIONS -.SS "Help Options:" -.TP -\fB\-h\fR, \fB\-\-help\fR -Show help options -.SS "Application Options:" -.TP -\fB\-p\fR, \fB\-\-profile\fR=\fI\,PROFILE\/\fR -Set name of configuration profile -.TP -\fB\-d\fR, \fB\-\-daemon\-mode\fR -Run PCManFM as a daemon -.TP -\fB\-\-quit\fR -Quit PCManFM -.TP -\fB\-\-desktop\fR -Launch desktop manager -.TP -\fB\-\-desktop\-off\fR -Turn off desktop manager if it's running -.TP -\fB\-\-desktop\-pref\fR=\fI\,NAME\/\fR -Open desktop preference dialog on the page with the specified name -.TP -\fB\-w\fR, \fB\-\-set\-wallpaper\fR=\fI\,FILE\/\fR -Set desktop wallpaper from image FILE -.TP -\fB\-\-wallpaper\-mode\fR=\fI\,MODE\/\fR -Set mode of desktop wallpaper. MODE=(color|stretch|fit|center|tile) -.TP -\fB\-\-show\-pref\fR=\fI\,NAME\/\fR -Open Preferences dialog on the page with the specified name -.TP -\fB\-n\fR, \fB\-\-new\-window\fR -Open new window -.TP -\fB\-f\fR, \fB\-\-find\-files\fR -Open Find Files utility -.SH "AUTHORS" -.B pcmanfm-qt -was primarily written by Hong Jen Yee (PCMan) . diff --git a/pcmanfm/CMakeLists.txt b/pcmanfm/CMakeLists.txt deleted file mode 100644 index 09a9eea..0000000 --- a/pcmanfm/CMakeLists.txt +++ /dev/null @@ -1,97 +0,0 @@ -set(pcmanfm_SRCS - application.cpp - pcmanfm.cpp - mainwindow.cpp - tabpage.cpp - tabbar.cpp - statusbar.cpp - view.cpp - launcher.cpp - preferencesdialog.cpp - xdgdir.cpp - desktoppreferencesdialog.cpp - desktopwindow.cpp - autorundialog.cpp - connectserverdialog.cpp - settings.cpp - bulkrename.cpp -) - -qt5_add_dbus_adaptor(pcmanfm_DBUS_SRCS - org.pcmanfm.Application.xml - application.h - PCManFM::Application - applicationadaptor - ApplicationAdaptor -) - -# qt5_add_dbus_adaptor() already generated the moc files. It also marked the -# files with SKIP_AUTOMOC but we still need to mark them witk SKIP_AUTOGEN. -# TODO: Check if this behaviour is a CMake bug. -set_source_files_properties(${pcmanfm_DBUS_SRCS} PROPERTIES SKIP_AUTOGEN ON) - -set(pcmanfm_UIS - main-win.ui - about.ui - preferences.ui - desktop-preferences.ui - desktop-folder.ui - autorun.ui - connect.ui - bulk-rename.ui -) - -# add translation for pcmanfm-qt -lxqt_translate_ts(QM_FILES - UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS} - SOURCES ${pcmanfm_SRCS} ${pcmanfm_UIS} - INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}/translations" - PULL_TRANSLATIONS ${PULL_TRANSLATIONS} - CLEAN_TRANSLATIONS ${CLEAN_TRANSLATIONS} - TRANSLATIONS_REPO ${TRANSLATIONS_REPO} - TRANSLATIONS_REFSPEC ${TRANSLATIONS_REFSPEC} -) - -# translate desktop entry files for pcmanfm-qt and desktop preferences -lxqt_translate_desktop(DESKTOP_FILES - SOURCES - pcmanfm-qt.desktop.in - pcmanfm-qt-desktop-pref.desktop.in -) - -add_executable(pcmanfm-qt - ${pcmanfm_SRCS} - ${pcmanfm_DBUS_SRCS} - ${pcmanfm_UIS} - ${QM_FILES} - ${DESKTOP_FILES} -) - -target_compile_definitions(pcmanfm-qt - PRIVATE - PCMANFM_DATA_DIR="${CMAKE_INSTALL_PREFIX}/share/pcmanfm-qt" - PCMANFM_QT_VERSION="${PCMANFM_QT_VERSION}" - LIBFM_DATA_DIR="${PKG_FM_PREFIX}/share/libfm" - QT_NO_FOREACH -) - -target_include_directories(pcmanfm-qt - PRIVATE - "${Qt5Gui_PRIVATE_INCLUDE_DIRS}" -) - -target_link_libraries(pcmanfm-qt - Qt5::X11Extras - Qt5::Widgets - Qt5::DBus - fm-qt -) - -install(TARGETS pcmanfm-qt RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) - -# install a desktop entry file for pcmanfm-qt and desktop preferences -install(FILES ${DESKTOP_FILES} DESTINATION "${CMAKE_INSTALL_DATADIR}/applications" -) - -# prevent the generated files from being deleted during make clean -set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true) diff --git a/pcmanfm/about.ui b/pcmanfm/about.ui deleted file mode 100644 index 27bdd12..0000000 --- a/pcmanfm/about.ui +++ /dev/null @@ -1,180 +0,0 @@ - - - AboutDialog - - - - 0 - 0 - 430 - 325 - - - - About - - - - - - - - - - - <html><head/><body><p><span style=" font-size:16pt; font-weight:600;">PCManFM-Qt</span></p></body></html> - - - Qt::RichText - - - Qt::AlignCenter - - - - - - - - - - Qt::AlignCenter - - - - - - - Lightweight file manager - - - Qt::AlignCenter - - - - - - - <html><head/><body><p><a href="https://lxqt.org/"><span style=" text-decoration: underline; color:#0000ff;">https://lxqt.org/</span></a></p></body></html> - - - Qt::RichText - - - Qt::AlignCenter - - - - - - - 0 - - - false - - - - Authors - - - - - - true - - - Programming: -* Hong Jen Yee (PCMan) <pcman.tw@gmail.com> - - - - false - - - - - - - - License - - - - - - true - - - PCManFM-Qt File Manager - -Copyright (C) 2009 - 2014 洪任諭 (Hong Jen Yee) - -This program 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. - -This program 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, write to the Free Software -Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Close - - - - - - - - - buttonBox - accepted() - AboutDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - AboutDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/pcmanfm/application.cpp b/pcmanfm/application.cpp deleted file mode 100644 index 41acbf5..0000000 --- a/pcmanfm/application.cpp +++ /dev/null @@ -1,895 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "application.h" -#include "mainwindow.h" -#include "desktopwindow.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -#include -#include -#include - -#include "applicationadaptor.h" -#include "preferencesdialog.h" -#include "desktoppreferencesdialog.h" -#include "autorundialog.h" -#include "launcher.h" -#include "xdgdir.h" -#include "connectserverdialog.h" - -#include - - -namespace PCManFM { - -static const char* serviceName = "org.pcmanfm.PCManFM"; -static const char* ifaceName = "org.pcmanfm.Application"; - -int ProxyStyle::styleHint(StyleHint hint, const QStyleOption* option, const QWidget* widget, QStyleHintReturn* returnData) const { - Application* app = static_cast(qApp); - if(hint == QStyle::SH_ItemView_ActivateItemOnSingleClick) { - return app->settings().singleClick(); - } - return QProxyStyle::styleHint(hint, option, widget, returnData); -} - -Application::Application(int& argc, char** argv): - QApplication(argc, argv), - libFm_(), - settings_(), - profileName_("default"), - daemonMode_(false), - enableDesktopManager_(false), - desktopWindows_(), - preferencesDialog_(), - editBookmarksialog_(), - volumeMonitor_(nullptr), - userDirsWatcher_(nullptr), - lxqtRunning_(false) { - - argc_ = argc; - argv_ = argv; - - setApplicationVersion(PCMANFM_QT_VERSION); - - // QDBusConnection::sessionBus().registerObject("/org/pcmanfm/Application", this); - QDBusConnection dbus = QDBusConnection::sessionBus(); - if(dbus.registerService(serviceName)) { - // we successfully registered the service - isPrimaryInstance = true; - setStyle(new ProxyStyle()); - desktop()->installEventFilter(this); - - new ApplicationAdaptor(this); - dbus.registerObject("/Application", this); - - connect(this, &Application::aboutToQuit, this, &Application::onAboutToQuit); - // aboutToQuit() is not signalled on SIGTERM, install signal handler - installSigtermHandler(); - settings_.load(profileName_); - - // decrease the cache size to reduce memory usage - QPixmapCache::setCacheLimit(2048); - - if(settings_.useFallbackIconTheme()) { - QIcon::setThemeName(settings_.fallbackIconThemeName()); - } - - // Check if LXQt Session is running. LXQt has it's own Desktop Folder - // editor. We just hide our editor when LXQt is running. - QDBusInterface* lxqtSessionIface = new QDBusInterface( - QStringLiteral("org.lxqt.session"), - QStringLiteral("/LXQtSession")); - if(lxqtSessionIface) { - if(lxqtSessionIface->isValid()) { - lxqtRunning_ = true; - userDesktopFolder_ = XdgDir::readDesktopDir(); - initWatch(); - } - delete lxqtSessionIface; - lxqtSessionIface = 0; - } - } - else { - // an service of the same name is already registered. - // we're not the first instance - isPrimaryInstance = false; - } -} - -Application::~Application() { - desktop()->removeEventFilter(this); - - if(volumeMonitor_) { - g_signal_handlers_disconnect_by_func(volumeMonitor_, gpointer(onVolumeAdded), this); - g_object_unref(volumeMonitor_); - } - - // if(enableDesktopManager_) - // removeNativeEventFilter(this); -} - -void Application::initWatch() { - QFile file_(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/user-dirs.dirs")); - if(! file_.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << Q_FUNC_INFO << "Could not read: " << userDirsFile_; - userDirsFile_ = QString(); - } - else { - userDirsFile_ = file_.fileName(); - } - - userDirsWatcher_ = new QFileSystemWatcher(this); - userDirsWatcher_->addPath(userDirsFile_); - connect(userDirsWatcher_, &QFileSystemWatcher::fileChanged, this, &Application::onUserDirsChanged); -} - -bool Application::parseCommandLineArgs() { - bool keepRunning = false; - QCommandLineParser parser; - parser.addHelpOption(); - parser.addVersionOption(); - - QCommandLineOption profileOption(QStringList() << "p" << "profile", tr("Name of configuration profile"), tr("PROFILE")); - parser.addOption(profileOption); - - QCommandLineOption daemonOption(QStringList() << "d" << "daemon-mode", tr("Run PCManFM as a daemon")); - parser.addOption(daemonOption); - - QCommandLineOption quitOption(QStringList() << "q" << "quit", tr("Quit PCManFM")); - parser.addOption(quitOption); - - QCommandLineOption desktopOption("desktop", tr("Launch desktop manager")); - parser.addOption(desktopOption); - - QCommandLineOption desktopOffOption("desktop-off", tr("Turn off desktop manager if it's running")); - parser.addOption(desktopOffOption); - - QCommandLineOption desktopPrefOption("desktop-pref", tr("Open desktop preference dialog on the page with the specified name"), tr("NAME")); - parser.addOption(desktopPrefOption); - - QCommandLineOption newWindowOption(QStringList() << "n" << "new-window", tr("Open new window")); - parser.addOption(newWindowOption); - - QCommandLineOption findFilesOption(QStringList() << "f" << "find-files", tr("Open Find Files utility")); - parser.addOption(findFilesOption); - - QCommandLineOption setWallpaperOption(QStringList() << "w" << "set-wallpaper", tr("Set desktop wallpaper from image FILE"), tr("FILE")); - parser.addOption(setWallpaperOption); - - QCommandLineOption wallpaperModeOption("wallpaper-mode", tr("Set mode of desktop wallpaper. MODE=(%1)").arg("color|stretch|fit|center|tile|zoom"), tr("MODE")); - parser.addOption(wallpaperModeOption); - - QCommandLineOption showPrefOption("show-pref", tr("Open Preferences dialog on the page with the specified name"), tr("NAME")); - parser.addOption(showPrefOption); - - parser.addPositionalArgument("files", tr("Files or directories to open"), tr("[FILE1, FILE2,...]")); - - parser.process(arguments()); - - if(isPrimaryInstance) { - qDebug("isPrimaryInstance"); - - if(parser.isSet(daemonOption)) { - daemonMode_ = true; - } - if(parser.isSet(profileOption)) { - profileName_ = parser.value(profileOption); - } - - // load settings - settings_.load(profileName_); - - // desktop icon management - if(parser.isSet(desktopOption)) { - desktopManager(true); - keepRunning = true; - } - else if(parser.isSet(desktopOffOption)) { - desktopManager(false); - } - - if(parser.isSet(desktopPrefOption)) { // desktop preference dialog - desktopPrefrences(parser.value(desktopPrefOption)); - keepRunning = true; - } - else if(parser.isSet(findFilesOption)) { // file searching utility - findFiles(parser.positionalArguments()); - keepRunning = true; - } - else if(parser.isSet(showPrefOption)) { // preferences dialog - preferences(parser.value(showPrefOption)); - keepRunning = true; - } - else if(parser.isSet(setWallpaperOption) || parser.isSet(wallpaperModeOption)) { // set wall paper - setWallpaper(parser.value(setWallpaperOption), parser.value(wallpaperModeOption)); - } - else { - if(!parser.isSet(desktopOption) && !parser.isSet(desktopOffOption)) { - QStringList paths = parser.positionalArguments(); - if(paths.isEmpty()) { - // if no path is specified and we're using daemon mode, - // don't open current working directory - if(!daemonMode_) { - paths.push_back(QDir::currentPath()); - } - } - if(!paths.isEmpty()) { - launchFiles(QDir::currentPath(), paths, parser.isSet(newWindowOption)); - } - keepRunning = true; - } - } - } - else { - QDBusConnection dbus = QDBusConnection::sessionBus(); - QDBusInterface iface(serviceName, "/Application", ifaceName, dbus, this); - if(parser.isSet(quitOption)) { - iface.call("quit"); - return false; - } - - if(parser.isSet(desktopOption)) { - iface.call("desktopManager", true); - } - else if(parser.isSet(desktopOffOption)) { - iface.call("desktopManager", false); - } - - if(parser.isSet(desktopPrefOption)) { // desktop preference dialog - iface.call("desktopPrefrences", parser.value(desktopPrefOption)); - } - else if(parser.isSet(findFilesOption)) { // file searching utility - iface.call("findFiles", parser.positionalArguments()); - } - else if(parser.isSet(showPrefOption)) { // preferences dialog - iface.call("preferences", parser.value(showPrefOption)); - } - else if(parser.isSet(setWallpaperOption) || parser.isSet(wallpaperModeOption)) { // set wall paper - iface.call("setWallpaper", parser.value(setWallpaperOption), parser.value(wallpaperModeOption)); - } - else { - if(!parser.isSet(desktopOption) && !parser.isSet(desktopOffOption)) { - QStringList paths = parser.positionalArguments(); - if(paths.isEmpty()) { - paths.push_back(QDir::currentPath()); - } - iface.call("launchFiles", QDir::currentPath(), paths, parser.isSet(newWindowOption)); - } - } - } - return keepRunning; -} - -void Application::init() { - - // install the translations built-into Qt itself - qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath)); - installTranslator(&qtTranslator); - - // install libfm-qt translator - installTranslator(libFm_.translator()); - - // install our own tranlations - translator.load("pcmanfm-qt_" + QLocale::system().name(), PCMANFM_DATA_DIR "/translations"); - installTranslator(&translator); -} - -int Application::exec() { - - if(!parseCommandLineArgs()) { - return 0; - } - - if(daemonMode_) { // keep running even when there is no window opened. - setQuitOnLastWindowClosed(false); - } - - volumeMonitor_ = g_volume_monitor_get(); - // delay the volume manager a little because in newer versions of glib/gio there's a problem. - // when the first volume monitor object is created, it discovers volumes asynchonously. - // g_volume_monitor_get() immediately returns while the monitor is still discovering devices. - // So initially g_volume_monitor_get_volumes() returns nothing, but shortly after that - // we get volume-added signals for all of the volumes. This is not what we want. - // So, we wait for 3 seconds here to let it finish device discovery. - QTimer::singleShot(3000, this, SLOT(initVolumeManager())); - - return QCoreApplication::exec(); -} - - -void Application::onUserDirsChanged() { - qDebug() << Q_FUNC_INFO; - bool file_deleted = !userDirsWatcher_->files().contains(userDirsFile_); - if(file_deleted) { - // if our config file is already deleted, reinstall a new watcher - userDirsWatcher_->addPath(userDirsFile_); - } - - const QString d = XdgDir::readDesktopDir(); - if(d != userDesktopFolder_) { - userDesktopFolder_ = d; - const QDir dir(d); - if(dir.exists()) { - const int N = desktopWindows_.size(); - for(int i = 0; i < N; ++i) { - desktopWindows_.at(i)->setDesktopFolder(); - } - } - else { - qWarning("Application::onUserDirsChanged: %s doesn't exist", - userDesktopFolder_.toUtf8().constData()); - } - } -} - -void Application::onAboutToQuit() { - qDebug("aboutToQuit"); - settings_.save(); -} - -bool Application::eventFilter(QObject* watched, QEvent* event) { - if(watched == desktop()) { - if(event->type() == QEvent::StyleChange || - event->type() == QEvent::ThemeChange) { - setStyle(new ProxyStyle()); - } - } - return QObject::eventFilter(watched, event); -} - -void Application::onLastWindowClosed() { - -} - -void Application::onSaveStateRequest(QSessionManager& /*manager*/) { - -} - -void Application::desktopManager(bool enabled) { - // TODO: turn on or turn off desktpo management (desktop icons & wallpaper) - qDebug("desktopManager: %d", enabled); - QDesktopWidget* desktopWidget = desktop(); - if(enabled) { - if(!enableDesktopManager_) { - // installNativeEventFilter(this); - const auto allScreens = screens(); - for(QScreen* screen : allScreens) { - connect(screen, &QScreen::virtualGeometryChanged, this, &Application::onVirtualGeometryChanged); - connect(screen, &QObject::destroyed, this, &Application::onScreenDestroyed); - } - connect(this, &QApplication::screenAdded, this, &Application::onScreenAdded); - connect(desktopWidget, &QDesktopWidget::resized, this, &Application::onScreenResized); - connect(desktopWidget, &QDesktopWidget::screenCountChanged, this, &Application::onScreenCountChanged); - - // NOTE: there are two modes - // When virtual desktop is used (all screens are combined to form a large virtual desktop), - // we only create one DesktopWindow. Otherwise, we create one for each screen. - if(desktopWidget->isVirtualDesktop()) { - DesktopWindow* window = createDesktopWindow(-1); - desktopWindows_.push_back(window); - } - else { - int n = desktopWidget->numScreens(); - desktopWindows_.reserve(n); - for(int i = 0; i < n; ++i) { - DesktopWindow* window = createDesktopWindow(i); - desktopWindows_.push_back(window); - } - } - } - } - else { - if(enableDesktopManager_) { - disconnect(desktopWidget, &QDesktopWidget::resized, this, &Application::onScreenResized); - disconnect(desktopWidget, &QDesktopWidget::screenCountChanged, this, &Application::onScreenCountChanged); - int n = desktopWindows_.size(); - for(int i = 0; i < n; ++i) { - DesktopWindow* window = desktopWindows_.at(i); - delete window; - } - desktopWindows_.clear(); - const auto allScreens = screens(); - for(QScreen* screen : allScreens) { - disconnect(screen, &QScreen::virtualGeometryChanged, this, &Application::onVirtualGeometryChanged); - disconnect(screen, &QObject::destroyed, this, &Application::onScreenDestroyed); - } - disconnect(this, &QApplication::screenAdded, this, &Application::onScreenAdded); - // removeNativeEventFilter(this); - } - } - enableDesktopManager_ = enabled; -} - -void Application::desktopPrefrences(QString page) { - // show desktop preference window - if(!desktopPreferencesDialog_) { - desktopPreferencesDialog_ = new DesktopPreferencesDialog(); - - // Should be used only one time - desktopPreferencesDialog_->setEditDesktopFolder(!lxqtRunning_); - } - desktopPreferencesDialog_.data()->selectPage(page); - desktopPreferencesDialog_.data()->show(); - desktopPreferencesDialog_.data()->raise(); - desktopPreferencesDialog_.data()->activateWindow(); -} - -void Application::onFindFileAccepted() { - Fm::FileSearchDialog* dlg = static_cast(sender()); - // get search settings - settings_.setSearchNameCaseInsensitive(dlg->nameCaseInsensitive()); - settings_.setsearchContentCaseInsensitive(dlg->contentCaseInsensitive()); - settings_.setSearchNameRegexp(dlg->nameRegexp()); - settings_.setSearchContentRegexp(dlg->contentRegexp()); - settings_.setSearchRecursive(dlg->recursive()); - settings_.setSearchhHidden(dlg->searchhHidden()); - - Fm::FilePathList paths; - paths.emplace_back(dlg->searchUri()); - MainWindow* window = MainWindow::lastActive(); - Launcher(window).launchPaths(nullptr, paths); -} - -void Application::onConnectToServerAccepted() { - ConnectServerDialog* dlg = static_cast(sender()); - QString uri = dlg->uriText(); - Fm::FilePathList paths; - paths.push_back(Fm::FilePath::fromDisplayName(uri.toUtf8().constData())); - MainWindow* window = MainWindow::lastActive(); - Launcher(window).launchPaths(nullptr, paths); -} - -void Application::findFiles(QStringList paths) { - // launch file searching utility. - Fm::FileSearchDialog* dlg = new Fm::FileSearchDialog(paths); - connect(dlg, &QDialog::accepted, this, &Application::onFindFileAccepted); - dlg->setAttribute(Qt::WA_DeleteOnClose); - // set search settings - dlg->setNameCaseInsensitive(settings_.searchNameCaseInsensitive()); - dlg->setContentCaseInsensitive(settings_.searchContentCaseInsensitive()); - dlg->setNameRegexp(settings_.searchNameRegexp()); - dlg->setContentRegexp(settings_.searchContentRegexp()); - dlg->setRecursive(settings_.searchRecursive()); - dlg->setSearchhHidden(settings_.searchhHidden()); - - dlg->show(); -} - -void Application::connectToServer() { - ConnectServerDialog* dlg = new ConnectServerDialog(); - connect(dlg, &QDialog::accepted, this, &Application::onConnectToServerAccepted); - dlg->setAttribute(Qt::WA_DeleteOnClose); - dlg->show(); -} - -void Application::launchFiles(QString cwd, QStringList paths, bool /*inNewWindow*/) { - Fm::FilePathList pathList; - Fm::FilePath cwd_path; - QStringList::iterator it; - for(const QString& it : qAsConst(paths)) { - QByteArray pathName = it.toLocal8Bit(); - Fm::FilePath path; - if(pathName == "~") { // special case for home dir - path = Fm::FilePath::homeDir(); - } - if(pathName[0] == '/') { // absolute path - path = Fm::FilePath::fromLocalPath(pathName.constData()); - } - else if(pathName.contains(":/")) { // URI - path = Fm::FilePath::fromUri(pathName.constData()); - } - else { // basename - if(Q_UNLIKELY(!cwd_path)) { - cwd_path = Fm::FilePath::fromLocalPath(cwd.toLocal8Bit().constData()); - } - path = cwd_path.relativePath(pathName.constData()); - } - pathList.push_back(std::move(path)); - } - - Launcher(nullptr).launchPaths(nullptr, pathList); -} - -void Application::openFolders(Fm::FileInfoList files) { - Launcher(nullptr).launchFiles(nullptr, std::move(files)); -} - -void Application::openFolderInTerminal(Fm::FilePath path) { - if(!settings_.terminal().isEmpty()) { - Fm::GErrorPtr err; - auto terminalName = settings_.terminal().toUtf8(); - if(!Fm::launchTerminal(terminalName.constData(), path, err)) { - QMessageBox::critical(nullptr, tr("Error"), err.message()); - } - } - else { - // show an error message and ask the user to set the command - QMessageBox::critical(nullptr, tr("Error"), tr("Terminal emulator is not set.")); - preferences("advanced"); - } -} - -void Application::preferences(QString page) { - // open preference dialog - if(!preferencesDialog_) { - preferencesDialog_ = new PreferencesDialog(page); - } - else { - preferencesDialog_.data()->selectPage(page); - } - preferencesDialog_.data()->show(); - preferencesDialog_.data()->raise(); - preferencesDialog_.data()->activateWindow(); -} - -void Application::setWallpaper(QString path, QString modeString) { - static const char* valid_wallpaper_modes[] = {"color", "stretch", "fit", "center", "tile"}; - DesktopWindow::WallpaperMode mode = settings_.wallpaperMode(); - bool changed = false; - - if(!path.isEmpty() && path != settings_.wallpaper()) { - if(QFile(path).exists()) { - settings_.setWallpaper(path); - changed = true; - } - } - // convert mode string to value - for(std::size_t i = 0; i < G_N_ELEMENTS(valid_wallpaper_modes); ++i) { - if(modeString == valid_wallpaper_modes[i]) { - // We don't take safety checks because valid_wallpaper_modes[] is - // defined in this function and we can clearly see that it does not - // overflow. - mode = static_cast(i); - if(mode != settings_.wallpaperMode()) { - changed = true; - } - break; - } - } - // FIXME: support different wallpapers on different screen. - // update wallpaper - if(changed) { - if(enableDesktopManager_) { - for(DesktopWindow* desktopWindow : qAsConst(desktopWindows_)) { - if(!path.isEmpty()) { - desktopWindow->setWallpaperFile(path); - } - if(mode != settings_.wallpaperMode()) { - desktopWindow->setWallpaperMode(mode); - } - desktopWindow->updateWallpaper(); - } - settings_.save(); // save the settings to the config file - } - } -} - -void Application::onScreenResized(int num) { - if(desktop()->isVirtualDesktop()) { - // in virtual desktop mode, we only have one desktop window. that is the first one. - DesktopWindow* window = desktopWindows_.at(0); - window->setGeometry(desktop()->geometry()); - } - else { - DesktopWindow* window = desktopWindows_.at(num); - QRect rect = desktop()->screenGeometry(num); - window->setGeometry(rect); - } -} - -DesktopWindow* Application::createDesktopWindow(int screenNum) { - DesktopWindow* window = new DesktopWindow(screenNum); - if(screenNum == -1) { // one large virtual desktop only - QRect rect = desktop()->geometry(); - window->setGeometry(rect); - } - else { - QRect rect = desktop()->screenGeometry(screenNum); - window->setGeometry(rect); - } - window->updateFromSettings(settings_); - window->show(); - return window; -} - -void Application::onScreenCountChanged(int newCount) { - QDesktopWidget* desktopWidget = desktop(); - bool oldVirtual = (desktopWindows_.size() == 1 && desktopWindows_.at(0)->screenNum() == -1); - bool isVirtual = desktopWidget->isVirtualDesktop(); - - if(oldVirtual && isVirtual) { - // if we are using virtual desktop mode previously, and the new mode is sitll virtual - // no further change is needed, only do relayout. - desktopWindows_.at(0)->queueRelayout(); - return; - } - - // we used non-virtual mode originally, but now we're switched to virtual mode - if(isVirtual) { - newCount = 1; // we only want one desktop window for all screens in virtual mode - } - - if(newCount > desktopWindows_.size()) { - // add more desktop windows - for(int i = desktopWindows_.size(); i < newCount; ++i) { - DesktopWindow* desktop = createDesktopWindow(i); - desktopWindows_.push_back(desktop); - } - } - else if(newCount < desktopWindows_.size()) { - // delete excessive desktop windows - for(int i = newCount; i < desktopWindows_.size(); ++i) { - DesktopWindow* desktop = desktopWindows_.at(i); - delete desktop; - } - desktopWindows_.resize(newCount); - } - - if(newCount == 1) { // now only 1 screen is in use - DesktopWindow* desktop = desktopWindows_.at(0); - if(isVirtual) { - desktop->setScreenNum(-1); - } - else { // non-virtual mode, and we only have 1 screen - desktop->setScreenNum(0); - } - desktop->updateWallpaper(); - } -} - -// called when Settings is changed to update UI -void Application::updateFromSettings() { - // if(iconTheme.isEmpty()) - // Fm::IconTheme::setThemeName(settings_.fallbackIconThemeName()); - - // update main windows and desktop windows - QWidgetList windows = this->topLevelWidgets(); - QWidgetList::iterator it; - for(it = windows.begin(); it != windows.end(); ++it) { - QWidget* window = *it; - if(window->inherits("PCManFM::MainWindow")) { - MainWindow* mainWindow = static_cast(window); - mainWindow->updateFromSettings(settings_); - } - } - if(desktopManagerEnabled()) { - updateDesktopsFromSettings(); - } -} - -void Application::updateDesktopsFromSettings(bool changeSlide) { - QVector::iterator it; - for(it = desktopWindows_.begin(); it != desktopWindows_.end(); ++it) { - DesktopWindow* desktopWindow = static_cast(*it); - desktopWindow->updateFromSettings(settings_, changeSlide); - } -} - -void Application::editBookmarks() { - if(!editBookmarksialog_) { - FmBookmarks* bookmarks = fm_bookmarks_dup(); - editBookmarksialog_ = new Fm::EditBookmarksDialog(bookmarks); - g_object_unref(bookmarks); - } - editBookmarksialog_.data()->show(); -} - -void Application::initVolumeManager() { - - g_signal_connect(volumeMonitor_, "volume-added", G_CALLBACK(onVolumeAdded), this); - - if(settings_.mountOnStartup()) { - /* try to automount all volumes */ - GList* vols = g_volume_monitor_get_volumes(volumeMonitor_); - for(GList* l = vols; l; l = l->next) { - GVolume* volume = G_VOLUME(l->data); - if(g_volume_should_automount(volume)) { - autoMountVolume(volume, false); - } - g_object_unref(volume); - } - g_list_free(vols); - } -} - -bool Application::autoMountVolume(GVolume* volume, bool interactive) { - if(!g_volume_should_automount(volume) || !g_volume_can_mount(volume)) { - return FALSE; - } - - GMount* mount = g_volume_get_mount(volume); - if(!mount) { // not mounted, automount is needed - // try automount - Fm::MountOperation* op = new Fm::MountOperation(interactive); - op->mount(volume); - if(!op->wait()) { - return false; - } - if(!interactive) { - return true; - } - mount = g_volume_get_mount(volume); - } - - if(mount) { - if(interactive && settings_.autoRun()) { // show autorun dialog - AutoRunDialog* dlg = new AutoRunDialog(volume, mount); - dlg->show(); - } - g_object_unref(mount); - } - return true; -} - -// static -void Application::onVolumeAdded(GVolumeMonitor* /*monitor*/, GVolume* volume, Application* pThis) { - if(pThis->settings_.mountRemovable()) { - pThis->autoMountVolume(volume, true); - } -} - -#if 0 -bool Application::nativeEventFilter(const QByteArray& eventType, void* message, long* result) { - if(eventType == "xcb_generic_event_t") { // XCB event - // filter all native X11 events (xcb) - xcb_generic_event_t* generic_event = reinterpret_cast(message); - // qDebug("XCB event: %d", generic_event->response_type & ~0x80); - Q_FOREACH(DesktopWindow* window, desktopWindows_) { - } - } - return false; -} -#endif - -void Application::onScreenAdded(QScreen* newScreen) { - if(enableDesktopManager_) { - connect(newScreen, &QScreen::virtualGeometryChanged, this, &Application::onVirtualGeometryChanged); - connect(newScreen, &QObject::destroyed, this, &Application::onScreenDestroyed); - } -} - -void Application::onScreenDestroyed(QObject* screenObj) { - // NOTE by PCMan: This is a workaround for Qt 5 bug #40681. - // With this very dirty workaround, we can fix lxqt/lxqt bug #204, #205, and #206. - // Qt 5 has two new regression bugs which breaks lxqt-panel in a multihead environment. - // #40681: Regression bug: QWidget::winId() returns old value and QEvent::WinIdChange event is not emitted sometimes. (multihead setup) - // #40791: Regression: QPlatformWindow, QWindow, and QWidget::winId() are out of sync. - // Explanations for the workaround: - // Internally, Qt mantains a list of QScreens and update it when XRandR configuration changes. - // When the user turn off an monitor with xrandr --output --off, this will destroy the QScreen - // object which represent the output. If the QScreen being destroyed contains our panel widget, - // Qt will call QWindow::setScreen(0) on the internal windowHandle() of our panel widget to move it - // to the primary screen. However, moving a window to a different screen is more than just changing - // its position. With XRandR, all screens are actually part of the same virtual desktop. However, - // this is not the case in other setups, such as Xinerama and moving a window to another screen is - // not possible unless you destroy the widget and create it again for a new screen. - // Therefore, Qt destroy the widget and re-create it when moving our panel to a new screen. - // Unfortunately, destroying the window also destroy the child windows embedded into it, - // using XEMBED such as the tray icons. (#206) - // Second, when the window is re-created, the winId of the QWidget is changed, but Qt failed to - // generate QEvent::WinIdChange event so we have no way to know that. We have to set - // some X11 window properties using the native winId() to make it a dock, but this stop working - // because we cannot get the correct winId(), so this causes #204 and #205. - // - // The workaround is very simple. Just completely destroy the window before Qt has a chance to do - // QWindow::setScreen() for it. Later, we recreate the window ourselves. So this can bypassing the Qt bugs. - if(enableDesktopManager_) { - bool reloadNeeded = false; - // FIXME: add workarounds for Qt5 bug #40681 and #40791 here. - for(DesktopWindow* desktop : qAsConst(desktopWindows_)) { - if(desktop->windowHandle()->screen() == screenObj) { - desktop->destroy(); // destroy the underlying native window - reloadNeeded = true; - } - } - if(reloadNeeded) { - QTimer::singleShot(0, this, SLOT(reloadDesktopsAsNeeded())); - } - } -} - -void Application::reloadDesktopsAsNeeded() { - if(enableDesktopManager_) { - // workarounds for Qt5 bug #40681 and #40791 here. - for(DesktopWindow* desktop : qAsConst(desktopWindows_)) { - if(!desktop->windowHandle()) { - desktop->create(); // re-create the underlying native window - desktop->queueRelayout(); - desktop->show(); - } - } - } -} - -// This slot is for Qt 5 onlt, but the stupid Qt moc cannot do conditional compilation -// so we have to define it for Qt 4 as well. -void Application::onVirtualGeometryChanged(const QRect& /*rect*/) { - // NOTE: the following is a workaround for Qt bug 32567. - // https://bugreports.qt-project.org/browse/QTBUG-32567 - // Though the status of the bug report is closed, it's not yet fixed for X11. - // In theory, QDesktopWidget should emit "workAreaResized()" signal when the work area - // of any screen is changed, but in fact it does not do it. - // However, QScreen provided since Qt5 does not have the bug and - // virtualGeometryChanged() is emitted correctly when the workAreas changed. - // So we use it in Qt5. - if(enableDesktopManager_) { - // qDebug() << "onVirtualGeometryChanged"; - for(DesktopWindow* desktop : qAsConst(desktopWindows_)) { - desktop->queueRelayout(); - } - } -} - - -static int sigterm_fd[2]; - -static void sigtermHandler(int) { - char c = 1; - ::write(sigterm_fd[0], &c, sizeof(c)); -} - -void Application::installSigtermHandler() { - if(::socketpair(AF_UNIX, SOCK_STREAM, 0, sigterm_fd) == 0) { - QSocketNotifier* notifier = new QSocketNotifier(sigterm_fd[1], QSocketNotifier::Read, this); - connect(notifier, &QSocketNotifier::activated, this, &Application::onSigtermNotified); - - struct sigaction action; - action.sa_handler = sigtermHandler; - ::sigemptyset(&action.sa_mask); - action.sa_flags = SA_RESTART; - if(::sigaction(SIGTERM, &action, 0) != 0) { - qWarning("Couldn't install SIGTERM handler"); - } - } - else { - qWarning("Couldn't create SIGTERM socketpair"); - } -} - -void Application::onSigtermNotified() { - if(QSocketNotifier* notifier = qobject_cast(sender())) { - notifier->setEnabled(false); - char c; - ::read(sigterm_fd[1], &c, sizeof(c)); - quit(); - notifier->setEnabled(true); - } -} - -} // namespace PCManFM diff --git a/pcmanfm/application.h b/pcmanfm/application.h deleted file mode 100644 index 13ba59f..0000000 --- a/pcmanfm/application.h +++ /dev/null @@ -1,157 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_APPLICATION_H -#define PCMANFM_APPLICATION_H - -#include -#include "settings.h" -#include -#include -#include -#include -#include -#include -#include - -#include -#include - -class QScreen; - -class QFileSystemWatcher; - -namespace PCManFM { - -class MainWindow; -class DesktopWindow; -class PreferencesDialog; -class DesktopPreferencesDialog; - -class ProxyStyle: public QProxyStyle { - Q_OBJECT -public: - ProxyStyle() : QProxyStyle() {} - virtual ~ProxyStyle() {} - virtual int styleHint(StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const; -}; - -class Application : public QApplication { - Q_OBJECT - Q_PROPERTY(bool desktopManagerEnabled READ desktopManagerEnabled) - -public: - Application(int& argc, char** argv); - virtual ~Application(); - - void init(); - int exec(); - - Settings& settings() { - return settings_; - } - - Fm::LibFmQt& libFm() { - return libFm_; - } - - // public interface exported via dbus - void launchFiles(QString cwd, QStringList paths, bool inNewWindow); - void setWallpaper(QString path, QString modeString); - void preferences(QString page); - void desktopPrefrences(QString page); - void editBookmarks(); - void desktopManager(bool enabled); - void findFiles(QStringList paths = QStringList()); - void connectToServer(); - - bool desktopManagerEnabled() { - return enableDesktopManager_; - } - - void updateFromSettings(); - void updateDesktopsFromSettings(bool changeSlide = true); - - void openFolderInTerminal(Fm::FilePath path); - void openFolders(Fm::FileInfoList files); - - QString profileName() { - return profileName_; - } - -protected Q_SLOTS: - void onAboutToQuit(); - void onSigtermNotified(); - - void onLastWindowClosed(); - void onSaveStateRequest(QSessionManager& manager); - void onScreenResized(int num); - void onScreenCountChanged(int newCount); - void initVolumeManager(); - - void onVirtualGeometryChanged(const QRect& rect); - void onScreenDestroyed(QObject* screenObj); - void onScreenAdded(QScreen* newScreen); - void reloadDesktopsAsNeeded(); - - void onFindFileAccepted(); - void onConnectToServerAccepted(); - -protected: - virtual bool eventFilter(QObject* watched, QEvent* event); - bool parseCommandLineArgs(); - DesktopWindow* createDesktopWindow(int screenNum); - bool autoMountVolume(GVolume* volume, bool interactive = true); - - static void onVolumeAdded(GVolumeMonitor* monitor, GVolume* volume, Application* pThis); - -private Q_SLOTS: - void onUserDirsChanged(); - -private: - void initWatch(); - void installSigtermHandler(); - - bool isPrimaryInstance; - Fm::LibFmQt libFm_; - Settings settings_; - QString profileName_; - bool daemonMode_; - bool enableDesktopManager_; - QVector desktopWindows_; - QPointer preferencesDialog_; - QPointer desktopPreferencesDialog_; - QPointer editBookmarksialog_; - QTranslator translator; - QTranslator qtTranslator; - GVolumeMonitor* volumeMonitor_; - - QFileSystemWatcher* userDirsWatcher_; - QString userDirsFile_; - QString userDesktopFolder_; - bool lxqtRunning_; - - int argc_; - char** argv_; -}; - -} - -#endif // PCMANFM_APPLICATION_H diff --git a/pcmanfm/autorun.ui b/pcmanfm/autorun.ui deleted file mode 100644 index e59a48a..0000000 --- a/pcmanfm/autorun.ui +++ /dev/null @@ -1,117 +0,0 @@ - - - AutoRunDialog - - - - 0 - 0 - 334 - 312 - - - - Removable medium is inserted - - - - ../../../.designer/backup../../../.designer/backup - - - - - - - - - - - - - - - <b>Removable medium is inserted</b> - - - - - - - Type of medium: - - - - - - - Detecting... - - - - - - - - - Please select the action you want to perform: - - - - - - - - 0 - 1 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - buttonBox - accepted() - AutoRunDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - AutoRunDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - - diff --git a/pcmanfm/autorundialog.cpp b/pcmanfm/autorundialog.cpp deleted file mode 100644 index 5d129b7..0000000 --- a/pcmanfm/autorundialog.cpp +++ /dev/null @@ -1,142 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "autorundialog.h" -#include -#include "application.h" -#include "mainwindow.h" -#include -#include - -namespace PCManFM { - -AutoRunDialog::AutoRunDialog(GVolume* volume, GMount* mount, QWidget* parent, Qt::WindowFlags f): - QDialog(parent, f), - cancellable(g_cancellable_new()), - applications(nullptr), - mount_(G_MOUNT(g_object_ref(mount))) { - - setAttribute(Qt::WA_DeleteOnClose); - ui.setupUi(this); - - GIcon* gicon = g_volume_get_icon(volume); - QIcon icon = Fm::IconInfo::fromGIcon(gicon)->qicon(); - ui.icon->setPixmap(icon.pixmap(QSize(48, 48))); - - // add actions - QListWidgetItem* item = new QListWidgetItem(QIcon::fromTheme("system-file-manager"), tr("Open in file manager")); - ui.listWidget->addItem(item); - - g_mount_guess_content_type(mount, TRUE, cancellable, (GAsyncReadyCallback)onContentTypeFinished, this); -} - -AutoRunDialog::~AutoRunDialog() { - g_list_foreach(applications, (GFunc)g_object_unref, nullptr); - g_list_free(applications); - - if(mount_) { - g_object_unref(mount_); - } - - if(cancellable) { - g_cancellable_cancel(cancellable); - g_object_unref(cancellable); - } -} - -void AutoRunDialog::accept() { - QListWidgetItem* item = ui.listWidget->selectedItems().first(); - if(item) { - GFile* gf = g_mount_get_root(mount_); - void* p = item->data(Qt::UserRole).value(); - if(p) { // run the selected application - GAppInfo* app = G_APP_INFO(p); - GList* filelist = g_list_prepend(nullptr, gf); - g_app_info_launch(app, filelist, nullptr, nullptr); - g_list_free(filelist); - } - else { - // the default action, open the mounted folder in the file manager - Application* app = static_cast(qApp); - Settings& settings = app->settings(); - Fm::FilePath path{gf, true}; - // open the path in a new window - // FIXME: or should we open it in a new tab? Make this optional later - MainWindow* win = new MainWindow(path); - win->resize(settings.windowWidth(), settings.windowHeight()); - if(settings.windowMaximized()) { - win->setWindowState(win->windowState() | Qt::WindowMaximized); - } - win->show(); - } - g_object_unref(gf); - } - QDialog::accept(); -} - -// static -void AutoRunDialog::onContentTypeFinished(GMount* mount, GAsyncResult* res, AutoRunDialog* pThis) { - if(pThis->cancellable) { - g_object_unref(pThis->cancellable); - pThis->cancellable = nullptr; - } - - char** types = g_mount_guess_content_type_finish(mount, res, nullptr); - char* desc = nullptr; - - if(types) { - if(types[0]) { - for(char** type = types; *type; ++type) { - GList* l = g_app_info_get_all_for_type(*type); - if(l) { - pThis->applications = g_list_concat(pThis->applications, l); - } - } - desc = g_content_type_get_description(types[0]); - } - g_strfreev(types); - - if(pThis->applications) { - int pos = 0; - for(GList* l = pThis->applications; l; l = l->next, ++pos) { - GAppInfo* app = G_APP_INFO(l->data); - GIcon* gicon = g_app_info_get_icon(app); - QIcon icon = Fm::IconInfo::fromGIcon(gicon)->qicon(); - QString text = QString::fromUtf8(g_app_info_get_name(app)); - QListWidgetItem* item = new QListWidgetItem(icon, text); - item->setData(Qt::UserRole, qVariantFromValue(app)); - pThis->ui.listWidget->insertItem(pos, item); - } - } - } - - if(desc) { - pThis->ui.mediumType->setText(QString::fromUtf8(desc)); - g_free(desc); - } - else { - pThis->ui.mediumType->setText(tr("Removable Disk")); - } - - // select the first item - pThis->ui.listWidget->item(0)->setSelected(true); -} - -} // namespace PCManFM diff --git a/pcmanfm/autorundialog.h b/pcmanfm/autorundialog.h deleted file mode 100644 index 44f4f81..0000000 --- a/pcmanfm/autorundialog.h +++ /dev/null @@ -1,54 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_AUTORUNDIALOG_H -#define PCMANFM_AUTORUNDIALOG_H - -#include -#include "ui_autorun.h" -#include - -namespace PCManFM { - -class AutoRunDialog : public QDialog { -Q_OBJECT - -public: - explicit AutoRunDialog(GVolume* volume, GMount* mount, QWidget* parent = 0, Qt::WindowFlags f = 0); - virtual ~AutoRunDialog(); - - virtual void accept(); - -private Q_SLOTS: - -private: - - static void onContentTypeFinished(GMount* mount, GAsyncResult* res, AutoRunDialog* pThis); - -private: - Ui::AutoRunDialog ui; - GCancellable* cancellable; - GList* applications; - GMount* mount_; -}; - -} - -#endif // PCMANFM_AUTORUNDIALOG_H diff --git a/pcmanfm/bulk-rename.ui b/pcmanfm/bulk-rename.ui deleted file mode 100644 index 8efb4cc..0000000 --- a/pcmanfm/bulk-rename.ui +++ /dev/null @@ -1,92 +0,0 @@ - - - BulkRenameDialog - - - Bulk Rename - - - - 4 - - - - - -1000 - - - 1000 - - - - - - - Qt::Vertical - - - QSizePolicy::MinimumExpanding - - - - 5 - 5 - - - - - - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - # will be replaced by numbers starting with: - - - - - - - Qt::Horizontal - - - QSizePolicy::MinimumExpanding - - - - 5 - 5 - - - - - - - - Rename selected files to: - - - - - - - - 0 - 0 - - - - Name# - - - - - - - - diff --git a/pcmanfm/bulkrename.cpp b/pcmanfm/bulkrename.cpp deleted file mode 100644 index 59a6643..0000000 --- a/pcmanfm/bulkrename.cpp +++ /dev/null @@ -1,103 +0,0 @@ -/* - Copyright (C) 2017 Pedram Pourang (Tsu Jan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "bulkrename.h" -#include -#include -#include -#include - -#include - -namespace PCManFM { - -BulkRenameDialog::BulkRenameDialog(QWidget* parent, Qt::WindowFlags flags) : - QDialog(parent, flags) { - ui.setupUi(this); - ui.lineEdit->setFocus(); - connect(ui.buttonBox->button(QDialogButtonBox::Ok), &QAbstractButton::clicked, this, &QDialog::accept); - connect(ui.buttonBox->button(QDialogButtonBox::Cancel), &QAbstractButton::clicked, this, &QDialog::reject); - resize(minimumSize()); - setMaximumHeight(minimumHeight()); // no vertical resizing -} - -void BulkRenameDialog::showEvent(QShowEvent* event) { - QDialog::showEvent(event); - if(ui.lineEdit->text().endsWith(QLatin1Char('#'))) { // select what's before "#" - QTimer::singleShot(0, [this]() { - ui.lineEdit->setSelection(0, ui.lineEdit->text().size() - 1); - }); - } -} - -BulkRenamer::BulkRenamer(const Fm::FileInfoList& files, QWidget* parent) { - if(files.size() <= 1) { // no bulk rename with just one file - return; - } - QString baseName; - int start = 0; - BulkRenameDialog dlg(parent); - switch(dlg.exec()) { - case QDialog::Accepted: - baseName = dlg.getBaseName(); - start = dlg.getStart(); - break; - default: - return; - } - - if(!baseName.contains(QLatin1Char('#'))) { - // insert "#" before the last dot - int end = baseName.lastIndexOf(QLatin1Char('.')); - if(end == -1) { - end = baseName.size(); - } - baseName.insert(end, QLatin1Char('#')); - } - QProgressDialog progress(QObject::tr("Renaming files..."), QObject::tr("Abort"), 0, files.size(), parent); - progress.setWindowModality(Qt::WindowModal); - int i = 0, failed = 0; - for(auto& file: files) { - progress.setValue(i); - if(progress.wasCanceled()) { - progress.close(); - QMessageBox::warning(parent, QObject::tr("Warning"), QObject::tr("Renaming is aborted.")); - return; - } - auto fileName = QString::fromStdString(file->name()); - QString newName = baseName; - newName.replace(QLatin1Char('#'), QString::number(start + i)); - if (newName == fileName || !Fm::changeFileName(file->path(), newName, nullptr, false)) { - ++failed; - } - ++i; - } - progress.setValue(i); - if(failed == i) { - QMessageBox::critical(parent, QObject::tr("Error"), QObject::tr("No file could be renamed.")); - } - else if(failed > 0) { - QMessageBox::critical(parent, QObject::tr("Error"), QObject::tr("Some files could not be renamed.")); - } -} - -BulkRenamer::~BulkRenamer() { - -} - -} //namespace PCManFM diff --git a/pcmanfm/bulkrename.h b/pcmanfm/bulkrename.h deleted file mode 100644 index 7be8d15..0000000 --- a/pcmanfm/bulkrename.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - Copyright (C) 2017 Pedram Pourang (Tsu Jan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#ifndef PCMANFM_BULKRENAME_H -#define PCMANFM_BULKRENAME_H - -#include "ui_bulk-rename.h" -#include - -#include - -namespace PCManFM { - -class BulkRenameDialog : public QDialog { -Q_OBJECT - -public: - explicit BulkRenameDialog(QWidget* parent = nullptr, Qt::WindowFlags flags = 0); - - QString getBaseName() const { - return ui.lineEdit->text(); - } - int getStart() const { - return ui.spinBox->value(); - } - -protected: - virtual void showEvent(QShowEvent* event) override; - -private: - Ui::BulkRenameDialog ui; -}; - -class BulkRenamer { -public: - BulkRenamer(const Fm::FileInfoList& files, QWidget* parent = nullptr); - ~BulkRenamer(); -}; - -} - -#endif // PCMANFM_BULKRENAME_H diff --git a/pcmanfm/connect.ui b/pcmanfm/connect.ui deleted file mode 100644 index 5238e00..0000000 --- a/pcmanfm/connect.ui +++ /dev/null @@ -1,173 +0,0 @@ - - - ConnectServerDialog - - - - 0 - 0 - 450 - 256 - - - - Connect to remote server - - - - - - - - - Anonymous &login - - - true - - - - - - - - - - Login as &user: - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - 0 - 0 - - - - Specify remote folder to connect - - - - - - - Type: - - - - - - - Port: - - - - - - - Path: - - - - - - - - - - Host: - - - - - - - 65535 - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - buttonBox - accepted() - ConnectServerDialog - accept() - - - 254 - 249 - - - 157 - 274 - - - - - buttonBox - rejected() - ConnectServerDialog - reject() - - - 322 - 249 - - - 286 - 274 - - - - - loginAsUser - toggled(bool) - userName - setEnabled(bool) - - - 65 - 194 - - - 163 - 184 - - - - - diff --git a/pcmanfm/connectserverdialog.cpp b/pcmanfm/connectserverdialog.cpp deleted file mode 100644 index 741973c..0000000 --- a/pcmanfm/connectserverdialog.cpp +++ /dev/null @@ -1,88 +0,0 @@ -#include "connectserverdialog.h" -#include -#include - -namespace PCManFM { - -ConnectServerDialog::ConnectServerDialog(QWidget *parent): QDialog(parent) { - serverTypes = QList{ - {tr("SSH"), "sftp", 22, false}, - {tr("FTP"), "ftp", 21, true}, - {tr("WebDav"), "dav", 80, true}, - {tr("Secure WebDav"), "davs", 443, false}, - {tr("HTTP"), "http", 80, true}, - {tr("HTTPS"), "https", 443, true}, - }; - - ui.setupUi(this); - - connect(ui.serverType, static_cast(&QComboBox::currentIndexChanged), - this, &ConnectServerDialog::onCurrentIndexChanged); - - connect(ui.host, &QLineEdit::textChanged, this, &ConnectServerDialog::checkInput); - connect(ui.userName, &QLineEdit::textChanged, this, &ConnectServerDialog::checkInput); - for(const auto& serverType : const_cast&>(serverTypes)) { - ui.serverType->addItem(serverType.name); - } - - ui.serverType->setCurrentIndex(0); - onCurrentIndexChanged(0); -} - -ConnectServerDialog::~ConnectServerDialog() { -} - - -QString ConnectServerDialog::uriText() { - QString uri; - int serverTypeIdx = ui.serverType->currentIndex(); - const auto& serverType = serverTypes[serverTypeIdx]; - - // make an URI from the data - uri = QString::fromLatin1(serverType.scheme); - uri += QStringLiteral("://"); - if(ui.loginAsUser->isChecked()) { - uri += ui.userName->text(); - uri += '@'; - } - - uri += ui.host->text(); - int port = ui.port->value(); - if(port != serverType.defaultPort) { - uri += ':'; - uri += QString::number(port); - } - - QString path = ui.path->text(); - if(path.isEmpty() || path[0] != '/') { - uri += '/'; - } - uri += path; - return uri; -} - -void ConnectServerDialog::onCurrentIndexChanged(int /*index*/) { - int serverTypeIdx = ui.serverType->currentIndex(); - const auto& serverType = serverTypes[serverTypeIdx]; - ui.port->setValue(serverType.defaultPort); - ui.ananymousLogin->setEnabled(serverType.canAnonymous); - if(serverType.canAnonymous) - ui.ananymousLogin->setChecked(true); - else - ui.loginAsUser->setChecked(true); - ui.host->setFocus(); - checkInput(); -} - -void ConnectServerDialog::checkInput() { - bool valid = true; - if(ui.host->text().isEmpty()) { - valid = false; - } - else if(ui.loginAsUser->isChecked() && ui.userName->text().isEmpty()) { - valid = false; - } - ui.buttonBox->button(QDialogButtonBox::Ok)->setEnabled(valid); -} - -} // namespace PCManFM diff --git a/pcmanfm/connectserverdialog.h b/pcmanfm/connectserverdialog.h deleted file mode 100644 index 7c19a27..0000000 --- a/pcmanfm/connectserverdialog.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef CONNECTSERVERDIALOG_H -#define CONNECTSERVERDIALOG_H - -#include -#include -#include "ui_connect.h" - -namespace PCManFM { - -class ConnectServerDialog : public QDialog { - Q_OBJECT - -public: - ConnectServerDialog(QWidget* parent=nullptr); - virtual ~ConnectServerDialog(); - - QString uriText(); - -private: - struct ServerType { - QString name; - const char* scheme; - int defaultPort; - bool canAnonymous; - }; - -private Q_SLOTS: - void onCurrentIndexChanged(int index); - void checkInput(); - -private: - Ui::ConnectServerDialog ui; - QList serverTypes; -}; - -} // namespace PCManFM - -#endif // CONNECTSERVERDIALOG_H diff --git a/pcmanfm/desktop-folder.ui b/pcmanfm/desktop-folder.ui deleted file mode 100644 index 4e4829c..0000000 --- a/pcmanfm/desktop-folder.ui +++ /dev/null @@ -1,60 +0,0 @@ - - - DesktopFolder - - - - 0 - 0 - 352 - 81 - - - - Form - - - - - - true - - - Desktop - - - - - - Desktop folder: - - - - - - - Image file - - - - - - Folder path - - - - - - - &Browse - - - - - - - - - - - diff --git a/pcmanfm/desktop-preferences.ui b/pcmanfm/desktop-preferences.ui deleted file mode 100644 index 65f59e8..0000000 --- a/pcmanfm/desktop-preferences.ui +++ /dev/null @@ -1,548 +0,0 @@ - - - DesktopPreferencesDialog - - - - 0 - 0 - 534 - 434 - - - - Desktop Preferences - - - - - - 0 - - - - General - - - - - - Background - - - - - - - 0 - 0 - - - - - - - - - 0 - 0 - - - - Wallpaper mode: - - - - - - - - 0 - 0 - - - - Wallpaper image file: - - - - - - - - 0 - 0 - - - - - - - - - - - Select background color: - - - - - - - - - Image file - - - - - - Image file path - - - - - - - &Browse - - - - - - - - - - - - Icons - - - - - - Icon size: - - - - - - - - - - - - - Label Text - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - - - - - - - - - 0 - 0 - - - - Select text color: - - - - - - - - 0 - 0 - - - - Select shadow color: - - - - - - - - 0 - 0 - - - - Select font: - - - - - - - - 0 - 0 - - - - - - - - - - - - - - Spacing - - - - - - Minimum item margins: - - - - - - - 3 px by default. - - - px - - - 48 - - - 3 - - - - - - - x - - - - - - - 1 px by default. -A space is also reserved for 3 lines of text. - - - px - - - 48 - - - 1 - - - - - - - Lock - - - - - - - Qt::Horizontal - - - - 20 - 5 - - - - - - - - - - - Qt::Vertical - - - - 20 - 10 - - - - - - - - - Slide Show - - - - - - Enable Slide Show - - - true - - - false - - - - - - Wallpaper image folder: - - - - - - - Browse - - - - - - - hour(s) - - - 24 - - - - - - - and - - - Qt::AlignCenter - - - 5 - - - - - - - Intervals less than 5min will be ignored - - - Interval: - - - - - - - minute(s) - - - 55 - - - 5 - - - - - - - Qt::Horizontal - - - - 10 - 5 - - - - - - - - Wallpaper folder - - - - - - - Qt::Horizontal - - - QSizePolicy::Minimum - - - - 5 - 5 - - - - - - - - Randomize the slide show - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - Advanced - - - - - - Window Manager - - - - - - Show menus provided by window managers when desktop is clicked - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - Fm::ColorButton - QPushButton -
libfm-qt/colorbutton.h
-
- - Fm::FontButton - QPushButton -
libfm-qt/fontbutton.h
-
-
- - - - buttonBox - accepted() - DesktopPreferencesDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - DesktopPreferencesDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - - -
diff --git a/pcmanfm/desktoppreferencesdialog.cpp b/pcmanfm/desktoppreferencesdialog.cpp deleted file mode 100644 index 8f3c1a9..0000000 --- a/pcmanfm/desktoppreferencesdialog.cpp +++ /dev/null @@ -1,261 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "desktoppreferencesdialog.h" -#include "desktopwindow.h" -#include "settings.h" -#include "application.h" -#include "xdgdir.h" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace PCManFM { - -static int iconSizes[] = {96, 72, 64, 48, 36, 32, 24, 20}; - -DesktopPreferencesDialog::DesktopPreferencesDialog(QWidget* parent, Qt::WindowFlags f): - QDialog(parent, f), - editDesktopFolderEnabled(false), - desktopFolderWidget(0), - desktopFolder() { - - - setAttribute(Qt::WA_DeleteOnClose); - - Settings& settings = static_cast(qApp)->settings(); - ui.setupUi(this); - - // setup wallpaper modes - connect(ui.wallpaperMode, static_cast(&QComboBox::currentIndexChanged), this, &DesktopPreferencesDialog::onWallpaperModeChanged); - ui.wallpaperMode->addItem(tr("Fill with background color only"), DesktopWindow::WallpaperNone); - ui.wallpaperMode->addItem(tr("Stretch to fill the entire screen"), DesktopWindow::WallpaperStretch); - ui.wallpaperMode->addItem(tr("Stretch to fit the screen"), DesktopWindow::WallpaperFit); - ui.wallpaperMode->addItem(tr("Center on the screen"), DesktopWindow::WallpaperCenter); - ui.wallpaperMode->addItem(tr("Tile the image to fill the entire screen"), DesktopWindow::WallpaperTile); - ui.wallpaperMode->addItem(tr("Zoom the image to fill the entire screen"), DesktopWindow::WallpaperZoom); - int i; - switch(settings.wallpaperMode()) { - case DesktopWindow::WallpaperNone: - i = 0; - break; - case DesktopWindow::WallpaperStretch: - i = 1; - break; - case DesktopWindow::WallpaperFit: - i = 2; - break; - case DesktopWindow::WallpaperCenter: - i = 3; - break; - case DesktopWindow::WallpaperTile: - i = 4; - break; - case DesktopWindow::WallpaperZoom: - i = 5; - break; - default: - i = 0; - } - ui.wallpaperMode->setCurrentIndex(i); - - connect(ui.browse, &QPushButton::clicked, this, &DesktopPreferencesDialog::onBrowseClicked); - qDebug("wallpaper: %s", settings.wallpaper().toUtf8().data()); - ui.imageFile->setText(settings.wallpaper()); - - ui.slideShow->setChecked(settings.slideShowInterval() > 0); - ui.imageFolder->setText(settings.wallpaperDir()); - int minutes = qMax(settings.slideShowInterval() / 60000, 5); // 5 min at least - ui.hours->setValue(minutes / 60); - ui.minutes->setValue(minutes % 60); - ui.randomize->setChecked(settings.wallpaperRandomize()); - connect(ui.folderBrowse, &QPushButton::clicked, this, &DesktopPreferencesDialog::onFolderBrowseClicked); - - for(std::size_t i = 0; i < G_N_ELEMENTS(iconSizes); ++i) { - int size = iconSizes[i]; - ui.iconSize->addItem(QString("%1 x %1").arg(size), size); - if(settings.desktopIconSize() == size) - ui.iconSize->setCurrentIndex(i); - } - - ui.font->setFont(settings.desktopFont()); - - ui.backgroundColor->setColor(settings.desktopBgColor()); - ui.textColor->setColor(settings.desktopFgColor()); - ui.shadowColor->setColor(settings.desktopShadowColor()); - ui.showWmMenu->setChecked(settings.showWmMenu()); - - connect(ui.buttonBox->button(QDialogButtonBox::Apply), &QPushButton::clicked, - this, &DesktopPreferencesDialog::onApplyClicked); - - ui.hMargin->setValue(settings.desktopCellMargins().width()); - ui.vMargin->setValue(settings.desktopCellMargins().height()); - connect(ui.lockMargins, &QAbstractButton::clicked, this, &DesktopPreferencesDialog::lockMargins); -} - -DesktopPreferencesDialog::~DesktopPreferencesDialog() { -} - -void DesktopPreferencesDialog::setupDesktopFolderUi() -{ - desktopFolderWidget = new QWidget(); - uiDesktopFolder.setupUi(desktopFolderWidget); - ui.advancedPageLayout->insertWidget(1, desktopFolderWidget); - uiDesktopFolder.verticalLayout->setMargin(0); - - desktopFolder = XdgDir::readDesktopDir(); - qDebug("desktop folder: %s", desktopFolder.toStdString().c_str()); - - uiDesktopFolder.desktopFolder->setText(desktopFolder); - - connect(uiDesktopFolder.browseDesktopFolder, &QPushButton::clicked, - this, &DesktopPreferencesDialog::onBrowseDesktopFolderClicked); -} - -void DesktopPreferencesDialog::lockMargins(bool lock) { - ui.vMargin->setDisabled(lock); - if(lock) { - ui.vMargin->setValue(ui.hMargin->value()); - connect(ui.hMargin, static_cast(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue); - } - else - disconnect(ui.hMargin, static_cast(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue); -} - -void DesktopPreferencesDialog::applySettings() -{ - Settings& settings = static_cast(qApp)->settings(); - - if (editDesktopFolderEnabled) - XdgDir::setDesktopDir(uiDesktopFolder.desktopFolder->text()); - - settings.setWallpaper(ui.imageFile->text()); - int mode = ui.wallpaperMode->itemData(ui.wallpaperMode->currentIndex()).toInt(); - settings.setWallpaperMode(mode); - - settings.setWallpaperDir(ui.imageFolder->text()); - int interval = 0; - if(ui.slideShow->isChecked()) - interval = (ui.minutes->value() + 60 * ui.hours->value()) * 60000; - settings.setSlideShowInterval(interval); - settings.setWallpaperRandomize(ui.randomize->isChecked()); - - settings.setDesktopIconSize(ui.iconSize->itemData(ui.iconSize->currentIndex()).toInt()); - - settings.setDesktopFont(ui.font->font()); - settings.setDesktopBgColor(ui.backgroundColor->color()); - settings.setDesktopFgColor(ui.textColor->color()); - settings.setDesktopShadowColor(ui.shadowColor->color()); - settings.setShowWmMenu(ui.showWmMenu->isChecked()); - - settings.setDesktopCellMargins(QSize(ui.hMargin->value(), ui.vMargin->value())); - - settings.save(); -} - -void DesktopPreferencesDialog::onApplyClicked() -{ - applySettings(); - static_cast(qApp)->updateDesktopsFromSettings(); -} - -void DesktopPreferencesDialog::accept() { - applySettings(); - static_cast(qApp)->updateDesktopsFromSettings(false); // don't change slide wallpaper on clicking OK - QDialog::accept(); -} - -void DesktopPreferencesDialog::onWallpaperModeChanged(int index) { - int mode = ui.wallpaperMode->itemData(index).toInt(); - - bool enable = (mode != DesktopWindow::WallpaperNone); - ui.imageFile->setEnabled(enable); - ui.browse->setEnabled(enable); -} - -void DesktopPreferencesDialog::onBrowseClicked() { - QFileDialog dlg; - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setFileMode(QFileDialog::ExistingFile); - // compose a name fileter from QImageReader - QString filter; - filter.reserve(256); - filter = tr("Image Files"); - filter += " ("; - const QList formats = QImageReader::supportedImageFormats(); - for(const QByteArray& format : formats) { - filter += "*."; - filter += format.toLower(); - filter += ' '; - } - filter += ')'; - dlg.setNameFilter(filter); - dlg.setNameFilterDetailsVisible(false); - if(dlg.exec() == QDialog::Accepted) { - QString filename; - filename = dlg.selectedFiles().constFirst(); - ui.imageFile->setText(filename); - } -} - -void DesktopPreferencesDialog::onFolderBrowseClicked() { - QFileDialog dlg; - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setFileMode(QFileDialog::Directory); - dlg.setOption(QFileDialog::ShowDirsOnly); - dlg.setDirectory(QDir::home().path()); - if(dlg.exec() == QDialog::Accepted) { - QString foldername; - foldername = dlg.selectedFiles().constFirst(); - ui.imageFolder->setText(foldername); - } -} - -void DesktopPreferencesDialog::onBrowseDesktopFolderClicked() -{ - QFileDialog dlg; - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setAcceptMode(QFileDialog::AcceptOpen); - dlg.setFileMode(QFileDialog::DirectoryOnly); - if (dlg.exec() == QDialog::Accepted) { - QString dir; - dir = dlg.selectedFiles().constFirst(); - uiDesktopFolder.desktopFolder->setText(dir); - } -} - -void DesktopPreferencesDialog::selectPage(QString name) { - QWidget* page = findChild(name + "Page"); - if(page) - ui.tabWidget->setCurrentWidget(page); -} - -void DesktopPreferencesDialog::setEditDesktopFolder(const bool enabled) -{ - editDesktopFolderEnabled = enabled; - if (editDesktopFolderEnabled) - setupDesktopFolderUi(); -} - -} // namespace PCManFM diff --git a/pcmanfm/desktoppreferencesdialog.h b/pcmanfm/desktoppreferencesdialog.h deleted file mode 100644 index 31a4fb0..0000000 --- a/pcmanfm/desktoppreferencesdialog.h +++ /dev/null @@ -1,68 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_DESKTOPPREFERENCESDIALOG_H -#define PCMANFM_DESKTOPPREFERENCESDIALOG_H - -#include -#include "ui_desktop-preferences.h" - -#include "ui_desktop-folder.h" - -namespace PCManFM { - -class DesktopPreferencesDialog : public QDialog { -Q_OBJECT - -public: - explicit DesktopPreferencesDialog(QWidget* parent = 0, Qt::WindowFlags f = 0); - virtual ~DesktopPreferencesDialog(); - - virtual void accept(); - - void selectPage(QString name); - - // Should only be used one time. - void setEditDesktopFolder(const bool enabled); - -protected Q_SLOTS: - void onApplyClicked(); - void onWallpaperModeChanged(int index); - void onBrowseClicked(); - void onFolderBrowseClicked(); - void onBrowseDesktopFolderClicked(); - void lockMargins(bool lock); - - void applySettings(); - -private: - Ui::DesktopPreferencesDialog ui; - Ui::DesktopFolder uiDesktopFolder; - - bool editDesktopFolderEnabled; - QWidget* desktopFolderWidget; - QString desktopFolder; - - void setupDesktopFolderUi(); -}; - -} - -#endif // PCMANFM_DESKTOPPREFERENCESDIALOG_H diff --git a/pcmanfm/desktopwindow.cpp b/pcmanfm/desktopwindow.cpp deleted file mode 100644 index abe9061..0000000 --- a/pcmanfm/desktopwindow.cpp +++ /dev/null @@ -1,1339 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "desktopwindow.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "./application.h" -#include "mainwindow.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "xdgdir.h" -#include "bulkrename.h" - -#include -#include -#include -#include - -#define MIN_SLIDE_INTERVAL 5*60000 // 5 min -#define MAX_SLIDE_INTERVAL (24*60+55)*60000 // 24 h and 55 min - -namespace PCManFM { - -DesktopWindow::DesktopWindow(int screenNum): - View(Fm::FolderView::IconMode), - proxyModel_(nullptr), - model_(nullptr), - wallpaperMode_(WallpaperNone), - slideShowInterval_(0), - wallpaperTimer_(nullptr), - wallpaperRandomize_(false), - fileLauncher_(nullptr), - showWmMenu_(false), - desktopHideItems_(false), - screenNum_(screenNum), - relayoutTimer_(nullptr), - selectionTimer_(nullptr) { - - QDesktopWidget* desktopWidget = QApplication::desktop(); - setWindowFlags(Qt::Window | Qt::FramelessWindowHint); - setAttribute(Qt::WA_X11NetWmWindowTypeDesktop); - setAttribute(Qt::WA_DeleteOnClose); - - // set our custom file launcher - View::setFileLauncher(&fileLauncher_); - - listView_ = static_cast(childView()); - listView_->setMovement(QListView::Snap); - listView_->setResizeMode(QListView::Adjust); - listView_->setFlow(QListView::TopToBottom); - - // This is to workaround Qt bug 54384 which affects Qt >= 5.6 - // https://bugreports.qt.io/browse/QTBUG-54384 - // Setting a QPixmap larger then the screen resolution to desktop's QPalette won't work. - // So we make the viewport transparent by preventing its backround from being filled automatically. - // Then we paint desktop's background ourselves by using its paint event handling method. - listView_->viewport()->setAutoFillBackground(false); - - // NOTE: When XRnadR is in use, the all screens are actually combined to form a - // large virtual desktop and only one DesktopWindow needs to be created and screenNum is -1. - // In some older multihead setups, such as xinerama, every physical screen - // is treated as a separate desktop so many instances of DesktopWindow may be created. - // In this case we only want to show desktop icons on the primary screen. - if(desktopWidget->isVirtualDesktop() || screenNum_ == desktopWidget->primaryScreen()) { - loadItemPositions(); - Settings& settings = static_cast(qApp)->settings(); - - auto desktopPath = Fm::FilePath::fromLocalPath(XdgDir::readDesktopDir().toStdString().c_str()); - model_ = Fm::CachedFolderModel::modelFromPath(desktopPath); - folder_ = model_->folder(); - connect(folder_.get(), &Fm::Folder::startLoading, this, &DesktopWindow::onFolderStartLoading); - connect(folder_.get(), &Fm::Folder::finishLoading, this, &DesktopWindow::onFolderFinishLoading); - - proxyModel_ = new Fm::ProxyFolderModel(); - proxyModel_->setSourceModel(model_); - proxyModel_->setShowThumbnails(settings.showThumbnails()); - proxyModel_->sort(settings.desktopSortColumn(), settings.desktopSortOrder()); - proxyModel_->setFolderFirst(settings.desktopSortFolderFirst()); - setModel(proxyModel_); - - connect(proxyModel_, &Fm::ProxyFolderModel::rowsInserted, this, &DesktopWindow::onRowsInserted); - connect(proxyModel_, &Fm::ProxyFolderModel::rowsAboutToBeRemoved, this, &DesktopWindow::onRowsAboutToBeRemoved); - connect(proxyModel_, &Fm::ProxyFolderModel::layoutChanged, this, &DesktopWindow::onLayoutChanged); - connect(proxyModel_, &Fm::ProxyFolderModel::sortFilterChanged, this, &DesktopWindow::onModelSortFilterChanged); - connect(proxyModel_, &Fm::ProxyFolderModel::dataChanged, this, &DesktopWindow::onDataChanged); - connect(listView_, &QListView::indexesMoved, this, &DesktopWindow::onIndexesMoved); - } - - // remove frame - listView_->setFrameShape(QFrame::NoFrame); - // inhibit scrollbars FIXME: this should be optional in the future - listView_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - listView_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - connect(this, &DesktopWindow::openDirRequested, this, &DesktopWindow::onOpenDirRequested); - - listView_->installEventFilter(this); - listView_->viewport()->installEventFilter(this); - - // setup shortcuts - QShortcut* shortcut; - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_X), this); // cut - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCutActivated); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_C), this); // copy - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onCopyActivated); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_V), this); // paste - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onPasteActivated); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_A), this); // select all - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::selectAll); - - shortcut = new QShortcut(QKeySequence(Qt::Key_Delete), this); // delete - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); - - shortcut = new QShortcut(QKeySequence(Qt::Key_F2), this); // rename - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onRenameActivated); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F2), this); // bulk rename - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onBulkRenameActivated); - - shortcut = new QShortcut(QKeySequence(Qt::ALT + Qt::Key_Return), this); // properties - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onFilePropertiesActivated); - - shortcut = new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete), this); // force delete - connect(shortcut, &QShortcut::activated, this, &DesktopWindow::onDeleteActivated); -} - -DesktopWindow::~DesktopWindow() { - listView_->viewport()->removeEventFilter(this); - listView_->removeEventFilter(this); - - disconnect(folder_.get(), nullptr, this, nullptr); - - if(relayoutTimer_) { - relayoutTimer_->stop(); - delete relayoutTimer_; - } - - if(wallpaperTimer_) { - wallpaperTimer_->stop(); - delete wallpaperTimer_; - } - - if(proxyModel_) { - delete proxyModel_; - } - - if(model_) { - disconnect(model_, &Fm::FolderModel::filesAdded, this, &DesktopWindow::onFilesAdded); - model_->unref(); - } -} - -void DesktopWindow::setBackground(const QColor& color) { - bgColor_ = color; -} - -void DesktopWindow::setForeground(const QColor& color) { - QPalette p = listView_->palette(); - p.setBrush(QPalette::Text, color); - listView_->setPalette(p); - fgColor_ = color; -} - -void DesktopWindow::setShadow(const QColor& color) { - shadowColor_ = color; - auto delegate = static_cast(listView_->itemDelegateForColumn(Fm::FolderModel::ColumnFileName)); - delegate->setShadowColor(color); -} - -void DesktopWindow::onOpenDirRequested(const Fm::FilePath& path, int target) { - Q_UNUSED(target); - // open in new window unconditionally. - Application* app = static_cast(qApp); - MainWindow* newWin = new MainWindow(path); - // apply window size from app->settings - newWin->resize(app->settings().windowWidth(), app->settings().windowHeight()); - newWin->show(); -} - -void DesktopWindow::resizeEvent(QResizeEvent* event) { - QWidget::resizeEvent(event); - - // resize wall paper if needed - if(isVisible() && wallpaperMode_ != WallpaperNone && wallpaperMode_ != WallpaperTile) { - updateWallpaper(); - update(); - } - queueRelayout(100); // Qt use a 100 msec delay for relayout internally so we use it, too. -} - -void DesktopWindow::setDesktopFolder() { - if(folder_) { - // free the previous model and folder - if(model_) { - disconnect(model_, &Fm::FolderModel::filesAdded, this, &DesktopWindow::onFilesAdded); - proxyModel_->setSourceModel(nullptr); - model_->unref(); // unref the cached model - model_ = nullptr; - } - disconnect(folder_.get(), nullptr, this, nullptr); - folder_ = nullptr; - } - - auto path = Fm::FilePath::fromLocalPath(XdgDir::readDesktopDir().toStdString().c_str()); - model_ = Fm::CachedFolderModel::modelFromPath(path); - folder_ = model_->folder(); - connect(folder_.get(), &Fm::Folder::startLoading, this, &DesktopWindow::onFolderStartLoading); - connect(folder_.get(), &Fm::Folder::finishLoading, this, &DesktopWindow::onFolderFinishLoading); - proxyModel_->setSourceModel(model_); - if(folder_->isLoaded()) { - onFolderStartLoading(); - onFolderFinishLoading(); - } - else { - onFolderStartLoading(); - } -} - -void DesktopWindow::setWallpaperFile(QString filename) { - wallpaperFile_ = filename; -} - -void DesktopWindow::setWallpaperMode(WallpaperMode mode) { - wallpaperMode_ = mode; -} - -void DesktopWindow::setLastSlide(QString filename) { - lastSlide_ = filename; -} - -void DesktopWindow::setWallpaperDir(QString dirname) { - wallpaperDir_ = dirname; -} - -void DesktopWindow::setSlideShowInterval(int interval) { - slideShowInterval_ = interval; -} - -void DesktopWindow::setWallpaperRandomize(bool randomize) { - wallpaperRandomize_ = randomize; -} - -QImage DesktopWindow::loadWallpaperFile(QSize requiredSize) { - // NOTE: for ease of programming, we only use the cache for the primary screen. - bool useCache = (screenNum_ == -1 || screenNum_ == 0); - QFile info; - QString cacheFileName; - if(useCache) { - // see if we have a scaled version cached on disk - cacheFileName = QString::fromLocal8Bit(qgetenv("XDG_CACHE_HOME")); - if(cacheFileName.isEmpty()) { - cacheFileName = QDir::homePath() % QLatin1String("/.cache"); - } - Application* app = static_cast(qApp); - cacheFileName += QLatin1String("/pcmanfm-qt/") % app->profileName(); - QDir().mkpath(cacheFileName); // ensure that the cache dir exists - cacheFileName += QLatin1String("/wallpaper.cache"); - - // read info file - QString origin; - info.setFileName(cacheFileName % ".info"); - if(info.open(QIODevice::ReadOnly)) { - // FIXME: we need to compare mtime to see if the cache is out of date - origin = QString::fromLocal8Bit(info.readLine()); - info.close(); - if(!origin.isEmpty()) { - // try to see if we can get the size of the cached image. - QImageReader reader(cacheFileName); - reader.setAutoDetectImageFormat(true); - QSize cachedSize = reader.size(); - qDebug() << "size of cached file" << cachedSize << ", requiredSize:" << requiredSize; - if(cachedSize.isValid()) { - if(cachedSize == requiredSize) { // see if the cached wallpaper has the size we want - QImage image = reader.read(); // return the loaded image - qDebug() << "origin" << origin; - if(origin == wallpaperFile_) { - return image; - } - } - } - } - } - qDebug() << "no cached wallpaper. generate a new one!"; - } - - // we don't have a cached scaled image, load the original file - QImage image(wallpaperFile_); - qDebug() << "size of original image" << image.size(); - if(image.isNull() || image.size() == requiredSize) { // if the original size is what we want - return image; - } - - // scale the original image - QImage scaled = image.scaled(requiredSize.width(), requiredSize.height(), Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - // FIXME: should we save the scaled image if its size is larger than the original image? - - if(useCache) { - // write the path of the original image to the .info file - if(info.open(QIODevice::WriteOnly)) { - info.write(wallpaperFile_.toLocal8Bit()); - info.close(); - - // write the scaled cache image to disk - const char* format; // we keep jpg format for *.jpg files, and use png format for others. - if(wallpaperFile_.endsWith(QLatin1String(".jpg"), Qt::CaseInsensitive) || wallpaperFile_.endsWith(QLatin1String(".jpeg"), Qt::CaseInsensitive)) { - format = "JPG"; - } - else { - format = "PNG"; - } - scaled.save(cacheFileName, format); - } - qDebug() << "wallpaper cached saved to " << cacheFileName; - // FIXME: we might delay the write of the cached image? - } - return scaled; -} - -// really generate the background pixmap according to current settings and apply it. -void DesktopWindow::updateWallpaper() { - if(wallpaperMode_ != WallpaperNone) { // use wallpaper - QPixmap pixmap; - QImage image; - if(wallpaperMode_ == WallpaperTile) { // use the original size - image = QImage(wallpaperFile_); - // Note: We can't use the QPainter::drawTiledPixmap(), because it doesn't tile - // correctly for background pixmaps bigger than the current screen size. - const QSize s = size(); - pixmap = QPixmap{s}; - QPainter painter{&pixmap}; - for (int x = 0; x < s.width(); x += image.width()) { - for (int y = 0; y < s.height(); y += image.height()) { - painter.drawImage(x, y, image); - } - } - } - else if(wallpaperMode_ == WallpaperStretch) { - image = loadWallpaperFile(size()); - pixmap = QPixmap::fromImage(image); - } - else { // WallpaperCenter || WallpaperFit - if(wallpaperMode_ == WallpaperCenter) { - image = QImage(wallpaperFile_); // load original image - } - else if(wallpaperMode_ == WallpaperFit || wallpaperMode_ == WallpaperZoom) { - // calculate the desired size - QSize origSize = QImageReader(wallpaperFile_).size(); // get the size of the original file - if(origSize.isValid()) { - QSize desiredSize = origSize; - Qt::AspectRatioMode mode = (wallpaperMode_ == WallpaperFit ? Qt::KeepAspectRatio : Qt::KeepAspectRatioByExpanding); - desiredSize.scale(width(), height(), mode); - image = loadWallpaperFile(desiredSize); // load the scaled image - } - } - if(!image.isNull()) { - pixmap = QPixmap(size()); - QPainter painter(&pixmap); - pixmap.fill(bgColor_); - int x = (width() - image.width()) / 2; - int y = (height() - image.height()) / 2; - painter.drawImage(x, y, image); - } - } - wallpaperPixmap_ = pixmap; - } -} - -bool DesktopWindow::pickWallpaper() { - if(slideShowInterval_ <= 0 - || !QFileInfo(wallpaperDir_).isDir()) { - return false; - } - - QList formats = QImageReader::supportedImageFormats(); - QStringList formatsFilters; - for (const QByteArray& format: formats) - formatsFilters << QString("*.") + format; - QDir folder(wallpaperDir_); - QStringList files = folder.entryList(formatsFilters, - QDir::Files | QDir::NoDotAndDotDot, - QDir::Name); - if(!files.isEmpty()) { - QString dir = wallpaperDir_ + QLatin1Char('/'); - if(!wallpaperRandomize_) { - if(!lastSlide_.startsWith(dir)) { // not in the directory - wallpaperFile_ = dir + files.first(); - } - else { - QString ls = lastSlide_.remove(0, dir.size()); - if(ls.isEmpty() // invalid - || ls.contains(QLatin1Char('/'))) { // in a subdirectory or invalid - wallpaperFile_ = dir + files.first(); - } - else { - int index = files.indexOf(ls); - if(index == -1) { // removed or invalid - wallpaperFile_ = dir + files.first(); - } - else { - wallpaperFile_ = dir + (index + 1 < files.size() - ? files.at(index + 1) - : files.first()); - } - } - } - } - else { - if(files.size() > 1) { - if(lastSlide_.startsWith(dir)) { - QString ls = lastSlide_.remove(0, dir.size()); - if(!ls.isEmpty() && !ls.contains(QLatin1Char('/'))) - files.removeOne(ls); // choose from other images - } - // this is needed for the randomness, especially when choosing the first wallpaper - qsrand((uint)QTime::currentTime().msec()); - int randomValue = qrand() % files.size(); - wallpaperFile_ = dir + files.at(randomValue); - } - else { - wallpaperFile_ = dir + files.first(); - } - } - - if (lastSlide_ != wallpaperFile_) { - lastSlide_ = wallpaperFile_; - Settings& settings = static_cast(qApp)->settings(); - settings.setLastSlide(lastSlide_); - return true; - } - } - - return false; -} - -void DesktopWindow::nextWallpaper() { - if(pickWallpaper()) { - updateWallpaper(); - update(); - } -} - -void DesktopWindow::updateFromSettings(Settings& settings, bool changeSlide) { - setDesktopFolder(); - setWallpaperFile(settings.wallpaper()); - setWallpaperMode(settings.wallpaperMode()); - setLastSlide(settings.lastSlide()); - QString wallpaperDir = settings.wallpaperDir(); - if(wallpaperDir_ != wallpaperDir) { - changeSlide = true; // another wallpapaer directory; change slide! - } - setWallpaperDir(wallpaperDir); - int interval = settings.slideShowInterval(); - if(interval > 0 && (interval < MIN_SLIDE_INTERVAL || interval > MAX_SLIDE_INTERVAL)) { - interval = qBound(MIN_SLIDE_INTERVAL, interval, MAX_SLIDE_INTERVAL); - settings.setSlideShowInterval(interval); - } - setSlideShowInterval(interval); - setWallpaperRandomize(settings.wallpaperRandomize()); - setFont(settings.desktopFont()); - setIconSize(Fm::FolderView::IconMode, QSize(settings.desktopIconSize(), settings.desktopIconSize())); - setMargins(settings.desktopCellMargins()); - // setIconSize and setMargins may trigger relayout of items by QListView, so we need to do the layout again. - queueRelayout(); - setForeground(settings.desktopFgColor()); - setBackground(settings.desktopBgColor()); - setShadow(settings.desktopShadowColor()); - showWmMenu_ = settings.showWmMenu(); - desktopHideItems_ = settings.desktopHideItems(); - if(desktopHideItems_) { - // hide all items by hiding the list view and also - // prevent the current item from being changed by arrow keys - listView_->clearFocus(); - listView_->setVisible(false); - } - - if(slideShowInterval_ > 0 - && QFileInfo(wallpaperDir_).isDir()) { - if(!wallpaperTimer_) { - changeSlide = true; // slideshow activated; change slide! - wallpaperTimer_ = new QTimer(); - connect(wallpaperTimer_, &QTimer::timeout, this, &DesktopWindow::nextWallpaper); - } - else { - wallpaperTimer_->stop(); // restart the timer after updating wallpaper - } - if(changeSlide) { - pickWallpaper(); - } - else if(QFile::exists(lastSlide_)) { - /* show the last slide if it still exists, - otherwise show the wallpaper until timeout */ - wallpaperFile_ = lastSlide_; - } - } - else if(wallpaperTimer_) { - wallpaperTimer_->stop(); - delete wallpaperTimer_; - wallpaperTimer_ = nullptr; - } - - updateWallpaper(); - update(); - - if(wallpaperTimer_) { - wallpaperTimer_->start(slideShowInterval_); - } -} - -void DesktopWindow::onFileClicked(int type, const std::shared_ptr& fileInfo) { - if(!fileInfo && showWmMenu_) { - return; // do not show the popup if we want to use the desktop menu provided by the WM. - } - if(desktopHideItems_) { // only a context menu with desktop actions - if(type == Fm::FolderView::ActivatedClick) { - return; - } - QMenu* menu = new QMenu(this); - addDesktopActions(menu); - menu->exec(QCursor::pos()); - delete menu; - } - else { - View::onFileClicked(type, fileInfo); - } -} - -void DesktopWindow::prepareFileMenu(Fm::FileMenu* menu) { - // qDebug("DesktopWindow::prepareFileMenu"); - PCManFM::View::prepareFileMenu(menu); - QAction* action = new QAction(tr("Stic&k to Current Position"), menu); - action->setCheckable(true); - menu->insertSeparator(menu->separator2()); - menu->insertAction(menu->separator2(), action); - - bool checked(true); - auto files = menu->files(); - for(const auto& file : files) { - if(customItemPos_.find(file->name()) == customItemPos_.cend()) { - checked = false; - break; - } - } - action->setChecked(checked); - connect(action, &QAction::toggled, this, &DesktopWindow::onStickToCurrentPos); -} - -void DesktopWindow::prepareFolderMenu(Fm::FolderMenu* menu) { - PCManFM::View::prepareFolderMenu(menu); - // remove file properties action - menu->removeAction(menu->propertiesAction()); - // add desktop actions instead - addDesktopActions(menu); -} - -void DesktopWindow::addDesktopActions(QMenu* menu) { - QAction* action = menu->addAction(tr("Hide Desktop Items")); - action->setCheckable(true); - action->setChecked(desktopHideItems_); - menu->addSeparator(); - connect(action, &QAction::triggered, this, &DesktopWindow::toggleDesktop); - action = menu->addAction(tr("Desktop Preferences")); - connect(action, &QAction::triggered, this, &DesktopWindow::onDesktopPreferences); -} - -void DesktopWindow::toggleDesktop() { - desktopHideItems_ = !desktopHideItems_; - Settings& settings = static_cast(qApp)->settings(); - settings.setDesktopHideItems(desktopHideItems_); - listView_->setVisible(!desktopHideItems_); - // a relayout is needed on showing the items for the first time - // because the positions aren't updated while the view is hidden - if(!desktopHideItems_) { - listView_->setFocus(); // refocus the view - queueRelayout(); - } - else { // prevent the current item from being changed by arrow keys - listView_->clearFocus(); - } -} - -void DesktopWindow::selectAll() { - if(!desktopHideItems_) { - FolderView::selectAll(); - } -} - -void DesktopWindow::onDesktopPreferences() { - static_cast(qApp)->desktopPrefrences(QString()); -} - -void DesktopWindow::onRowsInserted(const QModelIndex& parent, int start, int end) { - Q_UNUSED(parent); - Q_UNUSED(start); - Q_UNUSED(end); - // disable view updates temporarily and delay relayout to prevent items from shaking - listView_->setUpdatesEnabled(false); - queueRelayout(100); -} - -void DesktopWindow::onRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end) { - Q_UNUSED(parent); - Q_UNUSED(start); - Q_UNUSED(end); - if(!customItemPos_.empty()) { - // also delete stored custom item positions for the items currently being removed. - // Here we can't rely on ProxyFolderModel::fileInfoFromIndex() because, although rows - // aren't removed yet, files are already removed. - bool changed = false; - QString desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); - desktopDir += '/'; - for(auto it = customItemPos_.cbegin(); it != customItemPos_.cend();) { - auto& name = it->first; - if(!QFile::exists(desktopDir + QString::fromStdString(name))) { - it = customItemPos_.erase(it); - changed = true; - } - else { - ++it; - } - } - if(changed) { - saveItemPositions(); - } - } - listView_->setUpdatesEnabled(false); - queueRelayout(100); -} - -void DesktopWindow::onLayoutChanged() { - queueRelayout(); -} - -void DesktopWindow::onModelSortFilterChanged() { - Settings& settings = static_cast(qApp)->settings(); - settings.setDesktopSortColumn(static_cast(proxyModel_->sortColumn())); - settings.setDesktopSortOrder(proxyModel_->sortOrder()); - settings.setDesktopSortFolderFirst(proxyModel_->folderFirst()); -} - -void DesktopWindow::onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight) { - /**************************************************************************** - NOTE: The display names of desktop entries and shortcuts may change without - their files being renamed and, on such occasions, a relayout will be needed. - Since there is no signal for that, we use the signal dataChanged() and the - QHash displayNames_, which remembers such display names with every relayout. - ****************************************************************************/ - if(topLeft.column() == 0) { - bool relayout(false); - for(int i = topLeft.row(); i <= bottomRight.row(); ++i) { - QModelIndex index = topLeft.sibling(i, 0); - if(index.isValid() && displayNames_.contains(index)) { - auto file = proxyModel_->fileInfoFromIndex(index); - if(displayNames_[index] != file->displayName()) { - relayout = true; - break; - } - } - } - if(relayout) { - queueRelayout(); - // parts of the old display name might still be visible if it's long - listView_->viewport()->update(); - } - } -} - -void DesktopWindow::onIndexesMoved(const QModelIndexList& indexes) { - auto delegate = static_cast(listView_->itemDelegateForColumn(0)); - auto itemSize = delegate->itemSize(); - // remember the custom position for the items - for(const QModelIndex& index : indexes) { - // Under some circumstances, Qt might emit indexMoved for - // every single cells in the same row. (when QAbstractItemView::SelectItems is set) - // So indexes list may contain several indixes for the same row. - // Since we only care about rows, not individual cells, - // let's handle column 0 of every row here. - if(index.column() == 0) { - auto file = proxyModel_->fileInfoFromIndex(index); - QRect itemRect = listView_->rectForIndex(index); - QPoint tl = itemRect.topLeft(); - QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); - - // check if the position is occupied by another item - auto existingItem = std::find_if(customItemPos_.cbegin(), customItemPos_.cend(), [tl](const std::pair& elem){ - return elem.second == tl; - }); - - if(existingItem == customItemPos_.cend() // don't put items on each other - && tl.x() >= workArea.x() && tl.y() >= workArea.y() - && tl.x() + itemSize.width() <= workArea.right() + 1 // for historical reasons (-> Qt doc) - && tl.y() + itemSize.height() <= workArea.bottom() + 1) { // as above - customItemPos_[file->name()] = tl; - // qDebug() << "indexMoved:" << name << index << itemRect; - } - } - } - saveItemPositions(); - queueRelayout(); -} - -void DesktopWindow::onFolderStartLoading() { // desktop may be reloaded - if(model_) { - disconnect(model_, &Fm::FolderModel::filesAdded, this, &DesktopWindow::onFilesAdded); - } -} - -void DesktopWindow::onFolderFinishLoading() { - QTimer::singleShot(10, [this]() { // Qt delays the UI update (as in TabPage::onFolderFinishLoading) - if(model_) { - connect(model_, &Fm::FolderModel::filesAdded, this, &DesktopWindow::onFilesAdded); - } - }); -} - -void DesktopWindow::onFilesAdded(const Fm::FileInfoList files) { - if(static_cast(qApp)->settings().selectNewFiles()) { - if(!selectionTimer_) { - selectFiles(files, false); - selectionTimer_ = new QTimer (this); - selectionTimer_->setSingleShot(true); - selectionTimer_->start(200); - } - else { - selectFiles(files, selectionTimer_->isActive()); - selectionTimer_->start(200); - } - } -} - -void DesktopWindow::removeBottomGap() { - /************************************************************ - NOTE: Desktop is an area bounded from below while icons snap - to its grid srarting from above. Therefore, we try to adjust - the vertical cell margin to prevent relatively large gaps - from taking shape at the desktop bottom. - ************************************************************/ - auto delegate = static_cast(listView_->itemDelegateForColumn(0)); - auto itemSize = delegate->itemSize(); - //qDebug() << "delegate:" << delegate->itemSize(); - QSize cellMargins = getMargins(); - int workAreaHeight = qApp->desktop()->availableGeometry(screenNum_).height() - - 24; // a 12-pix margin will be considered everywhere - int cellHeight = itemSize.height() + listView_->spacing(); - int iconNumber = workAreaHeight / cellHeight; - int bottomGap = workAreaHeight % cellHeight; - /******************************************* - First try to make room for an extra icon... - *******************************************/ - // If one pixel is subtracted from the vertical margin, cellHeight - // will decrease by 2 while bottomGap will increase by 2*iconNumber. - // So, we can add an icon to the bottom once this inequality holds: - // bottomGap + 2*n*iconNumber >= cellHeight - 2*n - // From here, we get our "subtrahend": - qreal exactNumber = ((qreal)cellHeight - (qreal)bottomGap) - / (2.0 * (qreal)iconNumber + 2.0); - int subtrahend = (int)exactNumber + ((int)exactNumber == exactNumber ? 0 : 1); - Settings& settings = static_cast(qApp)->settings(); - int minCellHeight = settings.desktopCellMargins().height(); - if(subtrahend > 0 - && cellMargins.height() - subtrahend >= minCellHeight) { - cellMargins -= QSize(0, subtrahend); - } - /*************************************************** - ... but if that can't be done, try to spread icons! - ***************************************************/ - else { - cellMargins += QSize(0, (bottomGap / iconNumber) / 2); - } - // set the new margins (if they're changed) - delegate->setMargins(cellMargins); - setMargins(cellMargins); - // in case the text shadow is reset to (0,0,0,0) - setShadow(settings.desktopShadowColor()); -} - -void DesktopWindow::paintBackground(QPaintEvent* event) { - // This is to workaround Qt bug 54384 which affects Qt >= 5.6 - // https://bugreports.qt.io/browse/QTBUG-54384 - QPainter painter(this); - if(wallpaperMode_ == WallpaperNone || wallpaperPixmap_.isNull()) { - painter.fillRect(event->rect(), QBrush(bgColor_)); - } - else { - painter.drawPixmap(event->rect(), wallpaperPixmap_, event->rect()); - } -} - -// QListView does item layout in a very inflexible way, so let's do our custom layout again. -// FIXME: this is very inefficient, but due to the design flaw of QListView, this is currently the only workaround. -void DesktopWindow::relayoutItems() { - displayNames_.clear(); - loadItemPositions(); // something may have changed - // qDebug("relayoutItems()"); - if(relayoutTimer_) { - // this slot might be called from the timer, so we cannot delete it directly here. - relayoutTimer_->deleteLater(); - relayoutTimer_ = nullptr; - } - - QDesktopWidget* desktop = qApp->desktop(); - int screen = 0; - int row = 0; - int rowCount = proxyModel_->rowCount(); - - auto delegate = static_cast(listView_->itemDelegateForColumn(0)); - auto itemSize = delegate->itemSize(); - - for(;;) { - if(desktop->isVirtualDesktop()) { - if(screen >= desktop->numScreens()) { - break; - } - } - else { - screen = screenNum_; - } - QRect workArea = desktop->availableGeometry(screen); - workArea.adjust(12, 12, -12, -12); // add a 12 pixel margin to the work area - // qDebug() << "workArea" << screen << workArea; - // FIXME: we use an internal class declared in a private header here, which is pretty bad. - QPoint pos = workArea.topLeft(); - for(; row < rowCount; ++row) { - QModelIndex index = proxyModel_->index(row, 0); - int itemWidth = delegate->sizeHint(listView_->getViewOptions(), index).width(); - auto file = proxyModel_->fileInfoFromIndex(index); - // remember display names of desktop entries and shortcuts - if(file->isDesktopEntry() || file->isShortcut()) { - displayNames_[index] = file->displayName(); - } - auto name = file->name(); - auto find_it = customItemPos_.find(name); - if(find_it != customItemPos_.cend()) { // the item has a custom position - QPoint customPos = find_it->second; - // center the contents vertically - listView_->setPositionForIndex(customPos + QPoint((itemSize.width() - itemWidth) / 2, 0), index); - // qDebug() << "set custom pos:" << name << row << index << customPos; - continue; - } - // check if the current pos is alredy occupied by a custom item - bool used = false; - for(auto it = customItemPos_.cbegin(); it != customItemPos_.cend(); ++it) { - QPoint customPos = it->second; - if(QRect(customPos, itemSize).contains(pos)) { - used = true; - break; - } - } - if(used) { // go to next pos - --row; - } - else { - // center the contents vertically - listView_->setPositionForIndex(pos + QPoint((itemSize.width() - itemWidth) / 2, 0), index); - // qDebug() << "set pos" << name << row << index << pos; - } - // move to next cell in the column - pos.setY(pos.y() + itemSize.height() + listView_->spacing()); - if(pos.y() + itemSize.height() > workArea.bottom() + 1) { - // if the next position may exceed the bottom of work area, go to the top of next column - pos.setX(pos.x() + itemSize.width() + listView_->spacing()); - pos.setY(workArea.top()); - - // check if the new column exceeds the right margin of work area - if(pos.x() + itemSize.width() > workArea.right() + 1) { - if(desktop->isVirtualDesktop()) { - // in virtual desktop mode, go to next screen - ++screen; - break; - } - } - } - } - if(row >= rowCount) { - break; - } - } - - if(!listView_->updatesEnabled()) { - listView_->setUpdatesEnabled(true); - } -} - -void DesktopWindow::loadItemPositions() { - // load custom item positions - customItemPos_.clear(); - Settings& settings = static_cast(qApp)->settings(); - QString configFile = QString("%1/desktop-items-%2.conf").arg(settings.profileDir(settings.profileName())).arg(screenNum_); - QSettings file(configFile, QSettings::IniFormat); - - auto delegate = static_cast(listView_->itemDelegateForColumn(0)); - auto grid = delegate->itemSize(); - QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); - QString desktopDir = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation); - desktopDir += '/'; - std::vector usedPos; - for(auto& item: customItemPos_) { - usedPos.push_back(item.second); - } - - // FIXME: this is inefficient - const auto names = file.childGroups(); - for(const QString& name : names) { - if(!QFile::exists(desktopDir + name.toUtf8())) { - // the file may have been removed from outside LXQT - continue; - } - file.beginGroup(name); - QVariant var = file.value("pos"); - if(var.isValid()) { - QPoint customPos = var.toPoint(); - if(customPos.x() >= workArea.x() && customPos.y() >= workArea.y() - && customPos.x() + grid.width() <= workArea.right() + 1 - && customPos.y() + grid.height() <= workArea.bottom() + 1) { - // correct positions that are't aligned to the grid - alignToGrid(customPos, workArea.topLeft(), grid, listView_->spacing()); - // FIXME: this is very inefficient - while(std::find(usedPos.cbegin(), usedPos.cend(), customPos) != usedPos.cend()) { - customPos.setY(customPos.y() + grid.height() + listView_->spacing()); - if(customPos.y() + grid.height() > workArea.bottom() + 1) { - customPos.setX(customPos.x() + grid.width() + listView_->spacing()); - customPos.setY(workArea.top()); - } - } - customItemPos_[name.toStdString()] = customPos; - usedPos.push_back(customPos); - } - } - file.endGroup(); - } -} - -void DesktopWindow::saveItemPositions() { - Settings& settings = static_cast(qApp)->settings(); - // store custom item positions - QString configFile = QString("%1/desktop-items-%2.conf").arg(settings.profileDir(settings.profileName())).arg(screenNum_); - // FIXME: using QSettings here is inefficient and it's not friendly to UTF-8. - QSettings file(configFile, QSettings::IniFormat); - file.clear(); // remove all existing entries - - // FIXME: we have to remove dead entries not associated to any files? - for(auto it = customItemPos_.cbegin(); it != customItemPos_.cend(); ++it) { - auto& name = it->first; - auto& pos = it->second; - file.beginGroup(QString::fromStdString(name)); - file.setValue("pos", pos); - file.endGroup(); - } -} - -void DesktopWindow::onStickToCurrentPos(bool toggled) { - QModelIndexList indexes = listView_->selectionModel()->selectedIndexes(); - if(!indexes.isEmpty()) { - bool relayout(false); - QModelIndexList::const_iterator it; - for(it = indexes.constBegin(); it != indexes.constEnd(); ++it) { - auto file = proxyModel_->fileInfoFromIndex(*it); - auto name = file->name(); - if(toggled) { // remember the current custom position - QRect itemRect = listView_->rectForIndex(*it); - customItemPos_[name] = itemRect.topLeft(); - } - else { // cancel custom position and perform relayout - auto item = customItemPos_.find(name); - if(item != customItemPos_.end()) { - customItemPos_.erase(item); - relayout = true; - } - } - } - saveItemPositions(); - if(relayout) { - relayoutItems(); - } - } -} - -void DesktopWindow::queueRelayout(int delay) { - // qDebug() << "queueRelayout"; - removeBottomGap(); - if(!relayoutTimer_) { - relayoutTimer_ = new QTimer(); - relayoutTimer_->setSingleShot(true); - connect(relayoutTimer_, &QTimer::timeout, this, &DesktopWindow::relayoutItems); - relayoutTimer_->start(delay); - } -} - -// slots for file operations - -void DesktopWindow::onCutActivated() { - if(desktopHideItems_) { - return; - } - auto paths = selectedFilePaths(); - if(!paths.empty()) { - Fm::cutFilesToClipboard(paths); - } -} - -void DesktopWindow::onCopyActivated() { - if(desktopHideItems_) { - return; - } - auto paths = selectedFilePaths(); - if(!paths.empty()) { - Fm::copyFilesToClipboard(paths); - } -} - -void DesktopWindow::onPasteActivated() { - if(desktopHideItems_) { - return; - } - Fm::pasteFilesFromClipboard(path()); -} - -void DesktopWindow::onDeleteActivated() { - if(desktopHideItems_) { - return; - } - auto paths = selectedFilePaths(); - if(!paths.empty()) { - Settings& settings = static_cast(qApp)->settings(); - bool shiftPressed = (qApp->keyboardModifiers() & Qt::ShiftModifier ? true : false); - if(settings.useTrash() && !shiftPressed) { - Fm::FileOperation::trashFiles(paths, settings.confirmTrash()); - } - else { - Fm::FileOperation::deleteFiles(paths, settings.confirmDelete()); - } - } -} - -void DesktopWindow::onRenameActivated() { - if(desktopHideItems_) { - return; - } - // do inline renaming if only one item is selected, - // otherwise use the renaming dialog - if(selectedIndexes().size() == 1) { - QModelIndex cur = listView_->currentIndex(); - if (cur.isValid()) { - listView_->edit(cur); - return; - } - } - auto files = selectedFiles(); - if(!files.empty()) { - for(auto& info: files) { - if(!Fm::renameFile(info, nullptr)) { - break; - } - } - } -} - -void DesktopWindow::onBulkRenameActivated() { - if(desktopHideItems_) { - return; - } - BulkRenamer(selectedFiles(), this); -} - -void DesktopWindow::onFilePropertiesActivated() { - if(desktopHideItems_) { - return; - } - auto files = selectedFiles(); - if(!files.empty()) { - Fm::FilePropsDialog::showForFiles(std::move(files)); - } -} - -static void forwardMouseEventToRoot(QMouseEvent* event) { - xcb_ungrab_pointer(QX11Info::connection(), event->timestamp()); - // forward the event to the root window - xcb_button_press_event_t xcb_event; - uint32_t mask = 0; - xcb_event.state = 0; - switch(event->type()) { - case QEvent::MouseButtonPress: - xcb_event.response_type = XCB_BUTTON_PRESS; - mask = XCB_EVENT_MASK_BUTTON_PRESS; - break; - case QEvent::MouseButtonRelease: - xcb_event.response_type = XCB_BUTTON_RELEASE; - mask = XCB_EVENT_MASK_BUTTON_RELEASE; - break; - default: - return; - } - - // convert Qt button to XCB button - switch(event->button()) { - case Qt::LeftButton: - xcb_event.detail = 1; - xcb_event.state |= XCB_BUTTON_MASK_1; - break; - case Qt::MiddleButton: - xcb_event.detail = 2; - xcb_event.state |= XCB_BUTTON_MASK_2; - break; - case Qt::RightButton: - xcb_event.detail = 3; - xcb_event.state |= XCB_BUTTON_MASK_3; - break; - default: - xcb_event.detail = 0; - } - - // convert Qt modifiers to XCB states - if(event->modifiers() & Qt::ShiftModifier) { - xcb_event.state |= XCB_MOD_MASK_SHIFT; - } - if(event->modifiers() & Qt::ControlModifier) { - xcb_event.state |= XCB_MOD_MASK_SHIFT; - } - if(event->modifiers() & Qt::AltModifier) { - xcb_event.state |= XCB_MOD_MASK_1; - } - - xcb_event.sequence = 0; - xcb_event.time = event->timestamp(); - - WId root = QX11Info::appRootWindow(QX11Info::appScreen()); - xcb_event.event = root; - xcb_event.root = root; - xcb_event.child = 0; - - xcb_event.root_x = event->globalX(); - xcb_event.root_y = event->globalY(); - xcb_event.event_x = event->x(); - xcb_event.event_y = event->y(); - xcb_event.same_screen = 1; - - xcb_send_event(QX11Info::connection(), 0, root, mask, (char*)&xcb_event); - xcb_flush(QX11Info::connection()); -} - -bool DesktopWindow::event(QEvent* event) { - switch(event->type()) { - case QEvent::WinIdChange: { - //qDebug() << "winid change:" << effectiveWinId(); - if(effectiveWinId() == 0) { - break; - } - // set freedesktop.org EWMH hints properly - if(QX11Info::isPlatformX11() && QX11Info::connection()) { - xcb_connection_t* con = QX11Info::connection(); - const char* atom_name = "_NET_WM_WINDOW_TYPE_DESKTOP"; - xcb_atom_t atom = xcb_intern_atom_reply(con, xcb_intern_atom(con, 0, strlen(atom_name), atom_name), nullptr)->atom; - const char* prop_atom_name = "_NET_WM_WINDOW_TYPE"; - xcb_atom_t prop_atom = xcb_intern_atom_reply(con, xcb_intern_atom(con, 0, strlen(prop_atom_name), prop_atom_name), nullptr)->atom; - xcb_atom_t XA_ATOM = 4; - xcb_change_property(con, XCB_PROP_MODE_REPLACE, effectiveWinId(), prop_atom, XA_ATOM, 32, 1, &atom); - } - break; - } -#undef FontChange // FontChange is defined in the headers of XLib and clashes with Qt, let's undefine it. - case QEvent::StyleChange: - case QEvent::FontChange: - queueRelayout(); - break; - - default: - break; - } - - return QWidget::event(event); -} - -#undef FontChange // this seems to be defined in Xlib headers as a macro, undef it! - -bool DesktopWindow::eventFilter(QObject* watched, QEvent* event) { - if(watched == listView_) { - switch(event->type()) { - case QEvent::StyleChange: - case QEvent::FontChange: - if(model_) { - queueRelayout(); - } - break; - default: - break; - } - } - else if(watched == listView_->viewport()) { - switch(event->type()) { - case QEvent::MouseButtonPress: - case QEvent::MouseButtonRelease: - if(showWmMenu_) { - QMouseEvent* e = static_cast(event); - // If we want to show the desktop menus provided by the window manager instead of ours, - // we have to forward the mouse events we received to the root window. - // check if the user click on blank area - QModelIndex index = listView_->indexAt(e->pos()); - if(!index.isValid() && e->button() != Qt::LeftButton) { - forwardMouseEventToRoot(e); - } - } - break; - default: - break; - } - } - return Fm::FolderView::eventFilter(watched, event); -} - -void DesktopWindow::childDropEvent(QDropEvent* e) { - const QMimeData* mimeData = e->mimeData(); - bool moveItem = false; - if(e->source() == listView_ && e->keyboardModifiers() == Qt::NoModifier) { - // drag source is our list view, and no other modifier keys are pressed - // => we're dragging desktop items - if(mimeData->hasFormat("application/x-qabstractitemmodeldatalist")) { - QModelIndex dropIndex = listView_->indexAt(e->pos()); - if(dropIndex.isValid()) { // drop on an item - QModelIndexList selected = selectedIndexes(); // the dragged items - if(selected.contains(dropIndex)) { // drop on self, ignore - moveItem = true; - } - } - else { // drop on a blank area - moveItem = true; - } - } - } - if(moveItem) { - e->accept(); - } - else { - auto delegate = static_cast(listView_->itemDelegateForColumn(0)); - auto grid = delegate->itemSize(); - Fm::FolderView::childDropEvent(e); - // position dropped items successively, starting with the drop rectangle - if(mimeData->hasUrls() - && (e->dropAction() == Qt::CopyAction - || e->dropAction() == Qt::MoveAction - || e->dropAction() == Qt::LinkAction)) { - QList urlList = mimeData->urls(); - for(int i = 0; i < urlList.count(); ++i) { - std::string name = urlList.at(i).fileName().toUtf8().constData(); - if(!name.empty()) { // respect the positions of existing files - QString desktopDir = XdgDir::readDesktopDir() + QString(QLatin1String("/")); - if(!QFile::exists(desktopDir + QString::fromStdString(name))) { - QRect workArea = qApp->desktop()->availableGeometry(screenNum_); - workArea.adjust(12, 12, -12, -12); - QPoint pos = mapFromGlobal(e->pos()); - alignToGrid(pos, workArea.topLeft(), grid, listView_->spacing()); - if(i > 0) - pos.setY(pos.y() + grid.height() + listView_->spacing()); - if(pos.y() + grid.height() > workArea.bottom() + 1) { - pos.setX(pos.x() + grid.width() + listView_->spacing()); - pos.setY(workArea.top()); - } - customItemPos_[name] = pos; - } - } - } - saveItemPositions(); - } - } -} - -void DesktopWindow::alignToGrid(QPoint& pos, const QPoint& topLeft, const QSize& grid, const int spacing) { - qreal w = qAbs((qreal)pos.x() - (qreal)topLeft.x()) - / (qreal)(grid.width() + spacing); - qreal h = qAbs(pos.y() - (qreal)topLeft.y()) - / (qreal)(grid.height() + spacing); - pos.setX(topLeft.x() + qRound(w) * (grid.width() + spacing)); - pos.setY(topLeft.y() + qRound(h) * (grid.height() + spacing)); -} - -void DesktopWindow::closeEvent(QCloseEvent* event) { - // prevent the desktop window from being closed. - event->ignore(); -} - -void DesktopWindow::paintEvent(QPaintEvent *event) { - paintBackground(event); - QWidget::paintEvent(event); -} - -void DesktopWindow::setScreenNum(int num) { - if(screenNum_ != num) { - screenNum_ = num; - queueRelayout(); - } -} - -} // namespace PCManFM diff --git a/pcmanfm/desktopwindow.h b/pcmanfm/desktopwindow.h deleted file mode 100644 index 07781a3..0000000 --- a/pcmanfm/desktopwindow.h +++ /dev/null @@ -1,171 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_DESKTOPWINDOW_H -#define PCMANFM_DESKTOPWINDOW_H - -#include "view.h" -#include "launcher.h" -#include -#include - -#include -#include -#include -#include -#include - -namespace Fm { -class CachedFolderModel; -class ProxyFolderModel; -class FolderViewListView; -} - -namespace PCManFM { - -class Settings; - -class DesktopWindow : public View { - Q_OBJECT -public: - friend class Application; - - enum WallpaperMode { - WallpaperNone, - WallpaperStretch, - WallpaperFit, - WallpaperCenter, - WallpaperTile, - WallpaperZoom - }; - - explicit DesktopWindow(int screenNum); - virtual ~DesktopWindow(); - - void setForeground(const QColor& color); - void setShadow(const QColor& color); - void setBackground(const QColor& color); - void setDesktopFolder(); - void setWallpaperFile(QString filename); - void setWallpaperMode(WallpaperMode mode = WallpaperStretch); - void setLastSlide(QString filename); - void setWallpaperDir(QString dirname); - void setSlideShowInterval(int interval); - void setWallpaperRandomize(bool randomize); - - // void setWallpaperAlpha(qreal alpha); - void updateWallpaper(); - bool pickWallpaper(); - void nextWallpaper(); - void updateFromSettings(Settings& settings, bool changeSlide = true); - - void queueRelayout(int delay = 0); - - int screenNum() const { - return screenNum_; - } - - void setScreenNum(int num); - -protected: - virtual void prepareFolderMenu(Fm::FolderMenu* menu) override; - virtual void prepareFileMenu(Fm::FileMenu* menu) override; - virtual void resizeEvent(QResizeEvent* event) override; - virtual void onFileClicked(int type, const std::shared_ptr& fileInfo) override; - - void loadItemPositions(); - void saveItemPositions(); - - QImage loadWallpaperFile(QSize requiredSize); - - virtual bool event(QEvent* event) override; - virtual bool eventFilter(QObject* watched, QEvent* event) override; - - virtual void childDropEvent(QDropEvent* e) override; - virtual void closeEvent(QCloseEvent* event) override; - virtual void paintEvent(QPaintEvent *event) override; - -protected Q_SLOTS: - void onOpenDirRequested(const Fm::FilePath& path, int target); - void onDesktopPreferences(); - void selectAll(); - void toggleDesktop(); - - void onRowsAboutToBeRemoved(const QModelIndex& parent, int start, int end); - void onRowsInserted(const QModelIndex& parent, int start, int end); - void onLayoutChanged(); - void onModelSortFilterChanged(); - void onIndexesMoved(const QModelIndexList& indexes); - void onDataChanged(const QModelIndex& topLeft, const QModelIndex& bottomRight); - void onFolderStartLoading(); - void onFolderFinishLoading(); - void onFilesAdded(const Fm::FileInfoList files); - - void relayoutItems(); - void onStickToCurrentPos(bool toggled); - - // void updateWorkArea(); - - // file operations - void onCutActivated(); - void onCopyActivated(); - void onPasteActivated(); - void onRenameActivated(); - void onBulkRenameActivated(); - void onDeleteActivated(); - void onFilePropertiesActivated(); - -private: - void removeBottomGap(); - void addDesktopActions(QMenu* menu); - void paintBackground(QPaintEvent* event); - static void alignToGrid(QPoint& pos, const QPoint& topLeft, const QSize& grid, const int spacing); - -private: - Fm::ProxyFolderModel* proxyModel_; - Fm::CachedFolderModel* model_; - std::shared_ptr folder_; - Fm::FolderViewListView* listView_; - - QColor fgColor_; - QColor bgColor_; - QColor shadowColor_; - QString wallpaperFile_; - WallpaperMode wallpaperMode_; - QString lastSlide_; - QString wallpaperDir_; - int slideShowInterval_; - QTimer* wallpaperTimer_; - bool wallpaperRandomize_; - QPixmap wallpaperPixmap_; - Launcher fileLauncher_; - bool showWmMenu_; - bool desktopHideItems_; - - int screenNum_; - std::unordered_map customItemPos_; - QHash displayNames_; // only for desktop entries and shortcuts - QTimer* relayoutTimer_; - QTimer* selectionTimer_; -}; - -} - -#endif // PCMANFM_DESKTOPWINDOW_H diff --git a/pcmanfm/launcher.cpp b/pcmanfm/launcher.cpp deleted file mode 100644 index 14ec4c4..0000000 --- a/pcmanfm/launcher.cpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - * - * Copyright (C) 2014 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#include "launcher.h" -#include "mainwindow.h" -#include "application.h" -#include - -namespace PCManFM { - -Launcher::Launcher(PCManFM::MainWindow* mainWindow): - Fm::FileLauncher(), - mainWindow_(mainWindow) { - - Application* app = static_cast(qApp); - setQuickExec(app->settings().quickExec()); -} - -Launcher::~Launcher() { - -} - -bool Launcher::openFolder(GAppLaunchContext* /*ctx*/, const Fm::FileInfoList& folderInfos, Fm::GErrorPtr& /*err*/) { - auto fi = folderInfos[0]; - Application* app = static_cast(qApp); - MainWindow* mainWindow = mainWindow_; - Fm::FilePath path = fi->path(); - if(!mainWindow) { - mainWindow = new MainWindow(std::move(path)); - mainWindow->resize(app->settings().windowWidth(), app->settings().windowHeight()); - - if(app->settings().windowMaximized()) { - mainWindow->setWindowState(mainWindow->windowState() | Qt::WindowMaximized); - } - } - else { - mainWindow->chdir(std::move(path)); - } - - for(size_t i = 1; i < folderInfos.size(); ++i) { - fi = folderInfos[i]; - path = fi->path(); - mainWindow->addTab(std::move(path)); - } - mainWindow->show(); - mainWindow->raise(); - return true; -} - -} //namespace PCManFM diff --git a/pcmanfm/launcher.h b/pcmanfm/launcher.h deleted file mode 100644 index 7e0119c..0000000 --- a/pcmanfm/launcher.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * - * Copyright (C) 2014 - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library 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 - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - */ - -#ifndef PCMANFM_LAUNCHER_H -#define PCMANFM_LAUNCHER_H - -#include - -namespace PCManFM { - -class MainWindow; - -class Launcher : public Fm::FileLauncher { -public: - Launcher(MainWindow* mainWindow = nullptr); - ~Launcher(); - -protected: - bool openFolder(GAppLaunchContext* ctx, const Fm::FileInfoList& folderInfos, Fm::GErrorPtr& err) override; - -private: - MainWindow* mainWindow_; -}; - -} - -#endif // PCMANFM_LAUNCHER_H diff --git a/pcmanfm/main-win.ui b/pcmanfm/main-win.ui deleted file mode 100644 index ab57dd0..0000000 --- a/pcmanfm/main-win.ui +++ /dev/null @@ -1,873 +0,0 @@ - - - MainWindow - - - - 0 - 0 - 460 - 369 - - - - File Manager - - - - .. - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - true - - - - - - - Qt::Horizontal - - - - - 0 - 0 - - - - - - - 2 - - - 1 - - - 0 - - - 0 - - - 0 - - - - - - 0 - 0 - - - - - - - - Focus with Ctrl+I - - - Filter by string... - - - true - - - - - - - - - - - - - 0 - 0 - 460 - 30 - - - - Qt::PreventContextMenu - - - - &File - - - - C&reate New - - - - - - - - - - - - - - - - - - &Help - - - - - - &View - - - - &Sorting - - - - - - - - - - - - - - - - &View - - - - - - - - - - &Toolbars - - - - - - - Path &Bar - - - - - - - - - - - - - - - - - &Edit - - - - - - - - - - - - - - - - - - &Bookmarks - - - - - - - &Go - - - - - - - - - - - - - - - - - &Tool - - - - - - - - - - - - - - - - - Qt::PreventContextMenu - - - Main Toolbar - - - false - - - false - - - TopToolBarArea - - - false - - - - - - - - - - - - - - - - - - - .. - - - Go &Up - - - Go Up - - - Alt+Up - - - - - - .. - - - &Home - - - Alt+Home - - - - - - .. - - - &Reload - - - F5 - - - - - - .. - - - Go - - - - - - .. - - - Quit - - - - - - .. - - - &About - - - - - - .. - - - &New Window - - - New Window - - - Ctrl+N - - - - - true - - - Show &Hidden - - - Ctrl+H - - - - - - .. - - - &Computer - - - - - - .. - - - &Trash - - - - - &Network - - - - - - .. - - - &Desktop - - - - - - .. - - - &Add to Bookmarks - - - - - &Applications - - - - - Reload - - - - - true - - - &Icon View - - - - - true - - - &Compact View - - - - - true - - - &Detailed List - - - - - true - - - &Thumbnail View - - - - - - .. - - - Cu&t - - - Ctrl+X - - - - - - .. - - - &Copy - - - Ctrl+C - - - - - - .. - - - &Paste - - - Ctrl+V - - - - - Select &All - - - Ctrl+A - - - - - Pr&eferences - - - - - true - - - &Ascending - - - - - true - - - &Descending - - - - - true - - - &By File Name - - - - - true - - - By &Modification Time - - - - - true - - - By File &Type - - - - - true - - - By &Owner - - - - - true - - - &Folder First - - - - - true - - - &Preserve sorting for this folder - - - - - - .. - - - New &Tab - - - New Tab - - - Ctrl+T - - - - - - .. - - - Go &Back - - - Go Back - - - Alt+Left - - - - - - .. - - - Go &Forward - - - Go Forward - - - Alt+Right - - - - - &Invert Selection - - - - - - .. - - - &Delete - - - Del - - - - - &Rename - - - F2 - - - - - C&lose Tab - - - Ctrl+W - - - - - File &Properties - - - Alt+Return - - - - - &Folder Properties - - - - - true - - - &Case Sensitive - - - - - true - - - By File &Size - - - - - &Close Window - - - Ctrl+Q - - - - - Edit Bookmarks - - - - - Open &Terminal - - - F4 - - - - - Open as &Root - - - - - &Edit Bookmarks - - - - - - .. - - - &Folder - - - Ctrl+Shift+N - - - - - - .. - - - &Blank File - - - Ctrl+Alt+N - - - - - &Find Files - - - F3 - - - - - true - - - &Filter - - - Ctrl+B - - - - - - .. - - - Close &previous tabs - - - - - - .. - - - Close &next tabs - - - - - Close &other tabs - - - - - true - - - &Menu bar - - - Menu bar - - - Ctrl+M - - - - - - .. - - - Menu - - - Menu - - - - - true - - - &Preserve Settings for This Folder - - - - - Connect to &Server - - - - - true - - - &Location - - - - - true - - - &Path Buttons - - - - - &Bulk Rename - - - Bulk Rename - - - Ctrl+F2 - - - - - - PCManFM::TabBar - QWidget -
tabbar.h
- 1 -
- - PCManFM::StatusBar - QStatusBar -
statusbar.h
- 1 -
- - Fm::SidePane - QWidget -
libfm-qt/sidepane.h
- 1 -
-
- - -
diff --git a/pcmanfm/mainwindow.cpp b/pcmanfm/mainwindow.cpp deleted file mode 100644 index 15aa4e2..0000000 --- a/pcmanfm/mainwindow.cpp +++ /dev/null @@ -1,1518 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "mainwindow.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "tabpage.h" -#include "launcher.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include "ui_about.h" -#include "application.h" -#include "bulkrename.h" - -using namespace Fm; - -namespace PCManFM { - -// static -MainWindow* MainWindow::lastActive_ = nullptr; - -MainWindow::MainWindow(Fm::FilePath path): - QMainWindow(), - pathEntry_(nullptr), - pathBar_(nullptr), - bookmarks_{Fm::Bookmarks::globalInstance()}, - fileLauncher_(this), - rightClickIndex_(-1), - updatingViewMenu_(false) { - - Settings& settings = static_cast(qApp)->settings(); - setAttribute(Qt::WA_DeleteOnClose); - // setup user interface - ui.setupUi(this); - - // hide menu items that are not usable - //if(!uriExists("computer:///")) - // ui.actionComputer->setVisible(false); - if(!settings.supportTrash()) { - ui.actionTrash->setVisible(false); - } - - // FIXME: add an option to hide network:/// - // We cannot use uriExists() here since calling this on "network:///" - // is very slow and blocking. - //if(!uriExists("network:///")) - // ui.actionNetwork->setVisible(false); - - // add a context menu for showing browse history to back and forward buttons - QToolButton* forwardButton = static_cast(ui.toolBar->widgetForAction(ui.actionGoForward)); - forwardButton->setContextMenuPolicy(Qt::CustomContextMenu); - connect(forwardButton, &QToolButton::customContextMenuRequested, this, &MainWindow::onBackForwardContextMenu); - QToolButton* backButton = static_cast(ui.toolBar->widgetForAction(ui.actionGoBack)); - backButton->setContextMenuPolicy(Qt::CustomContextMenu); - connect(backButton, &QToolButton::customContextMenuRequested, this, &MainWindow::onBackForwardContextMenu); - - // tabbed browsing interface - ui.tabBar->setDocumentMode(true); - ui.tabBar->setTabsClosable(settings.showTabClose()); - ui.tabBar->setElideMode(Qt::ElideRight); - ui.tabBar->setExpanding(false); - ui.tabBar->setMovable(true); // reorder the tabs by dragging - if(!settings.fullWidthTabBar()) { - ui.verticalLayout->removeWidget(ui.tabBar); - ui.verticalLayout_2->insertWidget(0, ui.tabBar); - } - -#if QT_VERSION >= QT_VERSION_CHECK(5, 4, 0) - // switch to the tab under the cursor during dnd. - ui.tabBar->setChangeCurrentOnDrag(true); - ui.tabBar->setAcceptDrops(true); -#endif - - ui.tabBar->setContextMenuPolicy(Qt::CustomContextMenu); - connect(ui.actionCloseRight, &QAction::triggered, this, &MainWindow::closeRightTabs); - connect(ui.actionCloseLeft, &QAction::triggered, this, &MainWindow::closeLeftTabs); - connect(ui.actionCloseOther, &QAction::triggered, this, &MainWindow::closeOtherTabs); - - connect(ui.tabBar, &QTabBar::currentChanged, this, &MainWindow::onTabBarCurrentChanged); - connect(ui.tabBar, &QTabBar::tabCloseRequested, this, &MainWindow::onTabBarCloseRequested); - connect(ui.tabBar, &QTabBar::tabMoved, this, &MainWindow::onTabBarTabMoved); - connect(ui.tabBar, &QTabBar::customContextMenuRequested, this, &MainWindow::tabContextMenu); - connect(ui.tabBar, &TabBar::tabDetached, this, &MainWindow::detachTab); - connect(ui.stackedWidget, &QStackedWidget::widgetRemoved, this, &MainWindow::onStackedWidgetWidgetRemoved); - - // FIXME: should we make the filter bar a per-view configuration? - ui.filterBar->setVisible(settings.showFilter()); - ui.actionFilter->setChecked(settings.showFilter()); - connect(ui.filterBar, &QLineEdit::textChanged, this, &MainWindow::onFilterStringChanged); - - // side pane - ui.sidePane->setIconSize(QSize(settings.sidePaneIconSize(), settings.sidePaneIconSize())); - ui.sidePane->setMode(settings.sidePaneMode()); - ui.sidePane->restoreHiddenPlaces(settings.getHiddenPlaces()); - connect(ui.sidePane, &Fm::SidePane::chdirRequested, this, &MainWindow::onSidePaneChdirRequested); - connect(ui.sidePane, &Fm::SidePane::openFolderInNewWindowRequested, this, &MainWindow::onSidePaneOpenFolderInNewWindowRequested); - connect(ui.sidePane, &Fm::SidePane::openFolderInNewTabRequested, this, &MainWindow::onSidePaneOpenFolderInNewTabRequested); - connect(ui.sidePane, &Fm::SidePane::openFolderInTerminalRequested, this, &MainWindow::onSidePaneOpenFolderInTerminalRequested); - connect(ui.sidePane, &Fm::SidePane::createNewFolderRequested, this, &MainWindow::onSidePaneCreateNewFolderRequested); - connect(ui.sidePane, &Fm::SidePane::modeChanged, this, &MainWindow::onSidePaneModeChanged); - connect(ui.sidePane, &Fm::SidePane::hiddenPlaceSet, this, &MainWindow::onSettingHiddenPlace); - - // detect change of splitter position - connect(ui.splitter, &QSplitter::splitterMoved, this, &MainWindow::onSplitterMoved); - - // path bar - createPathBar(settings.pathBarButtons()); - if(settings.pathBarButtons()) { - ui.actionPathButtons->setChecked(true); - } - else { - ui.actionLocationBar->setChecked(true); - } - - // add filesystem info to status bar - fsInfoLabel_ = new QLabel(ui.statusbar); - ui.statusbar->addPermanentWidget(fsInfoLabel_); - - // setup the splitter - ui.splitter->setStretchFactor(1, 1); // only the right pane can be stretched - QList sizes; - sizes.append(settings.splitterPos()); - sizes.append(300); - ui.splitter->setSizes(sizes); - - // load bookmark menu - connect(bookmarks_.get(), &Fm::Bookmarks::changed, this, &MainWindow::onBookmarksChanged); - loadBookmarksMenu(); - - // set generic icons for view actions - ui.actionIconView->setIcon(style()->standardIcon(QStyle::SP_FileDialogContentsView)); - ui.actionThumbnailView->setIcon(style()->standardIcon(QStyle::SP_FileDialogInfoView)); - ui.actionCompactView->setIcon(style()->standardIcon(QStyle::SP_FileDialogListView)); - ui.actionDetailedList->setIcon(style()->standardIcon(QStyle::SP_FileDialogDetailedView)); - - // Fix the menu groups which is not done by Qt designer - // To my suprise, this was supported in Qt designer 3 :-( - QActionGroup* group = new QActionGroup(ui.menu_View); - group->setExclusive(true); - group->addAction(ui.actionIconView); - group->addAction(ui.actionCompactView); - group->addAction(ui.actionThumbnailView); - group->addAction(ui.actionDetailedList); - - group = new QActionGroup(ui.menuSorting); - group->setExclusive(true); - group->addAction(ui.actionByFileName); - group->addAction(ui.actionByMTime); - group->addAction(ui.actionByFileSize); - group->addAction(ui.actionByFileType); - group->addAction(ui.actionByOwner); - - group = new QActionGroup(ui.menuSorting); - group->setExclusive(true); - group->addAction(ui.actionAscending); - group->addAction(ui.actionDescending); - - group = new QActionGroup(ui.menuPathBarStyle); - group->setExclusive(true); - group->addAction(ui.actionLocationBar); - group->addAction(ui.actionPathButtons); - - // Add menubar actions to the main window this is necessary so that actions - // shortcuts are still working when the menubar is hidden. - addActions(ui.menubar->actions()); - - // Show or hide the menu bar - QMenu* menu = new QMenu(ui.toolBar); - menu->addMenu(ui.menu_File); - menu->addMenu(ui.menu_Edit); - menu->addMenu(ui.menu_View); - menu->addMenu(ui.menu_Go); - menu->addMenu(ui.menu_Bookmarks); - menu->addMenu(ui.menu_Tool); - menu->addMenu(ui.menu_Help); - ui.actionMenu->setMenu(menu); - if(ui.actionMenu->icon().isNull()) { - ui.actionMenu->setIcon(QIcon::fromTheme("applications-system")); - } - QToolButton* menuBtn = static_cast(ui.toolBar->widgetForAction(ui.actionMenu)); - menuBtn->setPopupMode(QToolButton::InstantPopup); - - menuSep_ = ui.toolBar->insertSeparator(ui.actionMenu); - menuSep_->setVisible(!settings.showMenuBar()); - ui.actionMenu->setVisible(!settings.showMenuBar()); - ui.menubar->setVisible(settings.showMenuBar()); - ui.actionMenu_bar->setChecked(settings.showMenuBar()); - connect(ui.actionMenu_bar, &QAction::triggered, this, &MainWindow::toggleMenuBar); - - // create shortcuts - QShortcut* shortcut; - shortcut = new QShortcut(QKeySequence(Qt::Key_Escape), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onResetFocus); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_L), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::focusPathEntry); - - shortcut = new QShortcut(Qt::ALT + Qt::Key_D, this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::focusPathEntry); - - shortcut = new QShortcut(Qt::CTRL + Qt::Key_Tab, this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutNextTab); - - shortcut = new QShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab, this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutPrevTab); - - // Add Ctrl+PgUp and Ctrl+PgDown as well, because they are common in Firefox - // , Opera, Google Chromium/Google Chrome and most other tab-using - // applications. - shortcut = new QShortcut(Qt::CTRL + Qt::Key_PageDown, this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutNextTab); - - shortcut = new QShortcut(Qt::CTRL + Qt::Key_PageUp, this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutPrevTab); - - int i; - for(i = 0; i < 10; ++i) { - shortcut = new QShortcut(QKeySequence(Qt::ALT + Qt::Key_0 + i), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutJumpToTab); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_0 + i), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::onShortcutJumpToTab); - } - - shortcut = new QShortcut(QKeySequence(Qt::Key_Backspace), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::on_actionGoUp_triggered); - - shortcut = new QShortcut(QKeySequence(Qt::SHIFT + Qt::Key_Delete), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::on_actionDelete_triggered); - - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_I), this); - connect(shortcut, &QShortcut::activated, this, &MainWindow::focusFilterBar); - - // in addition to F3, for convenience - shortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F), this); - connect(shortcut, &QShortcut::activated, ui.actionFindFiles, &QAction::trigger); - - if(QToolButton* clearButton = ui.filterBar->findChild()) { - clearButton->setToolTip(tr("Clear text (Ctrl+K)")); - shortcut = new QShortcut(Qt::CTRL + Qt::Key_K, this); - connect(shortcut, &QShortcut::activated, ui.filterBar, &QLineEdit::clear); - } - - if(path) { - addTab(path); - } - - // size from settings - resize(settings.windowWidth(), settings.windowHeight()); - if(settings.rememberWindowSize() && settings.windowMaximized()) { - setWindowState(windowState() | Qt::WindowMaximized); - } - - if(QApplication::layoutDirection() == Qt::RightToLeft) { - setRTLIcons(true); - } - - // we want tab dnd - setAcceptDrops(true); -} - -MainWindow::~MainWindow() { -} - -void MainWindow::chdir(Fm::FilePath path) { - // wait until queued events are processed - QTimer::singleShot(0, this, [this, path] { - if(TabPage* page = currentPage()) { - ui.filterBar->clear(); - page->chdir(path, true); - updateUIForCurrentPage(); - } - }); -} - -void MainWindow::createPathBar(bool usePathButtons) { - QWidget* bar; - if(usePathButtons) { - bar = pathBar_ = new Fm::PathBar(this); - connect(pathBar_, &Fm::PathBar::chdir, this, &MainWindow::onPathBarChdir); - connect(pathBar_, &Fm::PathBar::middleClickChdir, this, &MainWindow::onPathBarMiddleClickChdir); - connect(pathBar_, &Fm::PathBar::editingFinished, this, &MainWindow::onResetFocus); - } - else { - bar = pathEntry_ = new Fm::PathEdit(this); - connect(pathEntry_, &Fm::PathEdit::returnPressed, this, &MainWindow::onPathEntryReturnPressed); - } - ui.toolBar->insertWidget(ui.actionGo, bar); - ui.actionGo->setVisible(!usePathButtons); -} - -int MainWindow::addTabWithPage(TabPage* page, Fm::FilePath path) { - if(page == nullptr) { - return -1; - } - page->setFileLauncher(&fileLauncher_); - int index = ui.stackedWidget->addWidget(page); - connect(page, &TabPage::titleChanged, this, &MainWindow::onTabPageTitleChanged); - connect(page, &TabPage::statusChanged, this, &MainWindow::onTabPageStatusChanged); - connect(page, &TabPage::openDirRequested, this, &MainWindow::onTabPageOpenDirRequested); - connect(page, &TabPage::sortFilterChanged, this, &MainWindow::onTabPageSortFilterChanged); - connect(page, &TabPage::backwardRequested, this, &MainWindow::on_actionGoBack_triggered); - connect(page, &TabPage::forwardRequested, this, &MainWindow::on_actionGoForward_triggered); - - if(path) { - page->chdir(path, true); - } - ui.tabBar->insertTab(index, page->windowTitle()); - - Settings& settings = static_cast(qApp)->settings(); - if(!settings.alwaysShowTabs()) { - ui.tabBar->setVisible(ui.tabBar->count() > 1); - } - return index; -} - -// add a new tab -int MainWindow::addTab(Fm::FilePath path) { - TabPage* newPage = new TabPage(this); - return addTabWithPage(newPage, path); -} - -void MainWindow::toggleMenuBar(bool /*checked*/) { - Settings& settings = static_cast(qApp)->settings(); - bool showMenuBar = !settings.showMenuBar(); - - if(!showMenuBar) { - if(QMessageBox::Cancel == QMessageBox::warning(this, - tr("Hide menu bar"), - tr("This will hide the menu bar completely, use Ctrl+M to show it again."), - QMessageBox::Ok | QMessageBox::Cancel)) { - ui.actionMenu_bar->setChecked(true); - return; - } - } - - ui.menubar->setVisible(showMenuBar); - ui.actionMenu_bar->setChecked(showMenuBar); - menuSep_->setVisible(!showMenuBar); - ui.actionMenu->setVisible(!showMenuBar); - settings.setShowMenuBar(showMenuBar); -} - -void MainWindow::onPathEntryReturnPressed() { - QString text = pathEntry_->text(); - QByteArray utext = text.toLocal8Bit(); - chdir(Fm::FilePath::fromPathStr(utext.constData())); -} - -void MainWindow::onPathBarChdir(const Fm::FilePath& dirPath) { - // call chdir() only when needed because otherwise - // filter bar will be cleard on changing current tab - TabPage* page = currentPage(); - if(page && dirPath != page->path()) { - chdir(dirPath); - } -} - -void MainWindow::onPathBarMiddleClickChdir(const Fm::FilePath& dirPath) { - addTab(dirPath); -} - -void MainWindow::on_actionGoUp_triggered() { - QTimer::singleShot(0, this, [this] { - if(TabPage* page = currentPage()) { - ui.filterBar->clear(); - page->up(); - updateUIForCurrentPage(); - } - }); -} - -void MainWindow::on_actionGoBack_triggered() { - QTimer::singleShot(0, this, [this] { - if(TabPage* page = currentPage()) { - ui.filterBar->clear(); - page->backward(); - updateUIForCurrentPage(); - } - }); -} - -void MainWindow::on_actionGoForward_triggered() { - QTimer::singleShot(0, this, [this] { - if(TabPage* page = currentPage()) { - ui.filterBar->clear(); - page->forward(); - updateUIForCurrentPage(); - } - }); - -} - -void MainWindow::on_actionHome_triggered() { - chdir(Fm::FilePath::homeDir()); -} - -void MainWindow::on_actionReload_triggered() { - currentPage()->reload(); - if(pathEntry_ != nullptr) { - pathEntry_->setText(currentPage()->pathName()); - } -} - -void MainWindow::on_actionConnectToServer_triggered() { - Application* app = static_cast(qApp); - app->connectToServer(); -} - -void MainWindow::on_actionGo_triggered() { - onPathEntryReturnPressed(); -} - -void MainWindow::on_actionNewTab_triggered() { - auto path = currentPage()->path(); - int index = addTab(path); - ui.tabBar->setCurrentIndex(index); -} - -void MainWindow::on_actionNewWin_triggered() { - auto path = currentPage()->path(); - (new MainWindow(path))->show(); -} - -void MainWindow::on_actionNewFolder_triggered() { - if(TabPage* tabPage = currentPage()) { - auto dirPath = tabPage->folderView()->path(); - if(dirPath) { - createFileOrFolder(CreateNewFolder, dirPath); - } - } -} - -void MainWindow::on_actionNewBlankFile_triggered() { - if(TabPage* tabPage = currentPage()) { - auto dirPath = tabPage->folderView()->path(); - if(dirPath) { - createFileOrFolder(CreateNewTextFile, dirPath); - } - } -} - -void MainWindow::on_actionCloseTab_triggered() { - closeTab(ui.tabBar->currentIndex()); -} - -void MainWindow::on_actionCloseWindow_triggered() { - // FIXME: should we save state here? - close(); - // the window will be deleted automatically on close -} - -void MainWindow::on_actionFileProperties_triggered() { - TabPage* page = currentPage(); - if(page) { - auto files = page->selectedFiles(); - if(!files.empty()) { - Fm::FilePropsDialog::showForFiles(files); - } - } -} - -void MainWindow::on_actionFolderProperties_triggered() { - TabPage* page = currentPage(); - if(page) { - auto folder = page->folder(); - if(folder) { - auto info = folder->info(); - if(info) { - Fm::FilePropsDialog::showForFile(info); - } - } - } -} - -void MainWindow::on_actionShowHidden_triggered(bool checked) { - currentPage()->setShowHidden(checked); - ui.sidePane->setShowHidden(checked); - if(!currentPage()->hasCustomizedView()) { - static_cast(qApp)->settings().setShowHidden(checked); // remember globally - } -} - -void MainWindow::on_actionByFileName_triggered(bool /*checked*/) { - currentPage()->sort(Fm::FolderModel::ColumnFileName, currentPage()->sortOrder()); -} - -void MainWindow::on_actionByMTime_triggered(bool /*checked*/) { - currentPage()->sort(Fm::FolderModel::ColumnFileMTime, currentPage()->sortOrder()); -} - -void MainWindow::on_actionByOwner_triggered(bool /*checked*/) { - currentPage()->sort(Fm::FolderModel::ColumnFileOwner, currentPage()->sortOrder()); -} - -void MainWindow::on_actionByFileSize_triggered(bool /*checked*/) { - currentPage()->sort(Fm::FolderModel::ColumnFileSize, currentPage()->sortOrder()); -} - -void MainWindow::on_actionByFileType_triggered(bool /*checked*/) { - currentPage()->sort(Fm::FolderModel::ColumnFileType, currentPage()->sortOrder()); -} - -void MainWindow::on_actionAscending_triggered(bool /*checked*/) { - currentPage()->sort(currentPage()->sortColumn(), Qt::AscendingOrder); -} - -void MainWindow::on_actionDescending_triggered(bool /*checked*/) { - currentPage()->sort(currentPage()->sortColumn(), Qt::DescendingOrder); -} - -void MainWindow::on_actionCaseSensitive_triggered(bool checked) { - currentPage()->setSortCaseSensitive(checked); -} - -void MainWindow::on_actionFolderFirst_triggered(bool checked) { - currentPage()->setSortFolderFirst(checked); -} - -void MainWindow::on_actionPreserveView_triggered(bool /*checked*/) { - TabPage* page = currentPage(); - page->setCustomizedView(!page->hasCustomizedView()); -} - -void MainWindow::on_actionFilter_triggered(bool checked) { - ui.filterBar->setVisible(checked); - if(checked) { - ui.filterBar->setFocus(); - } - else if(TabPage* tabPage = currentPage()) { - ui.filterBar->clear(); - tabPage->folderView()->childView()->setFocus(); - // clear filter string for all tabs - int n = ui.stackedWidget->count(); - for(int i = 0; i < n; ++i) { - TabPage* page = static_cast(ui.stackedWidget->widget(i)); - if(!page->getFilterStr().isEmpty()) { - page->setFilterStr(QString()); - page->applyFilter(); - } - } - } - static_cast(qApp)->settings().setShowFilter(checked); -} - -void MainWindow::on_actionLocationBar_triggered(bool checked) { - if(checked) { - // show current path in a location bar entry - if(pathBar_ != nullptr) { - delete pathBar_; - pathBar_ = nullptr; - } - createPathBar(false); - pathEntry_->setText(currentPage()->pathName()); - static_cast(qApp)->settings().setPathBarButtons(false); - } -} - -void MainWindow::on_actionPathButtons_triggered(bool checked) { - if(checked && pathBar_ == nullptr) { - // show current path as buttons - if(pathEntry_ != nullptr) { - delete pathEntry_; - pathEntry_ = nullptr; - } - createPathBar(true); - pathBar_->setPath(currentPage()->path()); - static_cast(qApp)->settings().setPathBarButtons(true); - } -} - -void MainWindow::on_actionComputer_triggered() { - chdir(Fm::FilePath::fromUri("computer:///")); -} - -void MainWindow::on_actionApplications_triggered() { - chdir(Fm::FilePath::fromUri("menu://applications/")); -} - -void MainWindow::on_actionTrash_triggered() { - chdir(Fm::FilePath::fromUri("trash:///")); -} - -void MainWindow::on_actionNetwork_triggered() { - chdir(Fm::FilePath::fromUri("network:///")); -} - -void MainWindow::on_actionDesktop_triggered() { - auto desktop = QStandardPaths::writableLocation(QStandardPaths::DesktopLocation).toLocal8Bit(); - chdir(Fm::FilePath::fromLocalPath(desktop.constData())); -} - -void MainWindow::on_actionAddToBookmarks_triggered() { - TabPage* page = currentPage(); - if(page) { - auto cwd = page->path(); - if(cwd) { - auto dispName = cwd.baseName(); - bookmarks_->insert(cwd, dispName.get(), -1); - } - } -} - -void MainWindow::on_actionEditBookmarks_triggered() { - Application* app = static_cast(qApp); - app->editBookmarks(); -} - -void MainWindow::on_actionAbout_triggered() { - // the about dialog - class AboutDialog : public QDialog { - public: - explicit AboutDialog(QWidget* parent = 0, Qt::WindowFlags f = 0) : QDialog(parent, f) { - ui.setupUi(this); - ui.version->setText(tr("Version: %1").arg(PCMANFM_QT_VERSION)); - } - private: - Ui::AboutDialog ui; - }; - AboutDialog dialog(this); - dialog.exec(); -} - -void MainWindow::on_actionIconView_triggered() { - currentPage()->setViewMode(Fm::FolderView::IconMode); -} - -void MainWindow::on_actionCompactView_triggered() { - currentPage()->setViewMode(Fm::FolderView::CompactMode); -} - -void MainWindow::on_actionDetailedList_triggered() { - currentPage()->setViewMode(Fm::FolderView::DetailedListMode); -} - -void MainWindow::on_actionThumbnailView_triggered() { - currentPage()->setViewMode(Fm::FolderView::ThumbnailMode); -} - -void MainWindow::onTabBarCloseRequested(int index) { - closeTab(index); -} - -void MainWindow::onResetFocus() { - if(TabPage* page = currentPage()) { - page->folderView()->childView()->setFocus(); - } -} - -void MainWindow::onTabBarTabMoved(int from, int to) { - // a tab in the tab bar is moved by the user, so we have to move the - // corredponding tab page in the stacked widget to the new position, too. - QWidget* page = ui.stackedWidget->widget(from); - if(page) { - // we're not going to delete the tab page, so here we block signals - // to avoid calling the slot onStackedWidgetWidgetRemoved() before - // removing the page. Otherwise the page widget will be destroyed. - ui.stackedWidget->blockSignals(true); - ui.stackedWidget->removeWidget(page); - ui.stackedWidget->insertWidget(to, page); // insert the page to the new position - ui.stackedWidget->blockSignals(false); // unblock signals - ui.stackedWidget->setCurrentWidget(page); - } -} - -void MainWindow::focusFilterBar() { - if(!ui.filterBar->isVisible()) { - ui.actionFilter->trigger(); - } - else { - ui.filterBar->setFocus(); - } -} - -void MainWindow::onFilterStringChanged(QString str) { - if(TabPage* tabPage = currentPage()) { - // appy filter only if needed (not if tab is changed) - if(str != tabPage->getFilterStr()) { - tabPage->setFilterStr(str); - tabPage->applyFilter(); - } - } -} - -void MainWindow::closeTab(int index) { - QWidget* page = ui.stackedWidget->widget(index); - if(page) { - ui.stackedWidget->removeWidget(page); // this does not delete the page widget - delete page; - // NOTE: we do not remove the tab here. - // it'll be donoe in onStackedWidgetWidgetRemoved() - } -} - -void MainWindow::resizeEvent(QResizeEvent* event) { - QMainWindow::resizeEvent(event); - Settings& settings = static_cast(qApp)->settings(); - if(settings.rememberWindowSize()) { - settings.setLastWindowMaximized(isMaximized()); - - if(!isMaximized()) { - settings.setLastWindowWidth(width()); - settings.setLastWindowHeight(height()); - } - } -} - -void MainWindow::closeEvent(QCloseEvent* event) { - if(lastActive_ == this) { - lastActive_ = nullptr; - } - - QWidget::closeEvent(event); - Settings& settings = static_cast(qApp)->settings(); - if(settings.rememberWindowSize()) { - settings.setLastWindowMaximized(isMaximized()); - - if(!isMaximized()) { - settings.setLastWindowWidth(width()); - settings.setLastWindowHeight(height()); - } - } -} - -void MainWindow::onTabBarCurrentChanged(int index) { - ui.stackedWidget->setCurrentIndex(index); - if(TabPage* page = static_cast(ui.stackedWidget->widget(index))) { - ui.filterBar->setText(page->getFilterStr()); - } - updateUIForCurrentPage(); -} - -void MainWindow::updateStatusBarForCurrentPage() { - TabPage* tabPage = currentPage(); - QString text = tabPage->statusText(TabPage::StatusTextSelectedFiles); - if(text.isEmpty()) { - text = tabPage->statusText(TabPage::StatusTextNormal); - } - ui.statusbar->showMessage(text); - - text = tabPage->statusText(TabPage::StatusTextFSInfo); - fsInfoLabel_->setText(text); - fsInfoLabel_->setVisible(!text.isEmpty()); -} - -void MainWindow::updateViewMenuForCurrentPage() { - if(updatingViewMenu_) { // prevent recursive calls - return; - } - updatingViewMenu_ = true; - TabPage* tabPage = currentPage(); - if(tabPage) { - // update menus. FIXME: should we move this to another method? - ui.actionShowHidden->setChecked(tabPage->showHidden()); - ui.actionPreserveView->setChecked(tabPage->hasCustomizedView()); - - // view mode - QAction* modeAction = nullptr; - - switch(tabPage->viewMode()) { - case Fm::FolderView::IconMode: - modeAction = ui.actionIconView; - break; - - case Fm::FolderView::CompactMode: - modeAction = ui.actionCompactView; - break; - - case Fm::FolderView::DetailedListMode: - modeAction = ui.actionDetailedList; - break; - - case Fm::FolderView::ThumbnailMode: - modeAction = ui.actionThumbnailView; - break; - } - - Q_ASSERT(modeAction != nullptr); - modeAction->setChecked(true); - - // sort menu - QAction* sortActions[Fm::FolderModel::NumOfColumns]; - sortActions[Fm::FolderModel::ColumnFileName] = ui.actionByFileName; - sortActions[Fm::FolderModel::ColumnFileMTime] = ui.actionByMTime; - sortActions[Fm::FolderModel::ColumnFileSize] = ui.actionByFileSize; - sortActions[Fm::FolderModel::ColumnFileType] = ui.actionByFileType; - sortActions[Fm::FolderModel::ColumnFileOwner] = ui.actionByOwner; - sortActions[tabPage->sortColumn()]->setChecked(true); - - if(tabPage->sortOrder() == Qt::AscendingOrder) { - ui.actionAscending->setChecked(true); - } - else { - ui.actionDescending->setChecked(true); - } - ui.actionCaseSensitive->setChecked(tabPage->sortCaseSensitive()); - ui.actionFolderFirst->setChecked(tabPage->sortFolderFirst()); - } - updatingViewMenu_ = false; -} - -// Update the enabled state of Edit actions for selected files -void MainWindow::updateEditSelectedActions() { - bool hasAccessible(false); - bool hasDeletable(false); - int renamable(0); - if(TabPage* page = currentPage()) { - auto files = page->selectedFiles(); - for(auto& file: files) { - if(file->isAccessible()) { - hasAccessible = true; - } - if(file->isDeletable()) { - hasDeletable = true; - } - if(file->canSetName()) { - ++renamable; - } - if (hasAccessible && hasDeletable && renamable > 1) { - break; - } - } - } - ui.actionCopy->setEnabled(hasAccessible); - ui.actionCut->setEnabled(hasDeletable); - ui.actionDelete->setEnabled(hasDeletable); - ui.actionRename->setEnabled(renamable > 0); - ui.actionBulkRename->setEnabled(renamable > 1); -} - -void MainWindow::updateUIForCurrentPage() { - TabPage* tabPage = currentPage(); - - if(tabPage) { - setWindowTitle(tabPage->windowTitle()); - if(pathEntry_ != nullptr) { - pathEntry_->setText(tabPage->pathName()); - } - else if(pathBar_ != nullptr) { - pathBar_->setPath(tabPage->path()); - } - ui.statusbar->showMessage(tabPage->statusText()); - fsInfoLabel_->setText(tabPage->statusText(TabPage::StatusTextFSInfo)); - tabPage->folderView()->childView()->setFocus(); - - // update side pane - ui.sidePane->setCurrentPath(tabPage->path()); - ui.sidePane->setShowHidden(tabPage->showHidden()); - - // update back/forward/up toolbar buttons - ui.actionGoUp->setEnabled(tabPage->canUp()); - ui.actionGoBack->setEnabled(tabPage->canBackward()); - ui.actionGoForward->setEnabled(tabPage->canForward()); - - updateViewMenuForCurrentPage(); - updateStatusBarForCurrentPage(); - } - - // also update the enabled state of Edit actions - updateEditSelectedActions(); - bool isWritable(false); - if(tabPage && tabPage->folder()) { - if(auto info = tabPage->folder()->info()) { - isWritable = info->isWritable(); - } - } - ui.actionPaste->setEnabled(isWritable); -} - -void MainWindow::onStackedWidgetWidgetRemoved(int index) { - // qDebug("onStackedWidgetWidgetRemoved: %d", index); - // need to remove associated tab from tabBar - ui.tabBar->removeTab(index); - if(ui.tabBar->count() == 0) { // this is the last one - deleteLater(); // destroy the whole window - // qDebug("delete window"); - } - else { - Settings& settings = static_cast(qApp)->settings(); - if(!settings.alwaysShowTabs() && ui.tabBar->count() == 1) { - ui.tabBar->setVisible(false); - } - } -} - -void MainWindow::onTabPageTitleChanged(QString title) { - TabPage* tabPage = static_cast(sender()); - int index = ui.stackedWidget->indexOf(tabPage); - if(index >= 0) { - ui.tabBar->setTabText(index, title); - } - - if(tabPage == currentPage()) { - setWindowTitle(title); - - // Since TabPage::titleChanged is emitted on changing directory, - // the enabled state of Paste action should be updated here - bool isWritable(false); - if(tabPage && tabPage->folder()) { - if(auto info = tabPage->folder()->info()) { - isWritable = info->isWritable(); - } - } - ui.actionPaste->setEnabled(isWritable); - } -} - -void MainWindow::onTabPageStatusChanged(int type, QString statusText) { - TabPage* tabPage = static_cast(sender()); - if(tabPage == currentPage()) { - switch(type) { - case TabPage::StatusTextNormal: - case TabPage::StatusTextSelectedFiles: { - // although the status text may change very frequently, - // the text of PCManFM::StatusBar is updated with a delay - QString text = tabPage->statusText(TabPage::StatusTextSelectedFiles); - if(text.isEmpty()) { - ui.statusbar->showMessage(tabPage->statusText(TabPage::StatusTextNormal)); - } - else { - ui.statusbar->showMessage(text); - } - break; - } - case TabPage::StatusTextFSInfo: - fsInfoLabel_->setText(tabPage->statusText(TabPage::StatusTextFSInfo)); - fsInfoLabel_->setVisible(!statusText.isEmpty()); - break; - } - } - - // Since TabPage::statusChanged is always emitted after View::selChanged, - // there is no need to connect a separate slot to the latter signal - updateEditSelectedActions(); -} - -void MainWindow::onTabPageOpenDirRequested(const Fm::FilePath& path, int target) { - switch(target) { - case OpenInCurrentTab: - chdir(path); - break; - - case OpenInNewTab: - addTab(path); - break; - - case OpenInNewWindow: - (new MainWindow(path))->show(); - break; - } -} - -void MainWindow::onTabPageSortFilterChanged() { - TabPage* tabPage = static_cast(sender()); - if(tabPage == currentPage()) { - updateViewMenuForCurrentPage(); - if(!tabPage->hasCustomizedView()) { - Settings& settings = static_cast(qApp)->settings(); - settings.setSortColumn(static_cast(tabPage->sortColumn())); - settings.setSortOrder(tabPage->sortOrder()); - settings.setSortFolderFirst(tabPage->sortFolderFirst()); - settings.setSortCaseSensitive(tabPage->sortCaseSensitive()); - settings.setShowHidden(tabPage->showHidden()); // remember globally , as in on_actionShowHidden_triggered() - } - tabPage->setShowHidden(tabPage->showHidden()); // change status text and perfolder setting - } -} - - -void MainWindow::onSidePaneChdirRequested(int type, const Fm::FilePath &path) { - // FIXME: use enum for type value or change it to button. - if(type == 0) { // left button (default) - chdir(path); - } - else if(type == 1) { // middle button - addTab(path); - } - else if(type == 2) { // new window - (new MainWindow(path))->show(); - } -} - -void MainWindow::onSidePaneOpenFolderInNewWindowRequested(const Fm::FilePath &path) { - (new MainWindow(path))->show(); -} - -void MainWindow::onSidePaneOpenFolderInNewTabRequested(const Fm::FilePath &path) { - addTab(path); -} - -void MainWindow::onSidePaneOpenFolderInTerminalRequested(const Fm::FilePath &path) { - Application* app = static_cast(qApp); - app->openFolderInTerminal(path); -} - -void MainWindow::onSidePaneCreateNewFolderRequested(const Fm::FilePath &path) { - createFileOrFolder(CreateNewFolder, path); -} - -void MainWindow::onSidePaneModeChanged(Fm::SidePane::Mode mode) { - static_cast(qApp)->settings().setSidePaneMode(mode); -} - -void MainWindow::onSettingHiddenPlace(const QString& str, bool hide) { - static_cast(qApp)->settings().setHiddenPlace(str, hide); -} - -void MainWindow::onSplitterMoved(int pos, int /*index*/) { - Application* app = static_cast(qApp); - app->settings().setSplitterPos(pos); -} - -void MainWindow::loadBookmarksMenu() { - QAction* before = ui.actionAddToBookmarks; - for(auto& item: bookmarks_->items()) { - BookmarkAction* action = new BookmarkAction(item, ui.menu_Bookmarks); - connect(action, &QAction::triggered, this, &MainWindow::onBookmarkActionTriggered); - ui.menu_Bookmarks->insertAction(before, action); - } - - ui.menu_Bookmarks->insertSeparator(before); -} - -void MainWindow::onBookmarksChanged() { - // delete existing items - QList actions = ui.menu_Bookmarks->actions(); - QList::const_iterator it = actions.constBegin(); - QList::const_iterator last_it = actions.constEnd() - 2; - - while(it != last_it) { - QAction* action = *it; - ++it; - ui.menu_Bookmarks->removeAction(action); - } - - loadBookmarksMenu(); -} - -void MainWindow::onBookmarkActionTriggered() { - BookmarkAction* action = static_cast(sender()); - auto path = action->path(); - if(path) { - Application* app = static_cast(qApp); - Settings& settings = app->settings(); - switch(settings.bookmarkOpenMethod()) { - case OpenInCurrentTab: /* current tab */ - default: - chdir(path); - break; - case OpenInNewTab: /* new tab */ - addTab(path); - break; - case OpenInNewWindow: /* new window */ - (new MainWindow(path))->show(); - break; - } - } -} - -void MainWindow::on_actionCopy_triggered() { - TabPage* page = currentPage(); - auto paths = page->selectedFilePaths(); - copyFilesToClipboard(paths); -} - -void MainWindow::on_actionCut_triggered() { - TabPage* page = currentPage(); - auto paths = page->selectedFilePaths(); - cutFilesToClipboard(paths); -} - -void MainWindow::on_actionPaste_triggered() { - pasteFilesFromClipboard(currentPage()->path(), this); -} - -void MainWindow::on_actionDelete_triggered() { - Application* app = static_cast(qApp); - Settings& settings = app->settings(); - TabPage* page = currentPage(); - auto paths = page->selectedFilePaths(); - - bool shiftPressed = (qApp->keyboardModifiers() & Qt::ShiftModifier ? true : false); - if(settings.useTrash() && !shiftPressed) { - FileOperation::trashFiles(paths, settings.confirmTrash(), this); - } - else { - FileOperation::deleteFiles(paths, settings.confirmDelete(), this); - } -} - -void MainWindow::on_actionRename_triggered() { - // do inline renaming if only one item is selected, - // otherwise use the renaming dialog - TabPage* page = currentPage(); - auto files = page->selectedFiles(); - if(files.size() == 1) { - QAbstractItemView* view = page->folderView()->childView(); - QModelIndexList selIndexes = view->selectionModel()->selectedIndexes(); - if(selIndexes.size() > 1) { // in the detailed list mode, only the first index is editable - view->setCurrentIndex(selIndexes.at(0)); - } - QModelIndex cur = view->currentIndex(); - if (cur.isValid()) { - view->scrollTo(cur); - view->edit(cur); - return; - } - } - if(!files.empty()) { - for(auto& file: files) { - if(!Fm::renameFile(file, nullptr)) { - break; - } - } - } -} - -void MainWindow::on_actionBulkRename_triggered() { - BulkRenamer(currentPage()->selectedFiles(), this); -} - -void MainWindow::on_actionSelectAll_triggered() { - currentPage()->selectAll(); -} - -void MainWindow::on_actionInvertSelection_triggered() { - currentPage()->invertSelection(); -} - -void MainWindow::on_actionPreferences_triggered() { - Application* app = reinterpret_cast(qApp); - app->preferences(QString()); -} - -// change some icons according to layout direction -void MainWindow::setRTLIcons(bool isRTL) { - QIcon nxtIcn = QIcon::fromTheme("go-next"); - QIcon prevIcn = QIcon::fromTheme("go-previous"); - if(isRTL) { - ui.actionGoBack->setIcon(nxtIcn); - ui.actionCloseLeft->setIcon(nxtIcn); - ui.actionGoForward->setIcon(prevIcn); - ui.actionCloseRight->setIcon(prevIcn); - } - else { - ui.actionGoBack->setIcon(prevIcn); - ui.actionCloseLeft->setIcon(prevIcn); - ui.actionGoForward->setIcon(nxtIcn); - ui.actionCloseRight->setIcon(nxtIcn); - } -} - -bool MainWindow::event(QEvent* event) { - switch(event->type()) { - case QEvent::WindowActivate: - lastActive_ = this; - default: - break; - } - return QMainWindow::event(event); -} - -void MainWindow::changeEvent(QEvent* event) { - switch(event->type()) { - case QEvent::LayoutDirectionChange: - setRTLIcons(QApplication::layoutDirection() == Qt::RightToLeft); - break; - default: - break; - } - QWidget::changeEvent(event); -} - -void MainWindow::onBackForwardContextMenu(QPoint pos) { - // show a popup menu for browsing history here. - QToolButton* btn = static_cast(sender()); - TabPage* page = currentPage(); - Fm::BrowseHistory& history = page->browseHistory(); - int current = history.currentIndex(); - QMenu menu; - for(size_t i = 0; i < history.size(); ++i) { - const BrowseHistoryItem& item = history.at(i); - auto path = item.path(); - auto name = path.displayName(); - QAction* action = menu.addAction(name.get()); - if(i == static_cast(current)) { - // make the current path bold and checked - action->setCheckable(true); - action->setChecked(true); - QFont font = menu.font(); - font.setBold(true); - action->setFont(font); - } - } - QAction* selectedAction = menu.exec(btn->mapToGlobal(pos)); - if(selectedAction) { - int index = menu.actions().indexOf(selectedAction); - ui.filterBar->clear(); - page->jumpToHistory(index); - updateUIForCurrentPage(); - } -} - -void MainWindow::tabContextMenu(const QPoint& pos) { - int tabNum = ui.tabBar->count(); - if(tabNum <= 1) { - return; - } - - rightClickIndex_ = ui.tabBar->tabAt(pos); - if(rightClickIndex_ < 0) { - return; - } - - QMenu menu; - if(rightClickIndex_ > 0) { - menu.addAction(ui.actionCloseLeft); - } - if(rightClickIndex_ < tabNum - 1) { - menu.addAction(ui.actionCloseRight); - if(rightClickIndex_ > 0) { - menu.addSeparator(); - menu.addAction(ui.actionCloseOther); - } - } - menu.exec(ui.tabBar->mapToGlobal(pos)); -} - -void MainWindow::closeLeftTabs() { - while(rightClickIndex_ > 0) { - closeTab(rightClickIndex_ - 1); - --rightClickIndex_; - } -} - -void MainWindow::closeRightTabs() { - if(rightClickIndex_ < 0) { - return; - } - while(rightClickIndex_ < ui.tabBar->count() - 1) { - closeTab(rightClickIndex_ + 1); - } -} - -void MainWindow::focusPathEntry() { - // use text entry for the path bar - if(pathEntry_ != nullptr) { - pathEntry_->setFocus(); - pathEntry_->selectAll(); - } - else if(pathBar_ != nullptr) { // use button-style path bar - pathBar_->openEditor(); - } -} - -void MainWindow::dragEnterEvent(QDragEnterEvent* event) { - if(event->mimeData()->hasFormat("application/pcmanfm-qt-tab")) { - event->acceptProposedAction(); - } -} - -void MainWindow::dropEvent(QDropEvent* event) { - if(event->mimeData()->hasFormat("application/pcmanfm-qt-tab")) { - dropTab(); - } - event->acceptProposedAction(); -} - -void MainWindow::dropTab() { - if(lastActive_ == nullptr // impossible - || lastActive_ == this) { // don't drop on the same window - ui.tabBar->finishMouseMoveEvent(); - return; - } - - // close the tab in the first window and add - // its page to a new tab in the second window - TabPage* dropPage = lastActive_->currentPage(); - if(dropPage) { - disconnect(dropPage, nullptr, lastActive_, nullptr); - - // release mouse before tab removal because otherwise, the source tabbar - // might not be updated properly with tab reordering during a fast drag-and-drop - lastActive_->ui.tabBar->releaseMouse(); - - QWidget* page = lastActive_->ui.stackedWidget->currentWidget(); - lastActive_->ui.stackedWidget->removeWidget(page); - int index = addTabWithPage(dropPage); - ui.tabBar->setCurrentIndex(index); - } - else { - ui.tabBar->finishMouseMoveEvent(); // impossible - } -} - -void MainWindow::detachTab() { - if (ui.stackedWidget->count() == 1) { // don't detach a single tab - ui.tabBar->finishMouseMoveEvent(); - return; - } - - // close the tab and move its page to a new window - TabPage* dropPage = currentPage(); - if(dropPage) { - disconnect(dropPage, nullptr, this, nullptr); - - ui.tabBar->releaseMouse(); // as in dropTab() - - QWidget* page = ui.stackedWidget->currentWidget(); - ui.stackedWidget->removeWidget(page); - MainWindow* newWin = new MainWindow(); - newWin->addTabWithPage(dropPage); - newWin->show(); - } - else { - ui.tabBar->finishMouseMoveEvent(); // impossible - } -} - -void MainWindow::updateFromSettings(Settings& settings) { - // apply settings - - // menu - ui.actionDelete->setText(settings.useTrash() ? tr("&Move to Trash") : tr("&Delete")); - ui.actionDelete->setIcon(settings.useTrash() ? QIcon::fromTheme("user-trash") : QIcon::fromTheme("edit-delete")); - - // side pane - ui.sidePane->setIconSize(QSize(settings.sidePaneIconSize(), settings.sidePaneIconSize())); - - // tabs - ui.tabBar->setTabsClosable(settings.showTabClose()); - ui.tabBar->setVisible(settings.alwaysShowTabs() || (ui.tabBar->count() > 1)); - if(ui.verticalLayout->indexOf(ui.tabBar) > -1) { - if(!settings.fullWidthTabBar()) { - ui.verticalLayout->removeWidget(ui.tabBar); - ui.verticalLayout_2->insertWidget(0, ui.tabBar); - } - } - else if(ui.verticalLayout_2->indexOf(ui.tabBar) > -1 && settings.fullWidthTabBar()) { - ui.verticalLayout_2->removeWidget(ui.tabBar); - ui.verticalLayout->insertWidget(0, ui.tabBar); - } - - // all tab pages - int n = ui.stackedWidget->count(); - - for(int i = 0; i < n; ++i) { - TabPage* page = static_cast(ui.stackedWidget->widget(i)); - page->updateFromSettings(settings); - } -} - -static const char* su_cmd_subst(char /*opt*/, gpointer user_data) { - return (const char*)user_data; -} - -static FmAppCommandParseOption su_cmd_opts[] = { - { 's', su_cmd_subst }, - { 0, nullptr } -}; - -void MainWindow::on_actionOpenAsRoot_triggered() { - TabPage* page = currentPage(); - - if(page) { - Application* app = static_cast(qApp); - Settings& settings = app->settings(); - - if(!settings.suCommand().isEmpty()) { - // run the su command - // FIXME: it's better to get the filename of the current process rather than hard-code pcmanfm-qt here. - QByteArray suCommand = settings.suCommand().toLocal8Bit(); - char* cmd = nullptr; - QByteArray programCommand = app->applicationFilePath().toLocal8Bit(); - programCommand += " %U"; - - if(fm_app_command_parse(suCommand.constData(), su_cmd_opts, &cmd, gpointer(programCommand.constData())) == 0) { - /* no %s found so just append to it */ - g_free(cmd); - cmd = g_strconcat(suCommand.constData(), programCommand.constData(), nullptr); - } - - Fm::GAppInfoPtr appInfo{g_app_info_create_from_commandline(cmd, nullptr, GAppInfoCreateFlags(0), nullptr), false}; - g_free(cmd); - - if(appInfo) { - auto cwd = page->path(); - Fm::GErrorPtr err; - auto uri = cwd.uri(); - GList* uris = g_list_prepend(nullptr, uri.get()); - - if(!g_app_info_launch_uris(appInfo.get(), uris, nullptr, &err)) { - QMessageBox::critical(this, tr("Error"), QString::fromUtf8(err->message)); - } - - g_list_free(uris); - } - } - else { - // show an error message and ask the user to set the command - QMessageBox::critical(this, tr("Error"), tr("Switch user command is not set.")); - app->preferences("advanced"); - } - } -} - -void MainWindow::on_actionFindFiles_triggered() { - Application* app = static_cast(qApp); - auto selectedPaths = currentPage()->selectedFilePaths(); - QStringList paths; - if(!selectedPaths.empty()) { - for(auto& path: selectedPaths) { - // FIXME: is it ok to use display name here? - // This might be broken on filesystems with non-UTF-8 filenames. - paths.append(path.displayName().get()); - } - } - else { - paths.append(currentPage()->pathName()); - } - app->findFiles(paths); -} - -void MainWindow::on_actionOpenTerminal_triggered() { - TabPage* page = currentPage(); - if(page) { - Application* app = static_cast(qApp); - app->openFolderInTerminal(page->path()); - } -} - -void MainWindow::onShortcutNextTab() { - int current = ui.tabBar->currentIndex(); - if(current < ui.tabBar->count() - 1) { - ui.tabBar->setCurrentIndex(current + 1); - } - else { - ui.tabBar->setCurrentIndex(0); - } -} - -void MainWindow::onShortcutPrevTab() { - int current = ui.tabBar->currentIndex(); - if(current > 0) { - ui.tabBar->setCurrentIndex(current - 1); - } - else { - ui.tabBar->setCurrentIndex(ui.tabBar->count() - 1); - } -} - -// Switch to nth tab when Alt+n or Ctrl+n is pressed -void MainWindow::onShortcutJumpToTab() { - QShortcut* shortcut = reinterpret_cast(sender()); - QKeySequence seq = shortcut->key(); - int keyValue = seq[0]; - // See the source code of QKeySequence and refer to the method: - // QString QKeySequencePrivate::encodeString(int key, QKeySequence::SequenceFormat format). - // Then we know how to test if a key sequence contains a modifier. - // It's a shame that Qt has no API for this task. - - if((keyValue & Qt::ALT) == Qt::ALT) { // test if we have Alt key pressed - keyValue -= Qt::ALT; - } - else if((keyValue & Qt::CTRL) == Qt::CTRL) { // test if we have Ctrl key pressed - keyValue -= Qt::CTRL; - } - - // now keyValue should contains '0' - '9' only - int index; - if(keyValue == '0') { - index = 9; - } - else { - index = keyValue - '1'; - } - if(index < ui.tabBar->count()) { - ui.tabBar->setCurrentIndex(index); - } -} - -} diff --git a/pcmanfm/mainwindow.h b/pcmanfm/mainwindow.h deleted file mode 100644 index ab01913..0000000 --- a/pcmanfm/mainwindow.h +++ /dev/null @@ -1,218 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#ifndef FM_MAIN_WINDOW_H -#define FM_MAIN_WINDOW_H - -#include "ui_main-win.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "launcher.h" -#include -#include - -namespace Fm { -class PathEdit; -class PathBar; -} - -namespace PCManFM { - -class TabPage; -class Settings; - -class MainWindow : public QMainWindow { - Q_OBJECT -public: - MainWindow(Fm::FilePath path = Fm::FilePath()); - virtual ~MainWindow(); - - void chdir(Fm::FilePath path); - int addTab(Fm::FilePath path); - - TabPage* currentPage() { - return reinterpret_cast(ui.stackedWidget->currentWidget()); - } - - void updateFromSettings(Settings& settings); - - static MainWindow* lastActive() { - return lastActive_; - } - -protected Q_SLOTS: - - void onPathEntryReturnPressed(); - void onPathBarChdir(const Fm::FilePath& dirPath); - void onPathBarMiddleClickChdir(const Fm::FilePath &dirPath); - - void on_actionNewTab_triggered(); - void on_actionNewWin_triggered(); - void on_actionNewFolder_triggered(); - void on_actionNewBlankFile_triggered(); - void on_actionCloseTab_triggered(); - void on_actionCloseWindow_triggered(); - void on_actionFileProperties_triggered(); - void on_actionFolderProperties_triggered(); - - void on_actionCut_triggered(); - void on_actionCopy_triggered(); - void on_actionPaste_triggered(); - void on_actionDelete_triggered(); - void on_actionRename_triggered(); - void on_actionBulkRename_triggered(); - void on_actionSelectAll_triggered(); - void on_actionInvertSelection_triggered(); - void on_actionPreferences_triggered(); - - void on_actionGoBack_triggered(); - void on_actionGoForward_triggered(); - void on_actionGoUp_triggered(); - void on_actionHome_triggered(); - void on_actionReload_triggered(); - void on_actionConnectToServer_triggered(); - - void on_actionIconView_triggered(); - void on_actionCompactView_triggered(); - void on_actionDetailedList_triggered(); - void on_actionThumbnailView_triggered(); - - void on_actionGo_triggered(); - void on_actionShowHidden_triggered(bool check); - void on_actionPreserveView_triggered(bool checked); - - void on_actionByFileName_triggered(bool checked); - void on_actionByMTime_triggered(bool checked); - void on_actionByOwner_triggered(bool checked); - void on_actionByFileType_triggered(bool checked); - void on_actionByFileSize_triggered(bool checked); - void on_actionAscending_triggered(bool checked); - void on_actionDescending_triggered(bool checked); - void on_actionFolderFirst_triggered(bool checked); - void on_actionCaseSensitive_triggered(bool checked); - void on_actionFilter_triggered(bool checked); - - void on_actionLocationBar_triggered(bool checked); - void on_actionPathButtons_triggered(bool checked); - - void on_actionApplications_triggered(); - void on_actionComputer_triggered(); - void on_actionTrash_triggered(); - void on_actionNetwork_triggered(); - void on_actionDesktop_triggered(); - void on_actionAddToBookmarks_triggered(); - void on_actionEditBookmarks_triggered(); - - void on_actionOpenTerminal_triggered(); - void on_actionOpenAsRoot_triggered(); - void on_actionFindFiles_triggered(); - - void on_actionAbout_triggered(); - - void onBookmarkActionTriggered(); - - void onTabBarCloseRequested(int index); - void onTabBarCurrentChanged(int index); - void onTabBarTabMoved(int from, int to); - - void focusFilterBar(); - void onFilterStringChanged(QString str); - - void onShortcutPrevTab(); - void onShortcutNextTab(); - void onShortcutJumpToTab(); - - void onStackedWidgetWidgetRemoved(int index); - - void onTabPageTitleChanged(QString title); - void onTabPageStatusChanged(int type, QString statusText); - void onTabPageOpenDirRequested(const Fm::FilePath &path, int target); - void onTabPageSortFilterChanged(); - - void onSidePaneChdirRequested(int type, const Fm::FilePath &path); - void onSidePaneOpenFolderInNewWindowRequested(const Fm::FilePath &path); - void onSidePaneOpenFolderInNewTabRequested(const Fm::FilePath &path); - void onSidePaneOpenFolderInTerminalRequested(const Fm::FilePath &path); - void onSidePaneCreateNewFolderRequested(const Fm::FilePath &path); - void onSidePaneModeChanged(Fm::SidePane::Mode mode); - void onSplitterMoved(int pos, int index); - void onResetFocus(); - - void onBackForwardContextMenu(QPoint pos); - - void tabContextMenu(const QPoint& pos); - void closeLeftTabs(); - void closeRightTabs(); - void closeOtherTabs() { - closeLeftTabs(); - closeRightTabs(); - } - void focusPathEntry(); - void toggleMenuBar(bool checked); - void detachTab(); - - void onBookmarksChanged(); - - void onSettingHiddenPlace(const QString& str, bool hide); - -protected: - bool event(QEvent* event) override; - void changeEvent(QEvent* event) override; - void closeTab(int index); - virtual void resizeEvent(QResizeEvent* event) override; - virtual void closeEvent(QCloseEvent* event) override; - virtual void dragEnterEvent(QDragEnterEvent* event) override; - virtual void dropEvent(QDropEvent* event) override; - -private: - void loadBookmarksMenu(); - void updateUIForCurrentPage(); - void updateViewMenuForCurrentPage(); - void updateEditSelectedActions(); - void updateStatusBarForCurrentPage(); - void setRTLIcons(bool isRTL); - void createPathBar(bool usePathButtons); - int addTabWithPage(TabPage* page, Fm::FilePath path = Fm::FilePath()); - void dropTab(); - -private: - Ui::MainWindow ui; - Fm::PathEdit* pathEntry_; - Fm::PathBar* pathBar_; - QLabel* fsInfoLabel_; - std::shared_ptr bookmarks_; - Launcher fileLauncher_; - int rightClickIndex_; - bool updatingViewMenu_; - QAction* menuSep_; - - static MainWindow* lastActive_; -}; - -} - -#endif // FM_MAIN_WINDOW_H diff --git a/pcmanfm/org.pcmanfm.Application.xml b/pcmanfm/org.pcmanfm.Application.xml deleted file mode 100644 index 448c34e..0000000 --- a/pcmanfm/org.pcmanfm.Application.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/pcmanfm/pcmanfm-qt-desktop-pref.desktop.in b/pcmanfm/pcmanfm-qt-desktop-pref.desktop.in deleted file mode 100644 index 03aab56..0000000 --- a/pcmanfm/pcmanfm-qt-desktop-pref.desktop.in +++ /dev/null @@ -1,9 +0,0 @@ -[Desktop Entry] -Type=Application -Name=Desktop -GenericName=Desktop Settings -Comment=Change wallpapers and behavior of desktop manager -Exec=pcmanfm-qt --desktop-pref=general -Icon=user-desktop -Categories=Settings;Qt;DesktopSettings; -StartupNotify=true diff --git a/pcmanfm/pcmanfm-qt.desktop.in b/pcmanfm/pcmanfm-qt.desktop.in deleted file mode 100644 index fa7a949..0000000 --- a/pcmanfm/pcmanfm-qt.desktop.in +++ /dev/null @@ -1,10 +0,0 @@ -[Desktop Entry] -Type=Application -Name=PCManFM-Qt File Manager -GenericName=File Manager -Comment=Browse the file system and manage the files -Exec=pcmanfm-qt %U -MimeType=inode/directory; -Icon=system-file-manager -Categories=FileManager;Utility;Core;Qt; -StartupNotify=true diff --git a/pcmanfm/pcmanfm.cpp b/pcmanfm/pcmanfm.cpp deleted file mode 100644 index 2b56c36..0000000 --- a/pcmanfm/pcmanfm.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include -#include "application.h" -#include - -int main(int argc, char** argv) { - // ensure that glib integration of Qt is not turned off - // This fixes #168: https://github.com/lxqt/pcmanfm-qt/issues/168 - qunsetenv("QT_NO_GLIB"); - - PCManFM::Application app(argc, argv); - app.setAttribute(Qt::AA_UseHighDpiPixmaps, true); - - app.init(); - return app.exec(); -} diff --git a/pcmanfm/preferences.ui b/pcmanfm/preferences.ui deleted file mode 100644 index bc50214..0000000 --- a/pcmanfm/preferences.ui +++ /dev/null @@ -1,1070 +0,0 @@ - - - PreferencesDialog - - - - 0 - 0 - 685 - 440 - - - - Preferences - - - - - - - - - 0 - 0 - - - - Qt::ScrollBarAlwaysOff - - - -1 - - - - Behavior - - - - - Display - - - - - User Interface - - - - - Thumbnail - - - - - Volume - - - - - Advanced - - - - - - - - - 0 - 0 - - - - 0 - - - - - - - Browsing - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Open files with single click - - - - - - - false - - - Delay of auto-selection in single click mode (0 to disable) - - - - - - - Default view mode: - - - - - - - - - - false - - - sec - - - 0.100000000000000 - - - - - - - Bookmarks: - - - - - - - - Open in current tab - - - - - Open in new tab - - - - - Open in new window - - - - - - - - - - - File Operations - - - - - - Confirm before deleting files - - - - - - - Move deleted files to "trash bin" instead of erasing from disk. - - - - - - - Erase files on removable media instead of "trash can" creation - - - - - - - Confirm before moving files into "trash can" - - - - - - - Launch executable files without prompt -(Requires application restart to take effect) - - - - - - - Select newly created files - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - Icons - - - - - - - 0 - 0 - - - - Icon theme: - - - - - - - - 0 - 0 - - - - - - - - Used by Icon View - - - Size of big icons: - - - - - - - Used by Icon View - - - - - - - Used by Compact View and Detailed List View - - - Size of small icons: - - - - - - - Used by Compact View and Detailed List View - - - - - - - Used by Thumbnail View - - - Size of thumbnails: - - - - - - - Used by Thumbnail View - - - - - - - Size of side pane icons: - - - - - - - - - - - - - User interface - - - - - - Use SI decimal prefixes instead of IEC binary prefixes - - - - - - - Treat backup files as hidden - - - - - - - false - - - Always show full file names - - - - - - - false - - - Show icons of hidden files shadowed - - - - - - - Qt::Vertical - - - QSizePolicy::Fixed - - - - 20 - 5 - - - - - - - - Minimum item margins in icon view: - - - - - - - 3 px by default. - - - px - - - 48 - - - 3 - - - - - - - x - - - - - - - 3 px by default. -A space is also reserved for 3 lines of text. - - - px - - - 48 - - - 3 - - - - - - - Lock - - - - - - - Qt::Horizontal - - - - 20 - 5 - - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - Window - - - - QFormLayout::ExpandingFieldsGrow - - - - - When unchecked, the tab bar will be shown -only if there are more than one tab. - - - Always show the tab bar - - - - - - - If unchecked, the tab bar will be positioned only -above the folder-view and not above the left pane. - - - Fullwidth tab bar - - - - - - - Show 'Close' buttons on tabs - - - - - - - Remember the size of the last closed window - - - - - - - Default width of new windows: - - - - - - - 32768 - - - - - - - Default height of new windows: - - - - - - - 32768 - - - - - - - - - - Show in places - - - - - - - Home - - - Unchecked - - - - - - - - - - Desktop - - - Unchecked - - - - - - - - - - Trash can - - - Unchecked - - - - - - - - - - Computer - - - Unchecked - - - - - - - - - - Applications - - - Unchecked - - - - - Devices - - - Unchecked - - - - - Network - - - Unchecked - - - - - - - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - Thumbnail - - - - - - Do not generate thumbnails for image files exceeding this size: - - - - - - - KB - - - 1048576 - - - - - - - Only show thumbnails for local files - - - - - - - Needs ffmpegthumbnailer - - - Show thumbnails of files - - - - - - - - - - Qt::Vertical - - - - 0 - 225 - - - - - - - - - - - - Auto Mount - - - - - - Mount mountable volumes automatically on program startup - - - - - - - Mount removable media automatically when they are inserted - - - - - - - Show available options for removable media when they are inserted - - - - - - - - - - When removable medium unmounted: - - - - - - Close &tab containing removable medium - - - - - - - Chan&ge folder in the tab to home folder - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - Programs - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - Terminal emulator: - - - - - - - Switch &user command: - - - suCommand - - - - - - - - - - Examples: "xterm -e %s" for terminal or "gksu %s" for switching user. -%s = the command line you want to execute with terminal or su. - - - Qt::PlainText - - - - - - - Archiver in&tegration: - - - archiver - - - - - - - - - - true - - - - - - - - - - Templates - - - - - - Show only user defined templates in menu - - - - - - - Show only one template for each MIME type - - - - - - - Run default application after creation from template - - - - - - - - - - Qt::Vertical - - - - 0 - 0 - - - - - - - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - listWidget - alwaysShowTabs - showTabClose - rememberWindowSize - fixedWindowWidth - fixedWindowHeight - singleClick - autoSelectionDelay - viewMode - configmDelete - useTrash - mountOnStartup - mountRemovable - autoRun - closeOnUnmount - goHomeOnUnmount - terminal - suCommand - archiver - - - - - buttonBox - accepted() - PreferencesDialog - accept() - - - 261 - 487 - - - 157 - 274 - - - - - buttonBox - rejected() - PreferencesDialog - reject() - - - 329 - 487 - - - 286 - 274 - - - - - listWidget - currentRowChanged(int) - stackedWidget - setCurrentIndex(int) - - - 94 - 157 - - - 359 - 145 - - - - - singleClick - toggled(bool) - label - setEnabled(bool) - - - 237 - 39 - - - 237 - 39 - - - - - rememberWindowSize - toggled(bool) - fixedWindowWidth - setDisabled(bool) - - - 506 - 351 - - - 462 - 386 - - - - - singleClick - toggled(bool) - autoSelectionDelay - setEnabled(bool) - - - 237 - 39 - - - 237 - 39 - - - - - rememberWindowSize - toggled(bool) - fixedWindowHeight - setDisabled(bool) - - - 549 - 351 - - - 462 - 421 - - - - - rememberWindowSize - toggled(bool) - label_12 - setDisabled(bool) - - - 211 - 342 - - - 211 - 374 - - - - - rememberWindowSize - toggled(bool) - label_13 - setDisabled(bool) - - - 183 - 338 - - - 187 - 404 - - - - - diff --git a/pcmanfm/preferencesdialog.cpp b/pcmanfm/preferencesdialog.cpp deleted file mode 100644 index 4da33b0..0000000 --- a/pcmanfm/preferencesdialog.cpp +++ /dev/null @@ -1,400 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "preferencesdialog.h" -#include "application.h" -#include "settings.h" -#include -#include -#include -#include - -#include -#include -#include - -namespace PCManFM { - -PreferencesDialog::PreferencesDialog(QString activePage, QWidget* parent): - QDialog(parent) { - ui.setupUi(this); - setAttribute(Qt::WA_DeleteOnClose); - - // resize the list widget according to the width of its content. - ui.listWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - ui.listWidget->setMaximumWidth(ui.listWidget->sizeHintForColumn(0) + ui.listWidget->frameWidth() * 2 + 4); - - initFromSettings(); - - selectPage(activePage); - adjustSize(); -} - -PreferencesDialog::~PreferencesDialog() { - -} - -static void findIconThemesInDir(QHash& iconThemes, QString dirName) { - QDir dir(dirName); - const QStringList subDirs = dir.entryList(QDir::AllDirs); - GKeyFile* kf = g_key_file_new(); - for(const QString& subDir : subDirs) { - QString indexFile = dirName % '/' % subDir % "/index.theme"; - if(g_key_file_load_from_file(kf, indexFile.toLocal8Bit().constData(), GKeyFileFlags(0), nullptr)) { - // FIXME: skip hidden ones - // icon theme must have this key, so it has icons if it has this key - // otherwise, it might be a cursor theme or any other kind of theme. - if(g_key_file_has_key(kf, "Icon Theme", "Directories", nullptr)) { - char* dispName = g_key_file_get_locale_string(kf, "Icon Theme", "Name", nullptr, nullptr); - // char* comment = g_key_file_get_locale_string(kf, "Icon Theme", "Comment", nullptr, nullptr); - iconThemes[subDir] = dispName; - g_free(dispName); - } - } - } - g_key_file_free(kf); -} - -void PreferencesDialog::initIconThemes(Settings& settings) { - // check if auto-detection is done (for example, from xsettings) - if(settings.useFallbackIconTheme()) { // auto-detection failed - // load xdg icon themes and select the current one - QHash iconThemes; - // user customed icon themes - findIconThemesInDir(iconThemes, QString(g_get_home_dir()) % "/.icons"); - - // search for icons in system data dir - const char* const* dataDirs = g_get_system_data_dirs(); - for(const char* const* dataDir = dataDirs; *dataDir; ++dataDir) { - findIconThemesInDir(iconThemes, QString(*dataDir) % "/icons"); - } - - iconThemes.remove("hicolor"); // remove hicolor, which is only a fallback - QHash::const_iterator it; - for(it = iconThemes.constBegin(); it != iconThemes.constEnd(); ++it) { - ui.iconTheme->addItem(it.value(), it.key()); - } - ui.iconTheme->model()->sort(0); // sort the list of icon theme names - - // select current theme name - int n = ui.iconTheme->count(); - int i; - for(i = 0; i < n; ++i) { - QVariant itemData = ui.iconTheme->itemData(i); - if(itemData == settings.fallbackIconThemeName()) { - break; - } - } - if(i >= n) { - i = 0; - } - ui.iconTheme->setCurrentIndex(i); - } - else { // auto-detection of icon theme works, hide the fallback icon theme combo box. - ui.iconThemeLabel->hide(); - ui.iconTheme->hide(); - } - - ui.hMargin->setValue(settings.folderViewCellMargins().width()); - ui.vMargin->setValue(settings.folderViewCellMargins().height()); - connect(ui.lockMargins, &QAbstractButton::clicked, this, &PreferencesDialog::lockMargins); -} - -void PreferencesDialog::initArchivers(Settings& settings) { - auto& allArchivers = Fm::Archiver::allArchivers(); - for(int i = 0; i < int(allArchivers.size()); ++i) { - auto& archiver = allArchivers[i]; - ui.archiver->addItem(archiver->program(), QString(archiver->program())); - if(archiver->program() == settings.archiver()) { - ui.archiver->setCurrentIndex(i); - } - } -} - -void PreferencesDialog::initDisplayPage(Settings& settings) { - initIconThemes(settings); - // icon sizes - int i = 0; - for (const auto & size : Settings::iconSizes(Settings::Big)) { - ui.bigIconSize->addItem(QString("%1 x %1").arg(size), size); - if(settings.bigIconSize() == size) { - ui.bigIconSize->setCurrentIndex(i); - } - ++i; - } - i = 0; - for (const auto & size : Settings::iconSizes(Settings::Small)) { - QString text = QString("%1 x %1").arg(size); - ui.smallIconSize->addItem(text, size); - if(settings.smallIconSize() == size) { - ui.smallIconSize->setCurrentIndex(i); - } - - ui.sidePaneIconSize->addItem(text, size); - if(settings.sidePaneIconSize() == size) { - ui.sidePaneIconSize->setCurrentIndex(i); - } - ++i; - } - i = 0; - for (const auto & size : Settings::iconSizes(Settings::Thumbnail)) { - ui.thumbnailIconSize->addItem(QString("%1 x %1").arg(size), size); - if(settings.thumbnailIconSize() == size) { - ui.thumbnailIconSize->setCurrentIndex(i); - } - ++i; - } - - ui.siUnit->setChecked(settings.siUnit()); - ui.backupAsHidden->setChecked(settings.backupAsHidden()); - - ui.showFullNames->setChecked(settings.showFullNames()); - ui.shadowHidden->setChecked(settings.shadowHidden()); - - // FIXME: Hide options that we don't support yet. - ui.showFullNames->hide(); - ui.shadowHidden->hide(); -} - -void PreferencesDialog::initUiPage(Settings& settings) { - ui.alwaysShowTabs->setChecked(settings.alwaysShowTabs()); - ui.fullWidthTabbar->setChecked(settings.fullWidthTabBar()); - ui.showTabClose->setChecked(settings.showTabClose()); - ui.rememberWindowSize->setChecked(settings.rememberWindowSize()); - ui.fixedWindowWidth->setValue(settings.fixedWindowWidth()); - ui.fixedWindowHeight->setValue(settings.fixedWindowHeight()); - - // FIXME: Hide options that we don't support yet. - ui.showInPlaces->parentWidget()->hide(); -} - -void PreferencesDialog::initBehaviorPage(Settings& settings) { - ui.singleClick->setChecked(settings.singleClick()); - ui.autoSelectionDelay->setValue(double(settings.autoSelectionDelay()) / 1000); - - ui.bookmarkOpenMethod->setCurrentIndex(settings.bookmarkOpenMethod()); - - ui.viewMode->addItem(tr("Icon View"), (int)Fm::FolderView::IconMode); - ui.viewMode->addItem(tr("Compact View"), (int)Fm::FolderView::CompactMode); - ui.viewMode->addItem(tr("Thumbnail View"), (int)Fm::FolderView::ThumbnailMode); - ui.viewMode->addItem(tr("Detailed List View"), (int)Fm::FolderView::DetailedListMode); - const Fm::FolderView::ViewMode modes[] = { - Fm::FolderView::IconMode, - Fm::FolderView::CompactMode, - Fm::FolderView::ThumbnailMode, - Fm::FolderView::DetailedListMode - }; - for(std::size_t i = 0; i < G_N_ELEMENTS(modes); ++i) { - if(modes[i] == settings.viewMode()) { - ui.viewMode->setCurrentIndex(i); - break; - } - } - - ui.configmDelete->setChecked(settings.confirmDelete()); - - if(settings.supportTrash()) { - ui.useTrash->setChecked(settings.useTrash()); - } - else { - ui.useTrash->hide(); - } - - ui.noUsbTrash->setChecked(settings.noUsbTrash()); - ui.confirmTrash->setChecked(settings.confirmTrash()); - ui.quickExec->setChecked(settings.quickExec()); - ui.selectNewFiles->setChecked(settings.selectNewFiles()); -} - -void PreferencesDialog::initThumbnailPage(Settings& settings) { - ui.showThumbnails->setChecked(settings.showThumbnails()); - ui.thumbnailLocal->setChecked(settings.thumbnailLocalFilesOnly()); - ui.maxThumbnailFileSize->setValue(settings.maxThumbnailFileSize()); -} - -void PreferencesDialog::initVolumePage(Settings& settings) { - ui.mountOnStartup->setChecked(settings.mountOnStartup()); - ui.mountRemovable->setChecked(settings.mountRemovable()); - ui.autoRun->setChecked(settings.autoRun()); - if(settings.closeOnUnmount()) { - ui.closeOnUnmount->setChecked(true); - } - else { - ui.goHomeOnUnmount->setChecked(true); - } -} - -void PreferencesDialog::initTerminals(Settings& settings) { - // load the known terminal list from the terminal.list file of libfm - for(auto& terminal: Fm::allKnownTerminals()) { - ui.terminal->addItem(terminal.get()); - } - ui.terminal->setEditText(settings.terminal()); -} - -void PreferencesDialog::initAdvancedPage(Settings& settings) { - initArchivers(settings); - initTerminals(settings); - ui.suCommand->setText(settings.suCommand()); - - ui.onlyUserTemplates->setChecked(settings.onlyUserTemplates()); - ui.templateTypeOnce->setChecked(settings.templateTypeOnce()); - - ui.templateRunApp->setChecked(settings.templateRunApp()); - - // FIXME: Hide options that we don't support yet. - ui.templateRunApp->hide(); -} - -void PreferencesDialog::initFromSettings() { - Settings& settings = static_cast(qApp)->settings(); - initDisplayPage(settings); - initUiPage(settings); - initBehaviorPage(settings); - initThumbnailPage(settings); - initVolumePage(settings); - initAdvancedPage(settings); -} - -void PreferencesDialog::applyDisplayPage(Settings& settings) { - if(settings.useFallbackIconTheme()) { - // only apply the value if icon theme combo box is in use - // the combo box is hidden when auto-detection of icon theme from xsettings works. - QString newIconTheme = ui.iconTheme->itemData(ui.iconTheme->currentIndex()).toString(); - if(newIconTheme != settings.fallbackIconThemeName()) { - settings.setFallbackIconThemeName(newIconTheme); - QIcon::setThemeName(settings.fallbackIconThemeName()); - // update the UI by emitting a style change event - const auto widgets = QApplication::allWidgets(); - for(QWidget* widget : widgets) { - QEvent event(QEvent::StyleChange); - QApplication::sendEvent(widget, &event); - } - } - } - - settings.setBigIconSize(ui.bigIconSize->itemData(ui.bigIconSize->currentIndex()).toInt()); - settings.setSmallIconSize(ui.smallIconSize->itemData(ui.smallIconSize->currentIndex()).toInt()); - settings.setThumbnailIconSize(ui.thumbnailIconSize->itemData(ui.thumbnailIconSize->currentIndex()).toInt()); - settings.setSidePaneIconSize(ui.sidePaneIconSize->itemData(ui.sidePaneIconSize->currentIndex()).toInt()); - - settings.setSiUnit(ui.siUnit->isChecked()); - settings.setBackupAsHidden(ui.backupAsHidden->isChecked()); - settings.setShowFullNames(ui.showFullNames->isChecked()); - settings.setShadowHidden(ui.shadowHidden->isChecked()); - settings.setFolderViewCellMargins(QSize(ui.hMargin->value(), ui.vMargin->value())); -} - -void PreferencesDialog::applyUiPage(Settings& settings) { - settings.setAlwaysShowTabs(ui.alwaysShowTabs->isChecked()); - settings.setFullWidthTabBar(ui.fullWidthTabbar->isChecked()); - settings.setShowTabClose(ui.showTabClose->isChecked()); - settings.setRememberWindowSize(ui.rememberWindowSize->isChecked()); - settings.setFixedWindowWidth(ui.fixedWindowWidth->value()); - settings.setFixedWindowHeight(ui.fixedWindowHeight->value()); -} - -void PreferencesDialog::applyBehaviorPage(Settings& settings) { - settings.setSingleClick(ui.singleClick->isChecked()); - settings.setAutoSelectionDelay(int(ui.autoSelectionDelay->value() * 1000)); - - settings.setBookmarkOpenMethod(OpenDirTargetType(ui.bookmarkOpenMethod->currentIndex())); - - // FIXME: bug here? - Fm::FolderView::ViewMode mode = Fm::FolderView::ViewMode(ui.viewMode->itemData(ui.viewMode->currentIndex()).toInt()); - settings.setViewMode(mode); - settings.setConfirmDelete(ui.configmDelete->isChecked()); - - if(settings.supportTrash()) { - settings.setUseTrash(ui.useTrash->isChecked()); - } - - settings.setNoUsbTrash(ui.noUsbTrash->isChecked()); - settings.setConfirmTrash(ui.confirmTrash->isChecked()); - settings.setQuickExec(ui.quickExec->isChecked()); - settings.setSelectNewFiles(ui.selectNewFiles->isChecked()); -} - -void PreferencesDialog::applyThumbnailPage(Settings& settings) { - settings.setShowThumbnails(ui.showThumbnails->isChecked()); - settings.setThumbnailLocalFilesOnly(ui.thumbnailLocal->isChecked()); - settings.setMaxThumbnailFileSize(ui.maxThumbnailFileSize->value()); -} - -void PreferencesDialog::applyVolumePage(Settings& settings) { - settings.setAutoRun(ui.autoRun->isChecked()); - settings.setMountOnStartup(ui.mountOnStartup->isChecked()); - settings.setMountRemovable(ui.mountRemovable->isChecked()); - settings.setCloseOnUnmount(ui.closeOnUnmount->isChecked()); -} - -void PreferencesDialog::applyAdvancedPage(Settings& settings) { - settings.setTerminal(ui.terminal->currentText()); - settings.setSuCommand(ui.suCommand->text()); - settings.setArchiver(ui.archiver->itemData(ui.archiver->currentIndex()).toString()); - - settings.setOnlyUserTemplates(ui.onlyUserTemplates->isChecked()); - settings.setTemplateTypeOnce(ui.templateTypeOnce->isChecked()); - settings.setTemplateRunApp(ui.templateRunApp->isChecked()); -} - - -void PreferencesDialog::applySettings() { - Settings& settings = static_cast(qApp)->settings(); - applyDisplayPage(settings); - applyUiPage(settings); - applyBehaviorPage(settings); - applyThumbnailPage(settings); - applyVolumePage(settings); - applyAdvancedPage(settings); - - settings.save(); - - Application* app = static_cast(qApp); - app->updateFromSettings(); -} - -void PreferencesDialog::accept() { - applySettings(); - QDialog::accept(); -} - -void PreferencesDialog::selectPage(QString name) { - if(!name.isEmpty()) { - QWidget* page = findChild(name + "Page"); - if(page) { - int index = ui.stackedWidget->indexOf(page); - ui.listWidget->setCurrentRow(index); - } - } -} - -void PreferencesDialog::lockMargins(bool lock) { - ui.vMargin->setDisabled(lock); - if(lock) { - ui.vMargin->setValue(ui.hMargin->value()); - connect(ui.hMargin, static_cast(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue); - } - else { - disconnect(ui.hMargin, static_cast(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue); - } -} - -} // namespace PCManFM diff --git a/pcmanfm/preferencesdialog.h b/pcmanfm/preferencesdialog.h deleted file mode 100644 index 8661538..0000000 --- a/pcmanfm/preferencesdialog.h +++ /dev/null @@ -1,74 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_PREFERENCESDIALOG_H -#define PCMANFM_PREFERENCESDIALOG_H - -#include -#include "ui_preferences.h" -#include - -namespace PCManFM { - -class Settings; - -class PreferencesDialog : public QDialog { - Q_OBJECT - -public: - // activePage is the name of page to select (general, display, advanced...) - explicit PreferencesDialog(QString activePage = QString(), QWidget* parent = 0); - virtual ~PreferencesDialog(); - - virtual void accept(); - - void selectPage(QString name); - -protected Q_SLOTS: - void lockMargins(bool lock); - -private: - void initIconThemes(Settings& settings); - void initArchivers(Settings& settings); - void initDisplayPage(Settings& settings); - void initUiPage(Settings& settings); - void initBehaviorPage(Settings& settings); - void initThumbnailPage(Settings& settings); - void initVolumePage(Settings& settings); - void initAdvancedPage(Settings& settings); - void initTerminals(Settings& settings); - - void applyUiPage(Settings& settings); - void applyDisplayPage(Settings& settings); - void applyBehaviorPage(Settings& settings); - void applyThumbnailPage(Settings& settings); - void applyVolumePage(Settings& settings); - void applyAdvancedPage(Settings& settings); - - void initFromSettings(); - void applySettings(); - -private: - Ui::PreferencesDialog ui; -}; - -} - -#endif // PCMANFM_PREFERENCESDIALOG_H diff --git a/pcmanfm/settings.cpp b/pcmanfm/settings.cpp deleted file mode 100644 index 154d7d5..0000000 --- a/pcmanfm/settings.cpp +++ /dev/null @@ -1,775 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "settings.h" -#include -#include -#include -#include -#include -#include "desktopwindow.h" -#include -#include -#include - -namespace PCManFM { - -inline static const char* bookmarkOpenMethodToString(OpenDirTargetType value); -inline static OpenDirTargetType bookmarkOpenMethodFromString(const QString str); - -inline static const char* wallpaperModeToString(int value); -inline static int wallpaperModeFromString(const QString str); - -inline static const char* viewModeToString(Fm::FolderView::ViewMode value); -inline static Fm::FolderView::ViewMode viewModeFromString(const QString str); - -inline static const char* sidePaneModeToString(Fm::SidePane::Mode value); -inline static Fm::SidePane::Mode sidePaneModeFromString(const QString& str); - -inline static const char* sortOrderToString(Qt::SortOrder order); -inline static Qt::SortOrder sortOrderFromString(const QString str); - -inline static const char* sortColumnToString(Fm::FolderModel::ColumnId value); -inline static Fm::FolderModel::ColumnId sortColumnFromString(const QString str); - -Settings::Settings(): - QObject(), - supportTrash_(Fm::uriExists("trash:///")), // check if trash:/// is supported - fallbackIconThemeName_(), - useFallbackIconTheme_(QIcon::themeName().isEmpty() || QIcon::themeName() == "hicolor"), - bookmarkOpenMethod_(OpenInCurrentTab), - suCommand_(), - terminal_(), - mountOnStartup_(true), - mountRemovable_(true), - autoRun_(true), - closeOnUnmount_(false), - wallpaperMode_(0), - wallpaper_(), - lastSlide_(), - wallpaperDir_(), - slideShowInterval_(0), - wallpaperRandomize_(false), - desktopBgColor_(), - desktopFgColor_(), - desktopShadowColor_(), - desktopIconSize_(48), - showWmMenu_(false), - desktopShowHidden_(false), - desktopHideItems_(false), - desktopSortOrder_(Qt::AscendingOrder), - desktopSortColumn_(Fm::FolderModel::ColumnFileMTime), - desktopSortFolderFirst_(true), - alwaysShowTabs_(true), - showTabClose_(true), - rememberWindowSize_(true), - fixedWindowWidth_(640), - fixedWindowHeight_(480), - lastWindowWidth_(640), - lastWindowHeight_(480), - lastWindowMaximized_(false), - splitterPos_(120), - sidePaneMode_(Fm::SidePane::ModePlaces), - showMenuBar_(true), - fullWidthTabBar_(true), - viewMode_(Fm::FolderView::IconMode), - showHidden_(false), - sortOrder_(Qt::AscendingOrder), - sortColumn_(Fm::FolderModel::ColumnFileName), - sortFolderFirst_(true), - sortCaseSensitive_(false), - showFilter_(false), - pathBarButtons_(true), - // settings for use with libfm - singleClick_(false), - autoSelectionDelay_(600), - useTrash_(true), - confirmDelete_(true), - noUsbTrash_(false), - confirmTrash_(false), - quickExec_(false), - selectNewFiles_(false), - showThumbnails_(true), - archiver_(), - siUnit_(false), - placesHome_(true), - placesDesktop_(true), - placesApplications_(true), - placesTrash_(true), - placesRoot_(true), - placesComputer_(true), - placesNetwork_(true), - bigIconSize_(48), - smallIconSize_(24), - sidePaneIconSize_(24), - thumbnailIconSize_(128), - folderViewCellMargins_(QSize(3, 3)), - desktopCellMargins_(QSize(3, 1)), - searchNameCaseInsensitive_(false), - searchContentCaseInsensitive_(false), - searchNameRegexp_(true), - searchContentRegexp_(true), - searchRecursive_(false), - searchhHidden_(false) { -} - -Settings::~Settings() { - -} - -QString Settings::xdgUserConfigDir() { - QString dirName; - // WARNING: Don't use XDG_CONFIG_HOME with root because it might - // give the user config directory if gksu-properties is set to su. - if(geteuid() != 0) { // non-root user - dirName = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); - } - if(dirName.isEmpty()) { - dirName = QDir::homePath() % QLatin1String("/.config"); - } - return dirName; -} - -QString Settings::profileDir(QString profile, bool useFallback) { - // try user-specific config file first - QString dirName = xdgUserConfigDir(); - dirName = dirName % "/pcmanfm-qt/" % profile; - QDir dir(dirName); - - // if user config dir does not exist, try system-wide config dirs instead - if(!dir.exists() && useFallback) { - QString fallbackDir; - for(const char* const* configDir = g_get_system_config_dirs(); *configDir; ++configDir) { - fallbackDir = QString(*configDir) % "/pcmanfm-qt/" % profile; - dir.setPath(fallbackDir); - if(dir.exists()) { - dirName = fallbackDir; - break; - } - } - } - return dirName; -} - -bool Settings::load(QString profile) { - profileName_ = profile; - QString fileName = profileDir(profile, true) % "/settings.conf"; - return loadFile(fileName); -} - -bool Settings::save(QString profile) { - QString fileName = profileDir(profile.isEmpty() ? profileName_ : profile) % "/settings.conf"; - return saveFile(fileName); -} - -bool Settings::loadFile(QString filePath) { - QSettings settings(filePath, QSettings::IniFormat); - settings.beginGroup("System"); - fallbackIconThemeName_ = settings.value("FallbackIconThemeName").toString(); - if(fallbackIconThemeName_.isEmpty()) { - // FIXME: we should choose one from installed icon themes or get - // the value from XSETTINGS instead of hard code a fallback value. - fallbackIconThemeName_ = "oxygen"; // fallback icon theme name - } - suCommand_ = settings.value("SuCommand", "lxqt-sudo %s").toString(); - setTerminal(settings.value("Terminal", "xterm").toString()); - setArchiver(settings.value("Archiver", "file-roller").toString()); - setSiUnit(settings.value("SIUnit", false).toBool()); - - setOnlyUserTemplates(settings.value("OnlyUserTemplates", false).toBool()); - setTemplateTypeOnce(settings.value("TemplateTypeOnce", false).toBool()); - setTemplateRunApp(settings.value("TemplateRunApp", false).toBool()); - - settings.endGroup(); - - settings.beginGroup("Behavior"); - bookmarkOpenMethod_ = bookmarkOpenMethodFromString(settings.value("BookmarkOpenMethod").toString()); - // settings for use with libfm - useTrash_ = settings.value("UseTrash", true).toBool(); - singleClick_ = settings.value("SingleClick", false).toBool(); - autoSelectionDelay_ = settings.value("AutoSelectionDelay", 600).toInt(); - confirmDelete_ = settings.value("ConfirmDelete", true).toBool(); - setNoUsbTrash(settings.value("NoUsbTrash", false).toBool()); - confirmTrash_ = settings.value("ConfirmTrash", false).toBool(); - setQuickExec(settings.value("QuickExec", false).toBool()); - selectNewFiles_ = settings.value("SelectNewFiles", false).toBool(); - // bool thumbnailLocal_; - // bool thumbnailMax; - settings.endGroup(); - - settings.beginGroup("Desktop"); - wallpaperMode_ = wallpaperModeFromString(settings.value("WallpaperMode").toString()); - wallpaper_ = settings.value("Wallpaper").toString(); - lastSlide_ = settings.value("LastSlide").toString(); - wallpaperDir_ = settings.value("WallpaperDirectory").toString(); - slideShowInterval_ = settings.value("SlideShowInterval", 0).toInt(); - wallpaperRandomize_ = settings.value("WallpaperRandomize").toBool(); - desktopBgColor_.setNamedColor(settings.value("BgColor", "#000000").toString()); - desktopFgColor_.setNamedColor(settings.value("FgColor", "#ffffff").toString()); - desktopShadowColor_.setNamedColor(settings.value("ShadowColor", "#000000").toString()); - if(settings.contains("Font")) { - desktopFont_.fromString(settings.value("Font").toString()); - } - else { - desktopFont_ = QApplication::font(); - } - desktopIconSize_ = settings.value("DesktopIconSize", 48).toInt(); - showWmMenu_ = settings.value("ShowWmMenu", false).toBool(); - desktopShowHidden_ = settings.value("ShowHidden", false).toBool(); - desktopHideItems_ = settings.value("HideItems", false).toBool(); - - desktopSortOrder_ = sortOrderFromString(settings.value("SortOrder").toString()); - desktopSortColumn_ = sortColumnFromString(settings.value("SortColumn").toString()); - desktopSortFolderFirst_ = settings.value("SortFolderFirst", true).toBool(); - - desktopCellMargins_ = (settings.value("DesktopCellMargins", QSize(3, 1)).toSize() - .expandedTo(QSize(0, 0))).boundedTo(QSize(48, 48)); - settings.endGroup(); - - settings.beginGroup("Volume"); - mountOnStartup_ = settings.value("MountOnStartup", true).toBool(); - mountRemovable_ = settings.value("MountRemovable", true).toBool(); - autoRun_ = settings.value("AutoRun", true).toBool(); - closeOnUnmount_ = settings.value("CloseOnUnmount", true).toBool(); - settings.endGroup(); - - settings.beginGroup("Thumbnail"); - showThumbnails_ = settings.value("ShowThumbnails", true).toBool(); - setMaxThumbnailFileSize(settings.value("MaxThumbnailFileSize", 4096).toInt()); - setThumbnailLocalFilesOnly(settings.value("ThumbnailLocalFilesOnly", true).toBool()); - settings.endGroup(); - - settings.beginGroup("FolderView"); - viewMode_ = viewModeFromString(settings.value("Mode", Fm::FolderView::IconMode).toString()); - showHidden_ = settings.value("ShowHidden", false).toBool(); - sortOrder_ = sortOrderFromString(settings.value("SortOrder").toString()); - sortColumn_ = sortColumnFromString(settings.value("SortColumn").toString()); - sortFolderFirst_ = settings.value("SortFolderFirst", true).toBool(); - sortCaseSensitive_ = settings.value("SortCaseSensitive", false).toBool(); - showFilter_ = settings.value("ShowFilter", false).toBool(); - - setBackupAsHidden(settings.value("BackupAsHidden", false).toBool()); - showFullNames_ = settings.value("ShowFullNames", false).toBool(); - shadowHidden_ = settings.value("ShadowHidden", false).toBool(); - - // override config in libfm's FmConfig - bigIconSize_ = toIconSize(settings.value("BigIconSize", 48).toInt(), Big); - smallIconSize_ = toIconSize(settings.value("SmallIconSize", 24).toInt(), Small); - sidePaneIconSize_ = toIconSize(settings.value("SidePaneIconSize", 24).toInt(), Small); - thumbnailIconSize_ = toIconSize(settings.value("ThumbnailIconSize", 128).toInt(), Thumbnail); - - folderViewCellMargins_ = (settings.value("FolderViewCellMargins", QSize(3, 3)).toSize() - .expandedTo(QSize(0, 0))).boundedTo(QSize(48, 48)); - settings.endGroup(); - - settings.beginGroup("Places"); - placesHome_ = settings.value("PlacesHome", true).toBool(); - placesDesktop_ = settings.value("PlacesDesktop", true).toBool(); - placesApplications_ = settings.value("PlacesApplications", true).toBool(); - placesTrash_ = settings.value("PlacesTrash", true).toBool(); - placesRoot_ = settings.value("PlacesRoot", true).toBool(); - placesComputer_ = settings.value("PlacesComputer", true).toBool(); - placesNetwork_ = settings.value("PlacesNetwork", true).toBool(); - hiddenPlaces_ = settings.value("HiddenPlaces").toStringList().toSet(); - settings.endGroup(); - - settings.beginGroup("Window"); - fixedWindowWidth_ = settings.value("FixedWidth", 640).toInt(); - fixedWindowHeight_ = settings.value("FixedHeight", 480).toInt(); - lastWindowWidth_ = settings.value("LastWindowWidth", 640).toInt(); - lastWindowHeight_ = settings.value("LastWindowHeight", 480).toInt(); - lastWindowMaximized_ = settings.value("LastWindowMaximized", false).toBool(); - rememberWindowSize_ = settings.value("RememberWindowSize", true).toBool(); - alwaysShowTabs_ = settings.value("AlwaysShowTabs", true).toBool(); - showTabClose_ = settings.value("ShowTabClose", true).toBool(); - splitterPos_ = settings.value("SplitterPos", 150).toInt(); - sidePaneMode_ = sidePaneModeFromString(settings.value("SidePaneMode").toString()); - showMenuBar_ = settings.value("ShowMenuBar", true).toBool(); - fullWidthTabBar_ = settings.value("FullWidthTabBar", true).toBool(); - pathBarButtons_ = settings.value("PathBarButtons", true).toBool(); - settings.endGroup(); - - settings.beginGroup("Search"); - searchNameCaseInsensitive_ = settings.value("searchNameCaseInsensitive", false).toBool(); - searchContentCaseInsensitive_ = settings.value("searchContentCaseInsensitive", false).toBool(); - searchNameRegexp_ = settings.value("searchNameRegexp", true).toBool(); - searchContentRegexp_ = settings.value("searchContentRegexp", true).toBool(); - searchRecursive_ = settings.value("searchRecursive", false).toBool(); - searchhHidden_ = settings.value("searchhHidden", false).toBool(); - settings.endGroup(); - - return true; -} - -bool Settings::saveFile(QString filePath) { - QSettings settings(filePath, QSettings::IniFormat); - - settings.beginGroup("System"); - settings.setValue("FallbackIconThemeName", fallbackIconThemeName_); - settings.setValue("SuCommand", suCommand_); - settings.setValue("Terminal", terminal_); - settings.setValue("Archiver", archiver_); - settings.setValue("SIUnit", siUnit_); - - settings.setValue("OnlyUserTemplates", onlyUserTemplates_); - settings.setValue("TemplateTypeOnce", templateTypeOnce_); - settings.setValue("TemplateRunApp", templateRunApp_); - - settings.endGroup(); - - settings.beginGroup("Behavior"); - settings.setValue("BookmarkOpenMethod", bookmarkOpenMethodToString(bookmarkOpenMethod_)); - // settings for use with libfm - settings.setValue("UseTrash", useTrash_); - settings.setValue("SingleClick", singleClick_); - settings.setValue("AutoSelectionDelay", autoSelectionDelay_); - settings.setValue("ConfirmDelete", confirmDelete_); - settings.setValue("NoUsbTrash", noUsbTrash_); - settings.setValue("ConfirmTrash", confirmTrash_); - settings.setValue("QuickExec", quickExec_); - settings.setValue("SelectNewFiles", selectNewFiles_); - // bool thumbnailLocal_; - // bool thumbnailMax; - settings.endGroup(); - - settings.beginGroup("Desktop"); - settings.setValue("WallpaperMode", wallpaperModeToString(wallpaperMode_)); - settings.setValue("Wallpaper", wallpaper_); - settings.setValue("LastSlide", lastSlide_); - settings.setValue("WallpaperDirectory", wallpaperDir_); - settings.setValue("SlideShowInterval", slideShowInterval_); - settings.setValue("WallpaperRandomize", wallpaperRandomize_); - settings.setValue("BgColor", desktopBgColor_.name()); - settings.setValue("FgColor", desktopFgColor_.name()); - settings.setValue("ShadowColor", desktopShadowColor_.name()); - settings.setValue("Font", desktopFont_.toString()); - settings.setValue("DesktopIconSize", desktopIconSize_); - settings.setValue("ShowWmMenu", showWmMenu_); - settings.setValue("ShowHidden", desktopShowHidden_); - settings.setValue("HideItems", desktopHideItems_); - settings.setValue("SortOrder", sortOrderToString(desktopSortOrder_)); - settings.setValue("SortColumn", sortColumnToString(desktopSortColumn_)); - settings.setValue("SortFolderFirst", desktopSortFolderFirst_); - settings.setValue("DesktopCellMargins", desktopCellMargins_); - settings.endGroup(); - - settings.beginGroup("Volume"); - settings.setValue("MountOnStartup", mountOnStartup_); - settings.setValue("MountRemovable", mountRemovable_); - settings.setValue("AutoRun", autoRun_); - settings.setValue("CloseOnUnmount", closeOnUnmount_); - settings.endGroup(); - - settings.beginGroup("Thumbnail"); - settings.setValue("ShowThumbnails", showThumbnails_); - settings.setValue("MaxThumbnailFileSize", maxThumbnailFileSize()); - settings.setValue("ThumbnailLocalFilesOnly", thumbnailLocalFilesOnly()); - settings.endGroup(); - - settings.beginGroup("FolderView"); - settings.setValue("Mode", viewModeToString(viewMode_)); - settings.setValue("ShowHidden", showHidden_); - settings.setValue("SortOrder", sortOrderToString(sortOrder_)); - settings.setValue("SortColumn", sortColumnToString(sortColumn_)); - settings.setValue("SortFolderFirst", sortFolderFirst_); - settings.setValue("SortCaseSensitive", sortCaseSensitive_); - settings.setValue("ShowFilter", showFilter_); - - settings.setValue("BackupAsHidden", backupAsHidden_); - settings.setValue("ShowFullNames", showFullNames_); - settings.setValue("ShadowHidden", shadowHidden_); - - // override config in libfm's FmConfig - settings.setValue("BigIconSize", bigIconSize_); - settings.setValue("SmallIconSize", smallIconSize_); - settings.setValue("SidePaneIconSize", sidePaneIconSize_); - settings.setValue("ThumbnailIconSize", thumbnailIconSize_); - - settings.setValue("FolderViewCellMargins", folderViewCellMargins_); - settings.endGroup(); - - settings.beginGroup("Places"); - settings.setValue("PlacesHome", placesHome_); - settings.setValue("PlacesDesktop", placesDesktop_); - settings.setValue("PlacesApplications", placesApplications_); - settings.setValue("PlacesTrash", placesTrash_); - settings.setValue("PlacesRoot", placesRoot_); - settings.setValue("PlacesComputer", placesComputer_); - settings.setValue("PlacesNetwork", placesNetwork_); - if (hiddenPlaces_.isEmpty()) { // don't save "@Invalid()" - settings.remove("HiddenPlaces"); - } - else { - QStringList hiddenPlaces = hiddenPlaces_.toList(); - settings.setValue("HiddenPlaces", hiddenPlaces); - } - settings.endGroup(); - - settings.beginGroup("Window"); - settings.setValue("FixedWidth", fixedWindowWidth_); - settings.setValue("FixedHeight", fixedWindowHeight_); - settings.setValue("LastWindowWidth", lastWindowWidth_); - settings.setValue("LastWindowHeight", lastWindowHeight_); - settings.setValue("LastWindowMaximized", lastWindowMaximized_); - settings.setValue("RememberWindowSize", rememberWindowSize_); - settings.setValue("AlwaysShowTabs", alwaysShowTabs_); - settings.setValue("ShowTabClose", showTabClose_); - settings.setValue("SplitterPos", splitterPos_); - settings.setValue("SidePaneMode", sidePaneModeToString(sidePaneMode_)); - settings.setValue("ShowMenuBar", showMenuBar_); - settings.setValue("FullWidthTabBar", fullWidthTabBar_); - settings.setValue("PathBarButtons", pathBarButtons_); - settings.endGroup(); - - // save per-folder settings - Fm::FolderConfig::saveCache(); - - settings.beginGroup("Search"); - settings.setValue("searchNameCaseInsensitive", searchNameCaseInsensitive_); - settings.setValue("searchContentCaseInsensitive", searchContentCaseInsensitive_); - settings.setValue("searchNameRegexp", searchNameRegexp_); - settings.setValue("searchContentRegexp", searchContentRegexp_); - settings.setValue("searchRecursive", searchRecursive_); - settings.setValue("searchhHidden", searchhHidden_); - settings.endGroup(); - - return true; -} - -const QList & Settings::iconSizes(IconType type) { - static const QList sizes_big = {96, 72, 64, 48, 32}; - static const QList sizes_thumbnail = {256, 224, 192, 160, 128, 96, 64}; - static const QList sizes_small = {48, 32, 24, 22, 16}; - switch(type) { - case Big: - return sizes_big; - break; - case Thumbnail: - return sizes_thumbnail; - break; - case Small: - default: - return sizes_small; - break; - } -} - -int Settings::toIconSize(int size, IconType type) const { - const QList & sizes = iconSizes(type); - for (const auto & s : sizes) { - if(size >= s) { - return s; - } - } - return sizes.back(); -} - -static const char* bookmarkOpenMethodToString(OpenDirTargetType value) { - switch(value) { - case OpenInCurrentTab: - default: - return "current_tab"; - case OpenInNewTab: - return "new_tab"; - case OpenInNewWindow: - return "new_window"; - case OpenInLastActiveWindow: - return "last_window"; - } - return ""; -} - -static OpenDirTargetType bookmarkOpenMethodFromString(const QString str) { - - if(str == QStringLiteral("new_tab")) { - return OpenInNewTab; - } - else if(str == QStringLiteral("new_window")) { - return OpenInNewWindow; - } - else if(str == QStringLiteral("last_window")) { - return OpenInLastActiveWindow; - } - return OpenInCurrentTab; -} - -static const char* viewModeToString(Fm::FolderView::ViewMode value) { - const char* ret; - switch(value) { - case Fm::FolderView::IconMode: - default: - ret = "icon"; - break; - case Fm::FolderView::CompactMode: - ret = "compact"; - break; - case Fm::FolderView::DetailedListMode: - ret = "detailed"; - break; - case Fm::FolderView::ThumbnailMode: - ret = "thumbnail"; - break; - } - return ret; -} - -Fm::FolderView::ViewMode viewModeFromString(const QString str) { - Fm::FolderView::ViewMode ret; - if(str == "icon") { - ret = Fm::FolderView::IconMode; - } - else if(str == "compact") { - ret = Fm::FolderView::CompactMode; - } - else if(str == "detailed") { - ret = Fm::FolderView::DetailedListMode; - } - else if(str == "thumbnail") { - ret = Fm::FolderView::ThumbnailMode; - } - else { - ret = Fm::FolderView::IconMode; - } - return ret; -} - -static const char* sortOrderToString(Qt::SortOrder order) { - return (order == Qt::DescendingOrder ? "descending" : "ascending"); -} - -static Qt::SortOrder sortOrderFromString(const QString str) { - return (str == "descending" ? Qt::DescendingOrder : Qt::AscendingOrder); -} - -static const char* sortColumnToString(Fm::FolderModel::ColumnId value) { - const char* ret; - switch(value) { - case Fm::FolderModel::ColumnFileName: - default: - ret = "name"; - break; - case Fm::FolderModel::ColumnFileType: - ret = "type"; - break; - case Fm::FolderModel::ColumnFileSize: - ret = "size"; - break; - case Fm::FolderModel::ColumnFileMTime: - ret = "mtime"; - break; - case Fm::FolderModel::ColumnFileOwner: - ret = "owner"; - break; - } - return ret; -} - -static Fm::FolderModel::ColumnId sortColumnFromString(const QString str) { - Fm::FolderModel::ColumnId ret; - if(str == "name") { - ret = Fm::FolderModel::ColumnFileName; - } - else if(str == "type") { - ret = Fm::FolderModel::ColumnFileType; - } - else if(str == "size") { - ret = Fm::FolderModel::ColumnFileSize; - } - else if(str == "mtime") { - ret = Fm::FolderModel::ColumnFileMTime; - } - else if(str == "owner") { - ret = Fm::FolderModel::ColumnFileOwner; - } - else { - ret = Fm::FolderModel::ColumnFileName; - } - return ret; -} - -static const char* wallpaperModeToString(int value) { - const char* ret; - switch(value) { - case DesktopWindow::WallpaperNone: - default: - ret = "none"; - break; - case DesktopWindow::WallpaperStretch: - ret = "stretch"; - break; - case DesktopWindow::WallpaperFit: - ret = "fit"; - break; - case DesktopWindow::WallpaperCenter: - ret = "center"; - break; - case DesktopWindow::WallpaperTile: - ret = "tile"; - break; - case DesktopWindow::WallpaperZoom: - ret = "zoom"; - break; - } - return ret; -} - -static int wallpaperModeFromString(const QString str) { - int ret; - if(str == "stretch") { - ret = DesktopWindow::WallpaperStretch; - } - else if(str == "fit") { - ret = DesktopWindow::WallpaperFit; - } - else if(str == "center") { - ret = DesktopWindow::WallpaperCenter; - } - else if(str == "tile") { - ret = DesktopWindow::WallpaperTile; - } - else if(str == "zoom") { - ret = DesktopWindow::WallpaperZoom; - } - else { - ret = DesktopWindow::WallpaperNone; - } - return ret; -} - -static const char* sidePaneModeToString(Fm::SidePane::Mode value) { - const char* ret; - switch(value) { - case Fm::SidePane::ModePlaces: - default: - ret = "places"; - break; - case Fm::SidePane::ModeDirTree: - ret = "dirtree"; - break; - case Fm::SidePane::ModeNone: - ret = "none"; - break; - } - return ret; -} - -static Fm::SidePane::Mode sidePaneModeFromString(const QString& str) { - Fm::SidePane::Mode ret; - if(str == "none") { - ret = Fm::SidePane::ModeNone; - } - else if(str == "dirtree") { - ret = Fm::SidePane::ModeDirTree; - } - else { - ret = Fm::SidePane::ModePlaces; - } - return ret; -} - -void Settings::setTerminal(QString terminalCommand) { - terminal_ = terminalCommand; - // override the settings in libfm FmConfig. - g_free(fm_config->terminal); - fm_config->terminal = g_strdup(terminal_.toLocal8Bit().constData()); - g_signal_emit_by_name(fm_config, "changed::terminal"); -} - - -// per-folder settings -FolderSettings Settings::loadFolderSettings(const Fm::FilePath& path) const { - FolderSettings settings; - Fm::FolderConfig cfg(path); - // set defaults - settings.setSortOrder(sortOrder()); - settings.setSortColumn(sortColumn()); - settings.setViewMode(viewMode()); - settings.setShowHidden(showHidden()); - settings.setSortFolderFirst(sortFolderFirst()); - settings.setSortCaseSensitive(sortCaseSensitive()); - // columns? - if(!cfg.isEmpty()) { - // load folder-specific settings - settings.setCustomized(true); - - char* str; - // load sorting - str = cfg.getString("SortOrder"); - if(str != nullptr) { - settings.setSortOrder(sortOrderFromString(str)); - g_free(str); - } - - str = cfg.getString("SortColumn"); - if(str != nullptr) { - settings.setSortColumn(sortColumnFromString(str)); - g_free(str); - } - - str = cfg.getString("ViewMode"); - if(str != nullptr) { - // set view mode - settings.setViewMode(viewModeFromString(str)); - g_free(str); - } - - gboolean show_hidden; - if(cfg.getBoolean("ShowHidden", &show_hidden)) { - settings.setShowHidden(show_hidden); - } - - gboolean folder_first; - if(cfg.getBoolean("SortFolderFirst", &folder_first)) { - settings.setSortFolderFirst(folder_first); - } - - gboolean case_sensitive; - if(cfg.getBoolean("SortCaseSensitive", &case_sensitive)) { - settings.setSortCaseSensitive(case_sensitive); - } - } - return settings; -} - -void Settings::saveFolderSettings(const Fm::FilePath& path, const FolderSettings& settings) { - if(path) { - // ensure that we have the libfm dir - QString dirName = xdgUserConfigDir() % QStringLiteral("/libfm"); - QDir().mkpath(dirName); // if libfm config dir does not exist, create it - - Fm::FolderConfig cfg(path); - cfg.setString("SortOrder", sortOrderToString(settings.sortOrder())); - cfg.setString("SortColumn", sortColumnToString(settings.sortColumn())); - cfg.setString("ViewMode", viewModeToString(settings.viewMode())); - cfg.setBoolean("ShowHidden", settings.showHidden()); - cfg.setBoolean("SortFolderFirst", settings.sortFolderFirst()); - cfg.setBoolean("SortCaseSensitive", settings.sortCaseSensitive()); - } -} - -void Settings::clearFolderSettings(const Fm::FilePath& path) const { - if(path) { - Fm::FolderConfig cfg(path); - cfg.purge(); - } -} - - -} // namespace PCManFM diff --git a/pcmanfm/settings.h b/pcmanfm/settings.h deleted file mode 100644 index 45b49f7..0000000 --- a/pcmanfm/settings.h +++ /dev/null @@ -1,982 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_SETTINGS_H -#define PCMANFM_SETTINGS_H - -#include -#include -#include -#include -#include "desktopwindow.h" -#include -#include -#include - -namespace PCManFM { - -enum OpenDirTargetType { - OpenInCurrentTab, - OpenInNewTab, - OpenInNewWindow, - OpenInLastActiveWindow -}; - -class FolderSettings { -public: - FolderSettings(): - isCustomized_(false), - sortOrder_(Qt::AscendingOrder), - sortColumn_(Fm::FolderModel::ColumnFileName), - viewMode_(Fm::FolderView::IconMode), - showHidden_(false), - sortFolderFirst_(true), - sortCaseSensitive_(true) { - } - - bool isCustomized() const { - return isCustomized_; - } - - void setCustomized(bool value) { - isCustomized_ = value; - } - - Qt::SortOrder sortOrder() const { - return sortOrder_; - } - - void setSortOrder(Qt::SortOrder value) { - sortOrder_ = value; - } - - Fm::FolderModel::ColumnId sortColumn() const { - return sortColumn_; - } - - void setSortColumn(Fm::FolderModel::ColumnId value) { - sortColumn_ = value; - } - - Fm::FolderView::ViewMode viewMode() const { - return viewMode_; - } - - void setViewMode(Fm::FolderView::ViewMode value) { - viewMode_ = value; - } - - bool sortFolderFirst() const { - return sortFolderFirst_; - } - - void setSortFolderFirst(bool value) { - sortFolderFirst_ = value; - } - - bool showHidden() const { - return showHidden_; - } - - void setShowHidden(bool value) { - showHidden_ = value; - } - - bool sortCaseSensitive() const { - return sortCaseSensitive_; - } - - void setSortCaseSensitive(bool value) { - sortCaseSensitive_ = value; - } - -private: - bool isCustomized_; - Qt::SortOrder sortOrder_; - Fm::FolderModel::ColumnId sortColumn_; - Fm::FolderView::ViewMode viewMode_; - bool showHidden_; - bool sortFolderFirst_; - bool sortCaseSensitive_; - // columns? -}; - - -class Settings : public QObject { - Q_OBJECT -public: - enum IconType { - Small, - Big, - Thumbnail - }; - - Settings(); - virtual ~Settings(); - - bool load(QString profile = "default"); - bool save(QString profile = QString()); - - bool loadFile(QString filePath); - bool saveFile(QString filePath); - - static QString xdgUserConfigDir(); - static const QList & iconSizes(IconType type); - - QString profileDir(QString profile, bool useFallback = false); - - // setter/getter functions - QString profileName() const { - return profileName_; - } - - bool supportTrash() const { - return supportTrash_; - } - - QString fallbackIconThemeName() const { - return fallbackIconThemeName_; - } - - bool useFallbackIconTheme() const { - return useFallbackIconTheme_; - } - - void setFallbackIconThemeName(QString iconThemeName) { - fallbackIconThemeName_ = iconThemeName; - } - - OpenDirTargetType bookmarkOpenMethod() { - return bookmarkOpenMethod_; - } - - void setBookmarkOpenMethod(OpenDirTargetType bookmarkOpenMethod) { - bookmarkOpenMethod_ = bookmarkOpenMethod; - } - - QString suCommand() const { - return suCommand_; - } - - void setSuCommand(QString suCommand) { - suCommand_ = suCommand; - } - - QString terminal() { - return terminal_; - } - void setTerminal(QString terminalCommand); - - QString archiver() const { - return archiver_; - } - - void setArchiver(QString archiver) { - archiver_ = archiver; - Fm::Archiver::setDefaultArchiverByName(archiver_.toLocal8Bit().constData()); - } - - bool mountOnStartup() const { - return mountOnStartup_; - } - - void setMountOnStartup(bool mountOnStartup) { - mountOnStartup_ = mountOnStartup; - } - - bool mountRemovable() { - return mountRemovable_; - } - - void setMountRemovable(bool mountRemovable) { - mountRemovable_ = mountRemovable; - } - - bool autoRun() const { - return autoRun_; - } - - void setAutoRun(bool autoRun) { - autoRun_ = autoRun; - } - - bool closeOnUnmount() const { - return closeOnUnmount_; - } - - void setCloseOnUnmount(bool value) { - closeOnUnmount_ = value; - } - - DesktopWindow::WallpaperMode wallpaperMode() const { - return DesktopWindow::WallpaperMode(wallpaperMode_); - } - - void setWallpaperMode(int wallpaperMode) { - wallpaperMode_ = wallpaperMode; - } - - QString wallpaper() const { - return wallpaper_; - } - - void setWallpaper(QString wallpaper) { - wallpaper_ = wallpaper; - } - - QString wallpaperDir() const { - return wallpaperDir_; - } - - void setLastSlide(QString wallpaper) { - lastSlide_ = wallpaper; - } - - QString lastSlide() const { - return lastSlide_; - } - - void setWallpaperDir(QString dir) { - wallpaperDir_ = dir; - } - - int slideShowInterval() const { - return slideShowInterval_; - } - - void setSlideShowInterval(int interval) { - slideShowInterval_ = interval; - } - - bool wallpaperRandomize() const { - return wallpaperRandomize_; - } - - void setWallpaperRandomize(bool randomize) { - wallpaperRandomize_ = randomize; - } - - const QColor& desktopBgColor() const { - return desktopBgColor_; - } - - void setDesktopBgColor(QColor desktopBgColor) { - desktopBgColor_ = desktopBgColor; - } - - const QColor& desktopFgColor() const { - return desktopFgColor_; - } - - void setDesktopFgColor(QColor desktopFgColor) { - desktopFgColor_ = desktopFgColor; - } - - const QColor& desktopShadowColor() const { - return desktopShadowColor_; - } - - void setDesktopShadowColor(QColor desktopShadowColor) { - desktopShadowColor_ = desktopShadowColor; - } - - QFont desktopFont() const { - return desktopFont_; - } - - void setDesktopFont(QFont font) { - desktopFont_ = font; - } - - int desktopIconSize() const { - return desktopIconSize_; - } - - void setDesktopIconSize(int desktopIconSize) { - desktopIconSize_ = desktopIconSize; - } - - bool showWmMenu() const { - return showWmMenu_; - } - - void setShowWmMenu(bool value) { - showWmMenu_ = value; - } - - bool desktopShowHidden() const { - return desktopShowHidden_; - } - - void setDesktopShowHidden(bool desktopShowHidden) { - desktopShowHidden_ = desktopShowHidden; - } - - bool desktopHideItems() const { - return desktopHideItems_; - } - - void setDesktopHideItems(bool hide) { - desktopHideItems_ = hide; - } - - Qt::SortOrder desktopSortOrder() const { - return desktopSortOrder_; - } - - void setDesktopSortOrder(Qt::SortOrder desktopSortOrder) { - desktopSortOrder_ = desktopSortOrder; - } - - Fm::FolderModel::ColumnId desktopSortColumn() const { - return desktopSortColumn_; - } - - void setDesktopSortColumn(Fm::FolderModel::ColumnId desktopSortColumn) { - desktopSortColumn_ = desktopSortColumn; - } - - bool desktopSortFolderFirst() const { - return desktopSortFolderFirst_; - } - - void setDesktopSortFolderFirst(bool desktopFolderFirst) { - desktopSortFolderFirst_ = desktopFolderFirst; - } - - bool alwaysShowTabs() const { - return alwaysShowTabs_; - } - - void setAlwaysShowTabs(bool alwaysShowTabs) { - alwaysShowTabs_ = alwaysShowTabs; - } - - bool showTabClose() const { - return showTabClose_; - } - - void setShowTabClose(bool showTabClose) { - showTabClose_ = showTabClose; - } - - bool rememberWindowSize() const { - return rememberWindowSize_; - } - - void setRememberWindowSize(bool rememberWindowSize) { - rememberWindowSize_ = rememberWindowSize; - } - - int windowWidth() const { - if(rememberWindowSize_) { - return lastWindowWidth_; - } - else { - return fixedWindowWidth_; - } - } - - int windowHeight() const { - if(rememberWindowSize_) { - return lastWindowHeight_; - } - else { - return fixedWindowHeight_; - } - } - - bool windowMaximized() const { - if(rememberWindowSize_) { - return lastWindowMaximized_; - } - else { - return false; - } - } - - int fixedWindowWidth() const { - return fixedWindowWidth_; - } - - void setFixedWindowWidth(int fixedWindowWidth) { - fixedWindowWidth_ = fixedWindowWidth; - } - - int fixedWindowHeight() const { - return fixedWindowHeight_; - } - - void setFixedWindowHeight(int fixedWindowHeight) { - fixedWindowHeight_ = fixedWindowHeight; - } - - void setLastWindowWidth(int lastWindowWidth) { - lastWindowWidth_ = lastWindowWidth; - } - - void setLastWindowHeight(int lastWindowHeight) { - lastWindowHeight_ = lastWindowHeight; - } - - void setLastWindowMaximized(bool lastWindowMaximized) { - lastWindowMaximized_ = lastWindowMaximized; - } - - int splitterPos() const { - return splitterPos_; - } - - void setSplitterPos(int splitterPos) { - splitterPos_ = splitterPos; - } - - Fm::SidePane::Mode sidePaneMode() const { - return sidePaneMode_; - } - - void setSidePaneMode(Fm::SidePane::Mode sidePaneMode) { - sidePaneMode_ = sidePaneMode; - } - - bool showMenuBar() const { - return showMenuBar_; - } - - void setShowMenuBar(bool showMenuBar) { - showMenuBar_ = showMenuBar; - } - - bool fullWidthTabBar() const { - return fullWidthTabBar_; - } - - void setFullWidthTabBar(bool fullWith) { - fullWidthTabBar_ = fullWith; - } - - Fm::FolderView::ViewMode viewMode() const { - return viewMode_; - } - - void setViewMode(Fm::FolderView::ViewMode viewMode) { - viewMode_ = viewMode; - } - - bool showHidden() const { - return showHidden_; - } - - void setShowHidden(bool showHidden) { - showHidden_ = showHidden; - } - - bool sortCaseSensitive() const { - return sortCaseSensitive_; - } - - void setSortCaseSensitive(bool value) { - sortCaseSensitive_ = value; - } - - - bool placesHome() const { - return placesHome_; - } - - void setPlacesHome(bool placesHome) { - placesHome_ = placesHome; - } - - bool placesDesktop() const { - return placesDesktop_; - } - - void setPlacesDesktop(bool placesDesktop) { - placesDesktop_ = placesDesktop; - } - - bool placesApplications() const { - return placesApplications_; - } - - void setPlacesApplications(bool placesApplications) { - placesApplications_ = placesApplications; - } - - bool placesTrash() const { - return placesTrash_; - } - - void setPlacesTrash(bool placesTrash) { - placesTrash_ = placesTrash; - } - - bool placesRoot() const { - return placesRoot_; - } - - void setPlacesRoot(bool placesRoot) { - placesRoot_ = placesRoot; - } - - bool placesComputer() const { - return placesComputer_; - } - - void setPlacesComputer(bool placesComputer) { - placesComputer_ = placesComputer; - } - - bool placesNetwork() const { - return placesNetwork_; - } - - void setPlacesNetwork(bool placesNetwork) { - placesNetwork_ = placesNetwork; - } - - QSet getHiddenPlaces() const { - return hiddenPlaces_; - } - - void setHiddenPlace(const QString& str, bool hide) { - if(hide) { - hiddenPlaces_ << str; - } - else { - hiddenPlaces_.remove(str); - } - } - - - Qt::SortOrder sortOrder() const { - return sortOrder_; - } - - void setSortOrder(Qt::SortOrder sortOrder) { - sortOrder_ = sortOrder; - } - - Fm::FolderModel::ColumnId sortColumn() const { - return sortColumn_; - } - - void setSortColumn(Fm::FolderModel::ColumnId sortColumn) { - sortColumn_ = sortColumn; - } - - bool sortFolderFirst() const { - return sortFolderFirst_; - } - - void setSortFolderFirst(bool folderFirst) { - sortFolderFirst_ = folderFirst; - } - - bool showFilter() const { - return showFilter_; - } - - void setShowFilter(bool value) { - showFilter_ = value; - } - - bool pathBarButtons() const { - return pathBarButtons_; - } - - void setPathBarButtons(bool value) { - pathBarButtons_ = value; - } - - // settings for use with libfm - bool singleClick() const { - return singleClick_; - } - - void setSingleClick(bool singleClick) { - singleClick_ = singleClick; - } - - int autoSelectionDelay() const { - return autoSelectionDelay_; - } - - void setAutoSelectionDelay(int value) { - autoSelectionDelay_ = value; - } - - bool useTrash() const { - if(!supportTrash_) { - return false; - } - return useTrash_; - } - - void setUseTrash(bool useTrash) { - useTrash_ = useTrash; - } - - bool confirmDelete() const { - return confirmDelete_; - } - - void setConfirmDelete(bool confirmDelete) { - confirmDelete_ = confirmDelete; - } - - bool noUsbTrash() const { - return noUsbTrash_; - } - - void setNoUsbTrash(bool noUsbTrash) { - noUsbTrash_ = noUsbTrash; - fm_config->no_usb_trash = noUsbTrash_; // also set this to libfm since FmFileOpsJob reads this config value before trashing files. - } - - bool confirmTrash() const { - return confirmTrash_; - } - - void setConfirmTrash(bool value) { - confirmTrash_ = value; - } - - bool quickExec() const { - return quickExec_; - } - - void setQuickExec(bool value) { - quickExec_ = value; - fm_config->quick_exec = quickExec_; - } - - bool selectNewFiles() const { - return selectNewFiles_; - } - - void setSelectNewFiles(bool value) { - selectNewFiles_ = value; - } - - // bool thumbnailLocal_; - // bool thumbnailMax; - - int bigIconSize() const { - return bigIconSize_; - } - - void setBigIconSize(int bigIconSize) { - bigIconSize_ = bigIconSize; - } - - int smallIconSize() const { - return smallIconSize_; - } - - void setSmallIconSize(int smallIconSize) { - smallIconSize_ = smallIconSize; - } - - int sidePaneIconSize() const { - return sidePaneIconSize_; - } - - void setSidePaneIconSize(int sidePaneIconSize) { - sidePaneIconSize_ = sidePaneIconSize; - } - - int thumbnailIconSize() const { - return thumbnailIconSize_; - } - - QSize folderViewCellMargins() const { - return folderViewCellMargins_; - } - - void setFolderViewCellMargins(QSize size) { - folderViewCellMargins_ = size; - } - - QSize desktopCellMargins() const { - return desktopCellMargins_; - } - - void setDesktopCellMargins(QSize size) { - desktopCellMargins_ = size; - } - - - bool showThumbnails() { - return showThumbnails_; - } - - void setShowThumbnails(bool show) { - showThumbnails_ = show; - } - - void setThumbnailLocalFilesOnly(bool value) { - Fm::ThumbnailJob::setLocalFilesOnly(value); - } - - bool thumbnailLocalFilesOnly() const { - return Fm::ThumbnailJob::localFilesOnly(); - } - - int maxThumbnailFileSize() const { - return Fm::ThumbnailJob::maxThumbnailFileSize(); - } - - void setMaxThumbnailFileSize(int size) { - Fm::ThumbnailJob::setMaxThumbnailFileSize(size); - } - - void setThumbnailIconSize(int thumbnailIconSize) { - thumbnailIconSize_ = thumbnailIconSize; - } - - bool siUnit() { - return siUnit_; - } - - void setSiUnit(bool siUnit) { - siUnit_ = siUnit; - // override libfm FmConfig settings. FIXME: should we do this? - fm_config->si_unit = (gboolean)siUnit_; - } - - bool backupAsHidden() const { - return backupAsHidden_; - } - - void setBackupAsHidden(bool value) { - backupAsHidden_ = value; - fm_config->backup_as_hidden = backupAsHidden_; // also set this to libfm since fm_file_info_is_hidden() reads this value internally. - } - - bool showFullNames() const { - return showFullNames_; - } - - void setShowFullNames(bool value) { - showFullNames_ = value; - } - - bool shadowHidden() const { - return shadowHidden_; - } - - void setShadowHidden(bool value) { - shadowHidden_ = value; - } - - bool onlyUserTemplates() const { - return onlyUserTemplates_; - } - - void setOnlyUserTemplates(bool value) { - onlyUserTemplates_ = value; - fm_config->only_user_templates = onlyUserTemplates_; - } - - bool templateTypeOnce() const { - return templateTypeOnce_; - } - - void setTemplateTypeOnce(bool value) { - templateTypeOnce_ = value; - fm_config->template_type_once = templateTypeOnce_; - } - - bool templateRunApp() const { - return templateRunApp_; - } - - void setTemplateRunApp(bool value) { - templateRunApp_ = value; - fm_config->template_run_app = templateRunApp_; - } - - // per-folder settings - FolderSettings loadFolderSettings(const Fm::FilePath& path) const; - - void saveFolderSettings(const Fm::FilePath& path, const FolderSettings& settings); - - void clearFolderSettings(const Fm::FilePath& path) const; - - bool searchNameCaseInsensitive() const { - return searchNameCaseInsensitive_; - } - - void setSearchNameCaseInsensitive(bool caseInsensitive) { - searchNameCaseInsensitive_ = caseInsensitive; - } - - bool searchContentCaseInsensitive() const { - return searchContentCaseInsensitive_; - } - - void setsearchContentCaseInsensitive(bool caseInsensitive) { - searchContentCaseInsensitive_ = caseInsensitive; - } - - bool searchNameRegexp() const { - return searchNameRegexp_; - } - - void setSearchNameRegexp(bool reg) { - searchNameRegexp_ = reg; - } - - bool searchContentRegexp() const { - return searchContentRegexp_; - } - - void setSearchContentRegexp(bool reg) { - searchContentRegexp_ = reg; - } - - bool searchRecursive() const { - return searchRecursive_; - } - - void setSearchRecursive(bool rec) { - searchRecursive_ = rec; - } - - bool searchhHidden() const { - return searchhHidden_; - } - - void setSearchhHidden(bool hidden) { - searchhHidden_ = hidden; - } - -private: - int toIconSize(int size, IconType type) const; - - QString profileName_; - bool supportTrash_; - - // PCManFM specific - QString fallbackIconThemeName_; - bool useFallbackIconTheme_; - - OpenDirTargetType bookmarkOpenMethod_; - QString suCommand_; - QString terminal_; - bool mountOnStartup_; - bool mountRemovable_; - bool autoRun_; - bool closeOnUnmount_; - - int wallpaperMode_; - QString wallpaper_; - QString lastSlide_; - QString wallpaperDir_; - int slideShowInterval_; - bool wallpaperRandomize_; - QColor desktopBgColor_; - QColor desktopFgColor_; - QColor desktopShadowColor_; - QFont desktopFont_; - int desktopIconSize_; - bool showWmMenu_; - - bool desktopShowHidden_; - bool desktopHideItems_; - Qt::SortOrder desktopSortOrder_; - Fm::FolderModel::ColumnId desktopSortColumn_; - bool desktopSortFolderFirst_; - - bool alwaysShowTabs_; - bool showTabClose_; - bool rememberWindowSize_; - int fixedWindowWidth_; - int fixedWindowHeight_; - int lastWindowWidth_; - int lastWindowHeight_; - bool lastWindowMaximized_; - int splitterPos_; - Fm::SidePane::Mode sidePaneMode_; - bool showMenuBar_; - bool fullWidthTabBar_; - - Fm::FolderView::ViewMode viewMode_; - bool showHidden_; - Qt::SortOrder sortOrder_; - Fm::FolderModel::ColumnId sortColumn_; - bool sortFolderFirst_; - bool sortCaseSensitive_; - bool showFilter_; - bool pathBarButtons_; - - // settings for use with libfm - bool singleClick_; - int autoSelectionDelay_; - bool useTrash_; - bool confirmDelete_; - bool noUsbTrash_; // do not trash files on usb removable devices - bool confirmTrash_; // Confirm before moving files into "trash can" - bool quickExec_; // Don't ask options on launch executable file - bool selectNewFiles_; - - bool showThumbnails_; - - QString archiver_; - bool siUnit_; - bool backupAsHidden_; - bool showFullNames_; - bool shadowHidden_; - - bool placesHome_; - bool placesDesktop_; - bool placesApplications_; - bool placesTrash_; - bool placesRoot_; - bool placesComputer_; - bool placesNetwork_; - QSet hiddenPlaces_; - - int bigIconSize_; - int smallIconSize_; - int sidePaneIconSize_; - int thumbnailIconSize_; - - bool onlyUserTemplates_; - bool templateTypeOnce_; - bool templateRunApp_; - - QSize folderViewCellMargins_; - QSize desktopCellMargins_; - - // search settings - bool searchNameCaseInsensitive_; - bool searchContentCaseInsensitive_; - bool searchNameRegexp_; - bool searchContentRegexp_; - bool searchRecursive_; - bool searchhHidden_; -}; - -} - -#endif // PCMANFM_SETTINGS_H diff --git a/pcmanfm/statusbar.cpp b/pcmanfm/statusbar.cpp deleted file mode 100644 index e5dfdb4..0000000 --- a/pcmanfm/statusbar.cpp +++ /dev/null @@ -1,96 +0,0 @@ -/* - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#include "statusbar.h" -#include -#include - -#define MESSAGE_DELAY 250 - -namespace PCManFM { - -Label::Label(QWidget* parent, Qt::WindowFlags f): - QLabel(parent, f), - lastWidth_(0) { - setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - // set a min width to prevent the window from widening with long texts - setMinimumWidth(fontMetrics().averageCharWidth() * 10); -} - -// A simplified version of QLabel::paintEvent() -// without pixmap or shortcut but with eliding. -void Label::paintEvent(QPaintEvent* /*event*/) { - QRect cr = contentsRect().adjusted(margin(), margin(), -margin(), -margin()); - QString txt = text(); - // if the text is changed or its rect is resized (due to window resizing), - // find whether it needs to be elided... - if (txt != lastText_ || cr.width() != lastWidth_) { - lastText_ = txt; - lastWidth_ = cr.width(); - elidedText_ = fontMetrics().elidedText(txt, Qt::ElideMiddle, cr.width()); - } - // ... then, draw the (elided) text - if(!elidedText_.isEmpty()) { - QPainter painter(this); - QStyleOption opt; - opt.initFrom(this); - style()->drawItemText(&painter, cr, alignment(), opt.palette, isEnabled(), elidedText_, foregroundRole()); - } -} - -StatusBar::StatusBar(QWidget *parent): - QStatusBar(parent), - lastTimeOut_(0) { - statusLabel_ = new Label(); - statusLabel_->setFrameShape(QFrame::NoFrame); - // 4px space on both sides (not to be mixed with the permanent widget) - statusLabel_->setContentsMargins(4, 0, 4, 0); - addWidget(statusLabel_); - - messageTimer_ = new QTimer (this); - messageTimer_->setSingleShot(true); - messageTimer_->setInterval(MESSAGE_DELAY); - connect(messageTimer_, &QTimer::timeout, this, &StatusBar::reallyShowMessage); -} - -StatusBar::~StatusBar() { - if(messageTimer_) { - messageTimer_->stop(); - delete messageTimer_; - } -} - -void StatusBar::showMessage(const QString &message, int timeout) { - // don't show the message immediately - lastMessage_ = message; - lastTimeOut_ = timeout; - if(!messageTimer_->isActive()) { - messageTimer_->start(); - } -} - -void StatusBar::reallyShowMessage() { - if(lastTimeOut_ == 0) { - // set the text on the label to prevent its disappearance on focusing menubar items - // and also ensure that it contsains no newline (because file names may contain it) - statusLabel_->setText(lastMessage_.replace(QLatin1Char('\n'), QLatin1Char(' '))); - } - else { - QStatusBar::showMessage(lastMessage_, lastTimeOut_); - } -} - -} diff --git a/pcmanfm/statusbar.h b/pcmanfm/statusbar.h deleted file mode 100644 index acc14f5..0000000 --- a/pcmanfm/statusbar.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - -#ifndef FM_STATUSBAR_H -#define FM_STATUSBAR_H - -#include -#include -#include - -namespace PCManFM { - -class Label : public QLabel { -Q_OBJECT - -public: - explicit Label(QWidget *parent = 0, Qt::WindowFlags f = Qt::WindowFlags()); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QString elidedText_; - QString lastText_; - int lastWidth_; -}; - -class StatusBar : public QStatusBar { -Q_OBJECT - -public: - explicit StatusBar(QWidget *parent = 0); - ~StatusBar(); - -public Q_SLOTS: - void showMessage(const QString &message, int timeout = 0); - -protected Q_SLOTS: - void reallyShowMessage(); - -private: - Label* statusLabel_; // for a stable (elided) text - QTimer* messageTimer_; - QString lastMessage_; - int lastTimeOut_; -}; - -} - -#endif // FM_STATUSBAR_H diff --git a/pcmanfm/tabbar.cpp b/pcmanfm/tabbar.cpp deleted file mode 100644 index 859e4a0..0000000 --- a/pcmanfm/tabbar.cpp +++ /dev/null @@ -1,110 +0,0 @@ -/* - - Copyright (C) 2014 Kuzma Shapran - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "tabbar.h" -#include -#include -#include -#include -#include - -namespace PCManFM { - -TabBar::TabBar(QWidget *parent): - QTabBar(parent), - dragStarted_(false) -{ -} - -void TabBar::mousePressEvent(QMouseEvent *event) { - QTabBar::mousePressEvent (event); - if(event->button() == Qt::LeftButton - && tabAt(event->pos()) > -1) { - dragStartPosition_ = event->pos(); - } - dragStarted_ = false; -} - -void TabBar::mouseMoveEvent(QMouseEvent *event) -{ - if(!dragStartPosition_.isNull() - && (event->pos() - dragStartPosition_).manhattanLength() < QApplication::startDragDistance()) { - dragStarted_ = true; - } - - if((event->buttons() & Qt::LeftButton) - && dragStarted_ - && !window()->geometry().contains(event->globalPos())) { - if(currentIndex() == -1) { - return; - } - - QPointer drag = new QDrag(this); - QMimeData *mimeData = new QMimeData; - mimeData->setData("application/pcmanfm-qt-tab", QByteArray()); - drag->setMimeData(mimeData); - Qt::DropAction dragged = drag->exec(); - if(dragged == Qt::IgnoreAction) { // a tab is dropped outside all windows - if(count() > 1) { - Q_EMIT tabDetached(); - } - else { - finishMouseMoveEvent(); - } - event->accept(); - } - else if(dragged == Qt::MoveAction) { // a tab is dropped into another window - event->accept(); - } - drag->deleteLater(); - } - else { - QTabBar::mouseMoveEvent(event); - } -} - -void TabBar::finishMouseMoveEvent() { - QMouseEvent finishingEvent(QEvent::MouseMove, QPoint(), Qt::NoButton, Qt::NoButton, Qt::NoModifier); - mouseMoveEvent(&finishingEvent); -} - -void TabBar::releaseMouse() { - QMouseEvent releasingEvent(QEvent::MouseButtonRelease, QPoint(), Qt::LeftButton, Qt::NoButton, Qt::NoModifier); - mouseReleaseEvent(&releasingEvent); -} - -void TabBar::mouseReleaseEvent(QMouseEvent *event) { - if (event->button() == Qt::MiddleButton) { - int index = tabAt(event->pos()); - if (index != -1) { - Q_EMIT tabCloseRequested(index); - } - } - QTabBar::mouseReleaseEvent(event); -} - -// Let the main window receive dragged tabs! -void TabBar::dragEnterEvent(QDragEnterEvent *event) { - if(event->mimeData()->hasFormat("application/pcmanfm-qt-tab")) { - event->ignore(); - } -} - -} diff --git a/pcmanfm/tabbar.h b/pcmanfm/tabbar.h deleted file mode 100644 index c5573cb..0000000 --- a/pcmanfm/tabbar.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - - Copyright (C) 2014 Kuzma Shapran - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef FM_TABBAR_H -#define FM_TABBAR_H - -#include - -class QMouseEvent; - -namespace PCManFM { - -class TabBar : public QTabBar { -Q_OBJECT - -public: - explicit TabBar(QWidget *parent = 0); - void finishMouseMoveEvent(); - void releaseMouse(); - -Q_SIGNALS: - void tabDetached(); - -protected: - void mouseReleaseEvent(QMouseEvent *event); - // from qtabbar.cpp - virtual void mousePressEvent(QMouseEvent *event); - virtual void mouseMoveEvent(QMouseEvent *event); - virtual void dragEnterEvent(QDragEnterEvent *event); - -private: - QPoint dragStartPosition_; - bool dragStarted_; -}; - -} - -#endif // FM_TABBAR_H diff --git a/pcmanfm/tabpage.cpp b/pcmanfm/tabpage.cpp deleted file mode 100644 index a96d682..0000000 --- a/pcmanfm/tabpage.cpp +++ /dev/null @@ -1,692 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "tabpage.h" -#include "launcher.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "settings.h" -#include "application.h" -#include -#include -#include - -using namespace Fm; - -namespace PCManFM { - -bool ProxyFilter::filterAcceptsRow(const Fm::ProxyFolderModel* model, const std::shared_ptr& info) const { - if(!model || !info) { - return true; - } - QString baseName = QString::fromStdString(info->name()); - if(!filterStr_.isEmpty() && !baseName.contains(filterStr_, Qt::CaseInsensitive)) { - return false; - } - return true; -} - -TabPage::TabPage(QWidget* parent): - QWidget(parent), - folderView_{nullptr}, - folderModel_{nullptr}, - proxyModel_{nullptr}, - proxyFilter_{nullptr}, - verticalLayout{nullptr}, - overrideCursor_(false), - selectionTimer_(nullptr) { - - Settings& settings = static_cast(qApp)->settings(); - - // create proxy folder model to do item filtering - proxyModel_ = new ProxyFolderModel(); - proxyModel_->setShowHidden(settings.showHidden()); - proxyModel_->setBackupAsHidden(settings.backupAsHidden()); - proxyModel_->setShowThumbnails(settings.showThumbnails()); - connect(proxyModel_, &ProxyFolderModel::sortFilterChanged, this, &TabPage::sortFilterChanged); - - verticalLayout = new QVBoxLayout(this); - verticalLayout->setContentsMargins(0, 0, 0, 0); - - folderView_ = new View(settings.viewMode(), this); - folderView_->setMargins(settings.folderViewCellMargins()); - // newView->setColumnWidth(Fm::FolderModel::ColumnName, 200); - connect(folderView_, &View::openDirRequested, this, &TabPage::openDirRequested); - connect(folderView_, &View::selChanged, this, &TabPage::onSelChanged); - connect(folderView_, &View::clickedBack, this, &TabPage::backwardRequested); - connect(folderView_, &View::clickedForward, this, &TabPage::forwardRequested); - - proxyFilter_ = new ProxyFilter(); - proxyModel_->addFilter(proxyFilter_); - - // FIXME: this is very dirty - folderView_->setModel(proxyModel_); - verticalLayout->addWidget(folderView_); -} - -TabPage::~TabPage() { - freeFolder(); - if(proxyFilter_) { - delete proxyFilter_; - } - if(proxyModel_) { - delete proxyModel_; - } - if(folderModel_) { - disconnect(folderModel_, &Fm::FolderModel::fileSizeChanged, this, &TabPage::onFileSizeChanged); - disconnect(folderModel_, &Fm::FolderModel::filesAdded, this, &TabPage::onFilesAdded); - folderModel_->unref(); - } - - if(overrideCursor_) { - QApplication::restoreOverrideCursor(); // remove busy cursor - } -} - -void TabPage::freeFolder() { - if(folder_) { - if(folderSettings_.isCustomized()) { - // save custom view settings for this folder - static_cast(qApp)->settings().saveFolderSettings(folder_->path(), folderSettings_); - } - disconnect(folder_.get(), nullptr, this, nullptr); // disconnect from all signals - folder_ = nullptr; - } -} - -void TabPage::onFolderStartLoading() { - if(folderModel_){ - disconnect(folderModel_, &Fm::FolderModel::filesAdded, this, &TabPage::onFilesAdded); - } - if(!overrideCursor_) { - // FIXME: sometimes FmFolder of libfm generates unpaired "start-loading" and - // "finish-loading" signals of uncertain reasons. This should be a bug in libfm. - // Until it's fixed in libfm, we need to workaround the problem here, not to - // override the cursor twice. - QApplication::setOverrideCursor(QCursor(Qt::WaitCursor)); - overrideCursor_ = true; - } -#if 0 -#if FM_CHECK_VERSION(1, 0, 2) && 0 // disabled - if(fm_folder_is_incremental(_folder)) { - /* create a model for the folder and set it to the view - it is delayed for non-incremental folders since adding rows into - model is much faster without handlers connected to its signals */ - FmFolderModel* model = fm_folder_model_new(folder, FALSE); - fm_folder_view_set_model(fv, model); - fm_folder_model_set_sort(model, app_config->sort_by, - (app_config->sort_type == GTK_SORT_ASCENDING) ? - FM_SORT_ASCENDING : FM_SORT_DESCENDING); - g_object_unref(model); - } - else -#endif - fm_folder_view_set_model(fv, nullptr); -#endif -} - -void TabPage::onUiUpdated() { - // scroll to recorded position - folderView_->childView()->verticalScrollBar()->setValue(browseHistory().currentScrollPos()); - - // if the current folder is the parent folder of the last browsed folder, - // select the folder item in current view. - if(lastFolderPath_ && lastFolderPath_.parent() == path()) { - QModelIndex index = folderView_->indexFromFolderPath(lastFolderPath_); - if(index.isValid()) { - folderView_->childView()->scrollTo(index, QAbstractItemView::EnsureVisible); - folderView_->childView()->setCurrentIndex(index); - } - } - if(folderModel_) { - // update selection statusbar info when needed - connect(folderModel_, &Fm::FolderModel::fileSizeChanged, this, &TabPage::onFileSizeChanged); - // get ready to select files that may be added later - connect(folderModel_, &Fm::FolderModel::filesAdded, this, &TabPage::onFilesAdded); - } -} - -void TabPage::onFileSizeChanged(const QModelIndex& index) { - if(folderView_->hasSelection()) { - QModelIndexList indexes = folderView_->selectionModel()->selectedIndexes(); - if(indexes.contains(proxyModel_->mapFromSource(index))) { - onSelChanged(); - } - } -} - -// slot -void TabPage::onFilesAdded(Fm::FileInfoList files) { - if(static_cast(qApp)->settings().selectNewFiles()) { - if(!selectionTimer_) { - folderView_->selectFiles(files, false); - selectionTimer_ = new QTimer (this); - selectionTimer_->setSingleShot(true); - selectionTimer_->start(200); - } - else { - folderView_->selectFiles(files, selectionTimer_->isActive()); - selectionTimer_->start(200); - } - } -} - -void TabPage::onFolderFinishLoading() { - auto fi = folder_->info(); - if(fi) { // if loading of the folder fails, it's possible that we don't have FmFileInfo. - setWindowTitle(fi->displayName()); - Q_EMIT titleChanged(fi->displayName()); - } - - folder_->queryFilesystemInfo(); // FIXME: is this needed? -#if 0 - FmFolderView* fv = folder_view; - const FmNavHistoryItem* item; - GtkScrolledWindow* scroll = GTK_SCROLLED_WINDOW(fv); - - /* Note: most of the time, we delay the creation of the - * folder model and do it after the whole folder is loaded. - * That is because adding rows into model is much faster when no handlers - * are connected to its signals. So we detach the model from folder view - * and create the model again when it's fully loaded. - * This optimization, however, is not used for FmFolder objects - * with incremental loading (search://) */ - if(fm_folder_view_get_model(fv) == nullptr) { - /* create a model for the folder and set it to the view */ - FmFolderModel* model = fm_folder_model_new(folder, app_config->show_hidden); - fm_folder_view_set_model(fv, model); -#if FM_CHECK_VERSION(1, 0, 2) - /* since 1.0.2 sorting should be applied on model instead of view */ - fm_folder_model_set_sort(model, app_config->sort_by, - (app_config->sort_type == GTK_SORT_ASCENDING) ? - FM_SORT_ASCENDING : FM_SORT_DESCENDING); -#endif - g_object_unref(model); - } - -#endif - - // update status text - QString& text = statusText_[StatusTextNormal]; - text = formatStatusText(); - Q_EMIT statusChanged(StatusTextNormal, text); - - if(overrideCursor_) { - QApplication::restoreOverrideCursor(); // remove busy cursor - overrideCursor_ = false; - } - - // After finishing loading the folder, the model is updated, but Qt delays the UI update - // for performance reasons. Therefore at this point the UI is not up to date. - // For example, the scrollbar ranges are not updated yet. We solve this by installing an Qt timeout handler. - QTimer::singleShot(10, this, SLOT(onUiUpdated())); -} - -void TabPage::onFolderError(const Fm::GErrorPtr& err, Fm::Job::ErrorSeverity severity, Fm::Job::ErrorAction& response) { - if(err.domain() == G_IO_ERROR) { - if(err.code() == G_IO_ERROR_NOT_MOUNTED && severity < Fm::Job::ErrorSeverity::CRITICAL) { - auto& path = folder_->path(); - MountOperation* op = new MountOperation(true); - op->mountEnclosingVolume(path); - if(op->wait()) { // blocking event loop, wait for mount operation to finish. - // This will reload the folder, which generates a new "start-loading" - // signal, so we get more "start-loading" signals than "finish-loading" - // signals. FIXME: This is a bug of libfm. - // Because the two signals are not correctly paired, we need to - // remove busy cursor here since "finish-loading" is not emitted. - QApplication::restoreOverrideCursor(); // remove busy cursor - overrideCursor_ = false; - response = Fm::Job::ErrorAction::RETRY; - return; - } - } - } - if(severity >= Fm::Job::ErrorSeverity::MODERATE) { - /* Only show more severe errors to the users and - * ignore milder errors. Otherwise too many error - * message boxes can be annoying. - * This fixes bug #3411298- Show "Permission denied" when switching to super user mode. - * https://sourceforge.net/tracker/?func=detail&aid=3411298&group_id=156956&atid=801864 - * */ - - // FIXME: consider replacing this modal dialog with an info bar to improve usability - QMessageBox::critical(this, tr("Error"), err.message()); - } - response = Fm::Job::ErrorAction::CONTINUE; -} - -void TabPage::onFolderFsInfo() { - guint64 free, total; - QString& msg = statusText_[StatusTextFSInfo]; - if(folder_->getFilesystemInfo(&total, &free)) { - char total_str[64]; - char free_str[64]; - fm_file_size_to_str(free_str, sizeof(free_str), free, fm_config->si_unit); - fm_file_size_to_str(total_str, sizeof(total_str), total, fm_config->si_unit); - msg = tr("Free space: %1 (Total: %2)") - .arg(QString::fromUtf8(free_str), - QString::fromUtf8(total_str)); - } - else { - msg.clear(); - } - Q_EMIT statusChanged(StatusTextFSInfo, msg); -} - -QString TabPage::formatStatusText() { - if(proxyModel_ && folder_) { - // FIXME: this is very inefficient - auto files = folder_->files(); - int total_files = files.size(); - int shown_files = proxyModel_->rowCount(); - int hidden_files = total_files - shown_files; - QString text = tr("%n item(s)", "", shown_files); - if(hidden_files > 0) { - text += tr(" (%n hidden)", "", hidden_files); - } - auto fi = folder_->info(); - if (fi && fi->isSymlink()) { - text += QString(" %2(%1)") - .arg(encloseWithBidiMarks(tr("Link to") + QChar(QChar::Space) + QString::fromStdString(fi->target())), - (layoutDirection() == Qt::RightToLeft) ? QChar(0x200f) : QChar(0x200e)); - } - return text; - } - return QString(); -} - -void TabPage::onFolderRemoved() { - // the folder we're showing is removed, destroy the widget - qDebug("folder removed"); - Settings& settings = static_cast(qApp)->settings(); - // NOTE: call deleteLater() directly from this GObject signal handler - // does not work but I don't know why. - // Maybe it's the problem of glib mainloop integration? - // Call it when idle works, though. - if(settings.closeOnUnmount()) { - QTimer::singleShot(0, this, SLOT(deleteLater())); - } - else { - chdir(Fm::FilePath::homeDir()); - } -} - -void TabPage::onFolderUnmount() { - // the folder we're showing is unmounted, destroy the widget - qDebug("folder unmount"); - // NOTE: call deleteLater() directly from this GObject signal handler - // does not work but I don't know why. - // Maybe it's the problem of glib mainloop integration? - // Call it when idle works, though. - Settings& settings = static_cast(qApp)->settings(); - // NOTE: call deleteLater() directly from this GObject signal handler - // does not work but I don't know why. - // Maybe it's the problem of glib mainloop integration? - // Call it when idle works, though. - if(settings.closeOnUnmount()) { - QTimer::singleShot(0, this, SLOT(deleteLater())); - } - else { - chdir(Fm::FilePath::homeDir()); - } -} - -void TabPage::onFolderContentChanged() { - /* update status text */ - statusText_[StatusTextNormal] = formatStatusText(); - Q_EMIT statusChanged(StatusTextNormal, statusText_[StatusTextNormal]); -} - -QString TabPage::pathName() { - // auto disp_path = path().displayName(); - // FIXME: displayName() returns invalid path sometimes. - auto disp_path = path().toString(); - return QString::fromUtf8(disp_path.get()); -} - -void TabPage::chdir(Fm::FilePath newPath, bool addHistory) { - // qDebug() << "TABPAGE CHDIR:" << newPath.toString().get(); - if(folder_) { - // we're already in the specified dir - if(newPath == folder_->path()) { - return; - } - - // reset the status selected text - statusText_[StatusTextSelectedFiles] = QString(); - - // remember the previous folder path that we have browsed. - lastFolderPath_ = folder_->path(); - - if(addHistory) { - // store current scroll pos in the browse history - BrowseHistoryItem& item = history_.currentItem(); - QAbstractItemView* childView = folderView_->childView(); - item.setScrollPos(childView->verticalScrollBar()->value()); - } - - // free the previous model - if(folderModel_) { - disconnect(folderModel_, &Fm::FolderModel::fileSizeChanged, this, &TabPage::onFileSizeChanged); - disconnect(folderModel_, &Fm::FolderModel::filesAdded, this, &TabPage::onFilesAdded); - proxyModel_->setSourceModel(nullptr); - folderModel_->unref(); // unref the cached model - folderModel_ = nullptr; - } - - freeFolder(); - } - - Q_EMIT titleChanged(newPath.baseName().get()); // FIXME: display name - - folder_ = Fm::Folder::fromPath(newPath); - if(addHistory) { - // add current path to browse history - history_.add(path()); - } - connect(folder_.get(), &Fm::Folder::startLoading, this, &TabPage::onFolderStartLoading); - connect(folder_.get(), &Fm::Folder::finishLoading, this, &TabPage::onFolderFinishLoading); - - // FIXME: Fm::Folder::error() is a bad design and might be removed in the future. - connect(folder_.get(), &Fm::Folder::error, this, &TabPage::onFolderError); - connect(folder_.get(), &Fm::Folder::fileSystemChanged, this, &TabPage::onFolderFsInfo); - /* destroy the page when the folder is unmounted or deleted. */ - connect(folder_.get(), &Fm::Folder::removed, this, &TabPage::onFolderRemoved); - connect(folder_.get(), &Fm::Folder::unmount, this, &TabPage::onFolderUnmount); - connect(folder_.get(), &Fm::Folder::contentChanged, this, &TabPage::onFolderContentChanged); - - folderModel_ = CachedFolderModel::modelFromFolder(folder_); - - // set sorting, considering customized folders - Settings& settings = static_cast(qApp)->settings(); - folderSettings_ = settings.loadFolderSettings(path()); - proxyModel_->sort(folderSettings_.sortColumn(), folderSettings_.sortOrder()); - proxyModel_->setFolderFirst(folderSettings_.sortFolderFirst()); - proxyModel_->setShowHidden(folderSettings_.showHidden()); - proxyModel_->setSortCaseSensitivity(folderSettings_.sortCaseSensitive() ? Qt::CaseSensitive : Qt::CaseInsensitive); - proxyModel_->setSourceModel(folderModel_); - - folderView_->setViewMode(folderSettings_.viewMode()); - - if(folder_->isLoaded()) { - onFolderStartLoading(); - onFolderFinishLoading(); - onFolderFsInfo(); - } - else { - onFolderStartLoading(); - } -} - -void TabPage::selectAll() { - folderView_->selectAll(); -} - -void TabPage::invertSelection() { - folderView_->invertSelection(); -} - -void TabPage::reload() { - if(folder_) { - // don't select or scroll to the previous folder after reload - lastFolderPath_ = Fm::FilePath(); - // but remember the current scroll position - BrowseHistoryItem& item = history_.currentItem(); - QAbstractItemView* childView = folderView_->childView(); - item.setScrollPos(childView->verticalScrollBar()->value()); - - folder_->reload(); - } -} - -// 200e LEFT-TO-RIGHT MARK -// 200f RIGHT-TO-LEFT MARK -// 202a LEFT-TO-RIGHT EMBEDDING -// 202b RIGHT-TO-LEFT EMBEDDING -// 202c POP DIRECTIONAL FORMATTING -QString TabPage::encloseWithBidiMarks(const QString& text) { - QChar bidiMark = text.isRightToLeft() ? QChar(0x200f) : QChar(0x200e); - QChar embedBidiMark = text.isRightToLeft() ? QChar(0x202b) : QChar(0x202a); - return embedBidiMark+text+bidiMark+QChar(0x202c); -} - -// when the current selection in the folder view is changed -void TabPage::onSelChanged() { - QString msg; - if(folderView_->hasSelection()) { - auto files = folderView_->selectedFiles(); - int numSel = files.size(); - /* FIXME: display total size of all selected files. */ - if(numSel == 1) { /* only one file is selected (also, tell if it is a symlink)*/ - auto& fi = files.front(); - if(!fi->isDir()) { - if(fi->isSymlink()) { - msg = QString("%5\"%1\" %5(%2) %5%3 %5(%4)") - .arg(encloseWithBidiMarks(fi->displayName()), - encloseWithBidiMarks(Fm::formatFileSize(fi->size(), fm_config->si_unit)), - encloseWithBidiMarks(fi->mimeType()->desc()), - encloseWithBidiMarks(tr("Link to") + QChar(QChar::Space) + QString::fromStdString(fi->target())), - (layoutDirection() == Qt::RightToLeft) ? QChar(0x200f) : QChar(0x200e)); - } - else { - msg = QString("%4\"%1\" %4(%2) %4%3") - .arg(encloseWithBidiMarks(fi->displayName()), - encloseWithBidiMarks(Fm::formatFileSize(fi->size(), fm_config->si_unit)), // FIXME: deprecate fm_config - encloseWithBidiMarks(fi->mimeType()->desc()), - (layoutDirection() == Qt::RightToLeft) ? QChar(0x200f) : QChar(0x200e)); - } - } - else { - if(fi->isSymlink()) { - msg = QString("%4\"%1\" %4%2 %4(%3)") - .arg(encloseWithBidiMarks(fi->displayName()), - encloseWithBidiMarks(fi->mimeType()->desc()), - encloseWithBidiMarks(tr("Link to") + QChar(QChar::Space) + QString::fromStdString(fi->target())), - (layoutDirection() == Qt::RightToLeft) ? QChar(0x200f) : QChar(0x200e)); - } - else { - msg = QString("%3\"%1\" %3%2") - .arg(encloseWithBidiMarks(fi->displayName()), - encloseWithBidiMarks(fi->mimeType()->desc()), - (layoutDirection() == Qt::RightToLeft) ? QChar(0x200f) : QChar(0x200e)); - } - } - /* FIXME: should we support statusbar plugins as in the gtk+ version? */ - } - else { - goffset sum; - msg = tr("%n item(s) selected", nullptr, numSel); - /* don't count if too many files are selected, that isn't lightweight */ - if(numSel < 1000) { - sum = 0; - for(auto& fi: files) { - if(fi->isDir()) { - /* if we got a directory then we cannot tell it's size - unless we do deep count but we cannot afford it */ - sum = -1; - break; - } - sum += fi->size(); - } - if(sum >= 0) { - msg += QString(" (%1)").arg(Fm::formatFileSize(sum, fm_config->si_unit)); // FIXME: deprecate fm_config - } - /* FIXME: should we support statusbar plugins as in the gtk+ version? */ - } - /* FIXME: can we show some more info on selection? - that isn't lightweight if a lot of files are selected */ - } - } - statusText_[StatusTextSelectedFiles] = msg; - Q_EMIT statusChanged(StatusTextSelectedFiles, msg); -} - - -void TabPage::backward() { - // remember current scroll position - BrowseHistoryItem& item = history_.currentItem(); - QAbstractItemView* childView = folderView_->childView(); - item.setScrollPos(childView->verticalScrollBar()->value()); - - history_.backward(); - chdir(history_.currentPath(), false); -} - -void TabPage::forward() { - // remember current scroll position - BrowseHistoryItem& item = history_.currentItem(); - QAbstractItemView* childView = folderView_->childView(); - item.setScrollPos(childView->verticalScrollBar()->value()); - - history_.forward(); - chdir(history_.currentPath(), false); -} - -void TabPage::jumpToHistory(int index) { - if(index >= 0 && static_cast(index) < history_.size()) { - // remember current scroll position - BrowseHistoryItem& item = history_.currentItem(); - QAbstractItemView* childView = folderView_->childView(); - item.setScrollPos(childView->verticalScrollBar()->value()); - - history_.setCurrentIndex(index); - chdir(history_.currentPath(), false); - } -} - -bool TabPage::canUp() { - auto _path = path(); - return (_path && _path.hasParent()); -} - -void TabPage::up() { - auto _path = path(); - if(_path) { - auto parent = _path.parent(); - if(parent) { - chdir(parent, true); - } - } -} - -void TabPage::updateFromSettings(Settings& settings) { - folderView_->updateFromSettings(settings); -} - -void TabPage::setViewMode(Fm::FolderView::ViewMode mode) { - if(folderSettings_.viewMode() != mode) { - folderSettings_.setViewMode(mode); - if(folderSettings_.isCustomized()) { - static_cast(qApp)->settings().saveFolderSettings(path(), folderSettings_); - } - } - folderView_->setViewMode(mode); -} - -void TabPage::sort(int col, Qt::SortOrder order) { - if(folderSettings_.sortColumn() != col || folderSettings_.sortOrder() != order) { - folderSettings_.setSortColumn(Fm::FolderModel::ColumnId(col)); - folderSettings_.setSortOrder(order); - if(folderSettings_.isCustomized()) { - static_cast(qApp)->settings().saveFolderSettings(path(), folderSettings_); - } - } - if(proxyModel_) { - proxyModel_->sort(col, order); - } -} - -void TabPage::setSortFolderFirst(bool value) { - if(folderSettings_.sortFolderFirst() != value) { - folderSettings_.setSortFolderFirst(value); - if(folderSettings_.isCustomized()) { - static_cast(qApp)->settings().saveFolderSettings(path(), folderSettings_); - } - } - proxyModel_->setFolderFirst(value); -} - -void TabPage::setSortCaseSensitive(bool value) { - if(folderSettings_.sortCaseSensitive() != value) { - folderSettings_.setSortCaseSensitive(value); - if(folderSettings_.isCustomized()) { - static_cast(qApp)->settings().saveFolderSettings(path(), folderSettings_); - } - } - proxyModel_->setSortCaseSensitivity(value ? Qt::CaseSensitive : Qt::CaseInsensitive); -} - - -void TabPage::setShowHidden(bool showHidden) { - if(folderSettings_.showHidden() != showHidden) { - folderSettings_.setShowHidden(showHidden); - if(folderSettings_.isCustomized()) { - static_cast(qApp)->settings().saveFolderSettings(path(), folderSettings_); - } - } - if(!proxyModel_) { - return; - } - if(showHidden != proxyModel_->showHidden()) { - proxyModel_->setShowHidden(showHidden); - } - // this may also be called by MainWindow::onTabPageSortFilterChanged to set status message - statusText_[StatusTextNormal] = formatStatusText(); - Q_EMIT statusChanged(StatusTextNormal, statusText_[StatusTextNormal]); -} - -void TabPage::applyFilter() { - if(!proxyModel_) { - return; - } - proxyModel_->updateFilters(); - statusText_[StatusTextNormal] = formatStatusText(); - Q_EMIT statusChanged(StatusTextNormal, statusText_[StatusTextNormal]); -} - -void TabPage::setCustomizedView(bool value) { - if(folderSettings_.isCustomized() == value) { - return; - } - - Settings& settings = static_cast(qApp)->settings(); - folderSettings_.setCustomized(value); - if(value) { // save customized folder view settings - settings.saveFolderSettings(path(), folderSettings_); - } - else { // use default folder view settings - settings.clearFolderSettings(path()); - setShowHidden(settings.showHidden()); - setSortCaseSensitive(settings.sortCaseSensitive()); - setSortFolderFirst(settings.sortFolderFirst()); - sort(settings.sortColumn(), settings.sortOrder()); - } -} - -} // namespace PCManFM diff --git a/pcmanfm/tabpage.h b/pcmanfm/tabpage.h deleted file mode 100644 index 424cfe3..0000000 --- a/pcmanfm/tabpage.h +++ /dev/null @@ -1,249 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef FM_TABPAGE_H -#define FM_TABPAGE_H - -#include -#include -#include -#include -#include "view.h" -#include "settings.h" - -#include -#include -#include - -namespace Fm { -class FileLauncher; -class FolderModel; -class ProxyFolderModel; -class CachedFolderModel; -} - -namespace PCManFM { - -class Launcher; - -class ProxyFilter : public Fm::ProxyFolderModelFilter { -public: - bool filterAcceptsRow(const Fm::ProxyFolderModel* model, const std::shared_ptr& info) const; - virtual ~ProxyFilter() {} - QString getFilterStr() { - return filterStr_; - } - void setFilterStr(QString str) { - filterStr_ = str; - } - -private: - QString filterStr_; -}; - -class TabPage : public QWidget { - Q_OBJECT - -public: - enum StatusTextType { - StatusTextNormal, - StatusTextSelectedFiles, - StatusTextFSInfo, - StatusTextNum - }; - -public: - explicit TabPage(QWidget* parent = nullptr); - virtual ~TabPage(); - - void chdir(Fm::FilePath newPath, bool addHistory = true); - - Fm::FolderView::ViewMode viewMode() { - return folderSettings_.viewMode(); - } - - void setViewMode(Fm::FolderView::ViewMode mode); - - void sort(int col, Qt::SortOrder order = Qt::AscendingOrder); - - int sortColumn() { - return folderSettings_.sortColumn(); - } - - Qt::SortOrder sortOrder() { - return folderSettings_.sortOrder(); - } - - bool sortFolderFirst() { - return folderSettings_.sortFolderFirst(); - } - void setSortFolderFirst(bool value); - - bool sortCaseSensitive() { - return folderSettings_.sortCaseSensitive(); - } - - void setSortCaseSensitive(bool value); - - bool showHidden() { - return proxyModel_->showHidden(); - } - - void setShowHidden(bool showHidden); - - Fm::FilePath path() { - return folder_ ? folder_->path() : Fm::FilePath(); - } - - QString pathName(); - - const std::shared_ptr& folder() { - return folder_; - } - - Fm::FolderModel* folderModel() { - return reinterpret_cast(folderModel_); - } - - View* folderView() { - return folderView_; - } - - Fm::BrowseHistory& browseHistory() { - return history_; - } - - Fm::FileInfoList selectedFiles() { - return folderView_->selectedFiles(); - } - - Fm::FilePathList selectedFilePaths() { - return folderView_->selectedFilePaths(); - } - - void selectAll(); - - void invertSelection(); - - void reload(); - - QString statusText(StatusTextType type = StatusTextNormal) const { - return statusText_[type]; - } - - bool canBackward() { - return history_.canBackward(); - } - - void backward(); - - bool canForward() { - return history_.canForward(); - } - - void forward(); - - void jumpToHistory(int index); - - bool canUp(); - - void up(); - - void updateFromSettings(Settings& settings); - - void setFileLauncher(Fm::FileLauncher* launcher) { - folderView_->setFileLauncher(launcher); - } - - Fm::FileLauncher* fileLauncher() { - return folderView_->fileLauncher(); - } - - QString getFilterStr() { - if(proxyFilter_) { - return proxyFilter_->getFilterStr(); - } - return QString(); - } - - void setFilterStr(QString str) { - if(proxyFilter_) { - proxyFilter_->setFilterStr(str); - } - } - - void applyFilter(); - - bool hasCustomizedView() { - return folderSettings_.isCustomized(); - } - - void setCustomizedView(bool value); - -Q_SIGNALS: - void statusChanged(int type, QString statusText); - void titleChanged(QString title); - void openDirRequested(const Fm::FilePath& path, int target); - void sortFilterChanged(); - void forwardRequested(); - void backwardRequested(); - -protected Q_SLOTS: - void onSelChanged(); - void onUiUpdated(); - void onFileSizeChanged(const QModelIndex& index); - void onFilesAdded(const Fm::FileInfoList files); - -private: - void freeFolder(); - QString formatStatusText(); - - // Adds bidi marks (RLM/LRM/RLE/LRE/POP) around the text for the statusbar. - QString encloseWithBidiMarks(const QString& text); - - void onFolderStartLoading(); - void onFolderFinishLoading(); - - // FIXME: this API design is bad and might be removed later - void onFolderError(const Fm::GErrorPtr& err, Fm::Job::ErrorSeverity severity, Fm::Job::ErrorAction& response); - - void onFolderFsInfo(); - void onFolderRemoved(); - void onFolderUnmount(); - void onFolderContentChanged(); - -private: - View* folderView_; - Fm::CachedFolderModel* folderModel_; - Fm::ProxyFolderModel* proxyModel_; - ProxyFilter* proxyFilter_; - QVBoxLayout* verticalLayout; - std::shared_ptr folder_; - QString statusText_[StatusTextNum]; - Fm::BrowseHistory history_; // browsing history - Fm::FilePath lastFolderPath_; // last browsed folder - bool overrideCursor_; - FolderSettings folderSettings_; - QTimer* selectionTimer_; -}; - -} - -#endif // FM_TABPAGE_H diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ar.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_ar.desktop deleted file mode 100644 index e329a6c..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ar.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[ar]=سطح المكتب -GenericName[ar]=تفضيلات سطح المكتب -Comment[ar]=غيّر خلفيّات مدير سطح المكتب وسلوكه diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ca.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_ca.desktop deleted file mode 100644 index 3f6ba8a..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ca.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[ca]=Escriptori -GenericName[ca]=Ajusts de l'escriptori -Comment[ca]=Canvieu les imatges dels fons i el comportament del gestor d'escriptoris diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_da.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_da.desktop deleted file mode 100644 index 2b1cd51..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_da.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[da]=Skrivebord -GenericName[da]=Skrivebordsindstillinger -Comment[da]=Skift desktop managerens tapeter og adfærd diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_de.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_de.desktop deleted file mode 100644 index e339db9..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_de.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[de]=Schreibtisch -GenericName[de]=Schreibtischeinstellungen -Comment[de]=Einstellungen wie Hintergrundbild oder verwendete Menüs diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_el.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_el.desktop deleted file mode 100644 index a1a3ed0..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_el.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[el]=Επιφάνεια εργασίας -GenericName[el]=Ρυθμίσεις της επιφάνειας εργασίας -Comment[el]=Αλλαγή της ταπετσαρίας και της συμπεριφοράς του διαχειριστή της επιφάνειας εργασίας diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_es.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_es.desktop deleted file mode 100644 index c83e89a..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_es.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[es]=Escritorio -GenericName[es]=Configuración del escritorio -Comment[es]=Cambiar el fondo de pantalla y el comportamiento del escritorio diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_fr.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_fr.desktop deleted file mode 100644 index b0fb244..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_fr.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[fr]=Bureau -GenericName[fr]=Paramétrage du bureau -Comment[fr]=Paramètres tels que papier-peint et autres réglages du bureau diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_hu.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_hu.desktop deleted file mode 100644 index e92bd03..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_hu.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[hu]=Asztal -GenericName[hu]=Asztalbeállítás -Comment[hu]=Asztal kinézet és viselkedés beállítása diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_it.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_it.desktop deleted file mode 100644 index 3a55236..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_it.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[it]=Scrivania -GenericName[it]=Preferenze della scrivania -Comment[it]=Configura percorso e aspetto della scrivania diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_lt.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_lt.desktop deleted file mode 100644 index 21e5a52..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_lt.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[lt]=Darbalaukis -GenericName[lt]=Darbalaukio nustatymai -Comment[lt]=Keisti darbalaukio tvarkytuvės darbalaukio foną ir elgseną diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_pl.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_pl.desktop deleted file mode 100644 index 6652766..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_pl.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[pl]=Pulpit -GenericName[pl]=Ustawienia pulpitu -Comment[pl]=Zmiana tapety oraz zachowania pulpitu diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_pt.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_pt.desktop deleted file mode 100644 index 731909a..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_pt.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[pt]=Área de trabalho -GenericName[pt]=Definições da área de trabalho -Comment[pt]=Mudar o papel de parede e o comportamento da área de trabalho diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ru.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_ru.desktop deleted file mode 100644 index e83806c..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_ru.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[ru]=Рабочий стол -GenericName[ru]=Настройки рабочего стола -Comment[ru]=Изменить обои и поведение менеджера рабочего стола \ No newline at end of file diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_tr.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_tr.desktop deleted file mode 100644 index 7618786..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_tr.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations / translated by tulliana -Name[tr]=Dosya Yöneticisi (PCManFM-Qt) -GenericName[tr]=Dosya ve masaüstü yönetim uygulaması -Comment[tr]=Dosya Yöneticisi ve Masaüstü Ayarları (duvarkağıtları, menüler vs..) diff --git a/pcmanfm/translations/pcmanfm-qt-desktop-pref_zh_CN.desktop b/pcmanfm/translations/pcmanfm-qt-desktop-pref_zh_CN.desktop deleted file mode 100644 index f78bea7..0000000 --- a/pcmanfm/translations/pcmanfm-qt-desktop-pref_zh_CN.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[zh_CN]=桌面 -GenericName[zh_CN]=桌面设置 -Comment[zh_CN]=更改墙纸与桌面管理器的行为。 diff --git a/pcmanfm/translations/pcmanfm-qt_ar.desktop b/pcmanfm/translations/pcmanfm-qt_ar.desktop deleted file mode 100644 index 02a9090..0000000 --- a/pcmanfm/translations/pcmanfm-qt_ar.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[ar]=مدير الملفّات PCManFM-Qt -GenericName[ar]=مدير ملفّات -Comment[ar]=تصفّح نظام الملفّات وأدر ملفّاتك diff --git a/pcmanfm/translations/pcmanfm-qt_ca.desktop b/pcmanfm/translations/pcmanfm-qt_ca.desktop deleted file mode 100644 index d4f691c..0000000 --- a/pcmanfm/translations/pcmanfm-qt_ca.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[ca]=Gestor de fitxers PCManFM-Qt -GenericName[ca]=Gestor de fitxers -Comment[ca]=Navegueu pel sistema de fitxers i gestioneu els fitxers diff --git a/pcmanfm/translations/pcmanfm-qt_da.desktop b/pcmanfm/translations/pcmanfm-qt_da.desktop deleted file mode 100644 index 973e9ad..0000000 --- a/pcmanfm/translations/pcmanfm-qt_da.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[da]=PCManFM-Qt-filhåndtering -GenericName[da]=Filhåndtering -Comment[da]=Gennemse filsystemet og håndtér filerne diff --git a/pcmanfm/translations/pcmanfm-qt_de.desktop b/pcmanfm/translations/pcmanfm-qt_de.desktop deleted file mode 100644 index 7eeaa2f..0000000 --- a/pcmanfm/translations/pcmanfm-qt_de.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[de]=PCManFM-Qt -GenericName[de]=Dateimanager -Comment[de]=Dateimanager der Desktop-Umgebung LXQt diff --git a/pcmanfm/translations/pcmanfm-qt_el.desktop b/pcmanfm/translations/pcmanfm-qt_el.desktop deleted file mode 100644 index 11ac432..0000000 --- a/pcmanfm/translations/pcmanfm-qt_el.desktop +++ /dev/null @@ -1,4 +0,0 @@ -Name[el]=Διαχειριστής αρχείων PCManFM-Qt -GenericName[el]=Διαχειριστής αρχείων -Comment[el]=Περιήγηση του συστήματος αρχείων και διαχείριση των αρχείων - diff --git a/pcmanfm/translations/pcmanfm-qt_es.desktop b/pcmanfm/translations/pcmanfm-qt_es.desktop deleted file mode 100644 index c88737f..0000000 --- a/pcmanfm/translations/pcmanfm-qt_es.desktop +++ /dev/null @@ -1,3 +0,0 @@ -Name[es]=Gestor de archivos PCManFM-Qt -GenericName[es]=Gestor de archivos -Comment[es]=Explorar el sistema de archivos y gestionar los archivos diff --git a/pcmanfm/translations/pcmanfm-qt_fr.desktop b/pcmanfm/translations/pcmanfm-qt_fr.desktop deleted file mode 100644 index 85724bd..0000000 --- a/pcmanfm/translations/pcmanfm-qt_fr.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[fr]=PCManFM-Qt -GenericName[fr]=Gestionnaire de fichiers -Comment[fr]=Gestionnaire de fichiers de l'environnement LXQt diff --git a/pcmanfm/translations/pcmanfm-qt_hu.desktop b/pcmanfm/translations/pcmanfm-qt_hu.desktop deleted file mode 100644 index 7a90797..0000000 --- a/pcmanfm/translations/pcmanfm-qt_hu.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[hu]=PCManFM-Qt fájlkezelő -GenericName[hu]=Fájlkezelő -Comment[hu]=Fájlok böngészése és karbantartása diff --git a/pcmanfm/translations/pcmanfm-qt_it.desktop b/pcmanfm/translations/pcmanfm-qt_it.desktop deleted file mode 100644 index 41992c0..0000000 --- a/pcmanfm/translations/pcmanfm-qt_it.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[it]=Gestore file PCManFM-Qt -GenericName[it]=Gestore file -Comment[it]=Esplora e organizza file e cartelle diff --git a/pcmanfm/translations/pcmanfm-qt_lt.desktop b/pcmanfm/translations/pcmanfm-qt_lt.desktop deleted file mode 100644 index 8e8a3be..0000000 --- a/pcmanfm/translations/pcmanfm-qt_lt.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[lt]=PCManFM-Qt failų tvarkytuvė -GenericName[lt]=Failų tvarkytuvė -Comment[lt]=Naršyti failų sistemą ir tvarkyti failus diff --git a/pcmanfm/translations/pcmanfm-qt_pl.desktop b/pcmanfm/translations/pcmanfm-qt_pl.desktop deleted file mode 100644 index f8cae09..0000000 --- a/pcmanfm/translations/pcmanfm-qt_pl.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[pl]=Menedżer plików PCManFM-Qt -GenericName[pl]=Menedżer plików -Comment[pl]=Przegląd systemu plików i zarządzanie plikami diff --git a/pcmanfm/translations/pcmanfm-qt_pt.desktop b/pcmanfm/translations/pcmanfm-qt_pt.desktop deleted file mode 100644 index 64df8a8..0000000 --- a/pcmanfm/translations/pcmanfm-qt_pt.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[pt]=Gestor de ficheiros PCManFM-Qt -GenericName[pt]=Gestor de ficheiros -Comment[pt]=Explorar o sistema de ficheiros e gerir os seus ficheiros e pastas diff --git a/pcmanfm/translations/pcmanfm-qt_pt_BR.desktop b/pcmanfm/translations/pcmanfm-qt_pt_BR.desktop deleted file mode 100644 index 575577a..0000000 --- a/pcmanfm/translations/pcmanfm-qt_pt_BR.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[pt_BR]=Gerenciador de Arquivos PCManFM-Qt -GenericName[pt_BR]=Gerenciador de Arquivos -Comment[pt_BR]=Navegue pelo sistema de arquivos e gerencie arquivos e pastas diff --git a/pcmanfm/translations/pcmanfm-qt_ru.desktop b/pcmanfm/translations/pcmanfm-qt_ru.desktop deleted file mode 100644 index dcf93da..0000000 --- a/pcmanfm/translations/pcmanfm-qt_ru.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[ru]=Диспетчер файлов PCManFM-Qt -GenericName[ru]=Диспетчер файлов -Comment[ru]=Просматривайте файловую систему и управляйте файлами \ No newline at end of file diff --git a/pcmanfm/translations/pcmanfm-qt_tr.desktop b/pcmanfm/translations/pcmanfm-qt_tr.desktop deleted file mode 100644 index 49cfe8b..0000000 --- a/pcmanfm/translations/pcmanfm-qt_tr.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations / translated by tulliana -Name[tr]=PCManFM-Qt -GenericName[tr]=Dosya Yönetici -Comment[tr]=Lxqt dosya ve masaüstü yöneticisi diff --git a/pcmanfm/translations/pcmanfm-qt_zh_CN.desktop b/pcmanfm/translations/pcmanfm-qt_zh_CN.desktop deleted file mode 100644 index 3c2d264..0000000 --- a/pcmanfm/translations/pcmanfm-qt_zh_CN.desktop +++ /dev/null @@ -1,4 +0,0 @@ -#Translations -Name[zh_CN]=PCManFM-Qt 文件管理器 -GenericName[zh_CN]=文件管理器 -Comment[zh_CN]=浏览文件系统并管理文件。 diff --git a/pcmanfm/view.cpp b/pcmanfm/view.cpp deleted file mode 100644 index c11161f..0000000 --- a/pcmanfm/view.cpp +++ /dev/null @@ -1,150 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#include "view.h" -#include -#include -#include "application.h" -#include "settings.h" -#include "application.h" -#include "mainwindow.h" -#include "launcher.h" -#include - -namespace PCManFM { - -View::View(Fm::FolderView::ViewMode _mode, QWidget* parent): - Fm::FolderView(_mode, parent) { - - Settings& settings = static_cast(qApp)->settings(); - updateFromSettings(settings); -} - -View::~View() { -} - -void View::onFileClicked(int type, const std::shared_ptr& fileInfo) { - if(type == MiddleClick) { - if(fileInfo->isDir()) { - Q_EMIT openDirRequested(fileInfo->path(), OpenInNewTab); - } - } - else { - Fm::FolderView::onFileClicked(type, fileInfo); - } -} - -void View::onNewWindow() { - Fm::FileMenu* menu = static_cast(sender()->parent()); - // FIXME: open the files in a new window - Application* app = static_cast(qApp); - app->openFolders(menu->files()); -} - -void View::onNewTab() { - Fm::FileMenu* menu = static_cast(sender()->parent()); - auto files = menu->files(); - for(auto& file: files) { - Q_EMIT openDirRequested(file->path(), OpenInNewTab); - } -} - -void View::onOpenInTerminal() { - Application* app = static_cast(qApp); - Fm::FileMenu* menu = static_cast(sender()->parent()); - auto files = menu->files(); - for(auto& file: files) { - app->openFolderInTerminal(file->path()); - } -} - -void View::onSearch() { - -} - -void View::prepareFileMenu(Fm::FileMenu* menu) { - Application* app = static_cast(qApp); - menu->setConfirmDelete(app->settings().confirmDelete()); - menu->setConfirmTrash(app->settings().confirmTrash()); - menu->setUseTrash(app->settings().useTrash()); - - // add some more menu items for dirs - bool all_native = true; - bool all_directory = true; - auto files = menu->files(); - for(auto& fi: files) { - if(!fi->isDir()) { - all_directory = false; - } - else if(fi->isDir() && !fi->isNative()) { - all_native = false; - } - } - - if(all_directory) { - QAction* action = new QAction(QIcon::fromTheme("window-new"), tr("Open in New T&ab"), menu); - connect(action, &QAction::triggered, this, &View::onNewTab); - menu->insertAction(menu->separator1(), action); - - action = new QAction(QIcon::fromTheme("window-new"), tr("Open in New Win&dow"), menu); - connect(action, &QAction::triggered, this, &View::onNewWindow); - menu->insertAction(menu->separator1(), action); - - // TODO: add search - // action = menu->addAction(_("Search")); - - if(all_native) { - action = new QAction(QIcon::fromTheme("utilities-terminal"), tr("Open in Termina&l"), menu); - connect(action, &QAction::triggered, this, &View::onOpenInTerminal); - menu->insertAction(menu->separator1(), action); - } - } - else { - if(menu->pasteAction()) { // nullptr for trash - menu->pasteAction()->setVisible(false); - } - if(menu->createAction()) { - menu->createAction()->setVisible(false); - } - } -} - -void View::prepareFolderMenu(Fm::FolderMenu* /*menu*/) { -} - -void View::updateFromSettings(Settings& settings) { - - setIconSize(Fm::FolderView::IconMode, QSize(settings.bigIconSize(), settings.bigIconSize())); - setIconSize(Fm::FolderView::CompactMode, QSize(settings.smallIconSize(), settings.smallIconSize())); - setIconSize(Fm::FolderView::ThumbnailMode, QSize(settings.thumbnailIconSize(), settings.thumbnailIconSize())); - setIconSize(Fm::FolderView::DetailedListMode, QSize(settings.smallIconSize(), settings.smallIconSize())); - - setMargins(settings.folderViewCellMargins()); - - setAutoSelectionDelay(settings.autoSelectionDelay()); - - Fm::ProxyFolderModel* proxyModel = model(); - if(proxyModel) { - proxyModel->setShowThumbnails(settings.showThumbnails()); - proxyModel->setBackupAsHidden(settings.backupAsHidden()); - } -} - -} // namespace PCManFM diff --git a/pcmanfm/view.h b/pcmanfm/view.h deleted file mode 100644 index 297b33e..0000000 --- a/pcmanfm/view.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - - Copyright (C) 2013 Hong Jen Yee (PCMan) - - This program 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. - - This program 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, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. -*/ - - -#ifndef PCMANFM_FOLDERVIEW_H -#define PCMANFM_FOLDERVIEW_H - -#include -#include - - -namespace Fm { -class FileMenu; -class FolderMenu; -} - -namespace PCManFM { - -class Settings; - -class View : public Fm::FolderView { - Q_OBJECT -public: - - explicit View(Fm::FolderView::ViewMode _mode = IconMode, QWidget* parent = 0); - virtual ~View(); - - void updateFromSettings(Settings& settings); - - QSize getMargins() const { - return Fm::FolderView::getMargins(); - } - void setMargins(QSize size) { - Fm::FolderView::setMargins(size); - } - -Q_SIGNALS: - void openDirRequested(const Fm::FilePath& path, int target); - -protected Q_SLOTS: - void onNewWindow(); - void onNewTab(); - void onOpenInTerminal(); - void onSearch(); - -protected: - virtual void onFileClicked(int type, const std::shared_ptr& fileInfo); - virtual void prepareFileMenu(Fm::FileMenu* menu); - virtual void prepareFolderMenu(Fm::FolderMenu* menu); - -private: - -}; - -} -#endif // PCMANFM_FOLDERVIEW_H diff --git a/pcmanfm/xdgdir.cpp b/pcmanfm/xdgdir.cpp deleted file mode 100644 index b626efd..0000000 --- a/pcmanfm/xdgdir.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2013 Hong Jen Yee (PCMan) - * - * This program 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. - * - * This program 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include "xdgdir.h" -#include -#include -#include -#include - -QString XdgDir::readUserDirsFile() { - QFile file(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QStringLiteral("/user-dirs.dirs")); - if(file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QByteArray data = file.readAll(); - file.close(); - return QString::fromLocal8Bit(data); - } - return QString(); -} - -QString XdgDir::readDesktopDir() { - QString str = readUserDirsFile(); - if(str.isEmpty()) - return QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + QStringLiteral("/Desktop"); - QRegExp reg(QStringLiteral("XDG_DESKTOP_DIR=\"([^\n]*)\"")); - if(reg.lastIndexIn(str) != -1) { - str = reg.cap(1); - if(str.startsWith(QStringLiteral("$HOME"))) - str = QStandardPaths::writableLocation(QStandardPaths::HomeLocation) + str.mid(5); - return str; - } - return QString(); -} - -void XdgDir::setDesktopDir(QString path) { - QString home = QStandardPaths::writableLocation(QStandardPaths::HomeLocation); - if(path.startsWith(home)) - path = QStringLiteral("$HOME") + path.mid(home.length()); - QString str = readUserDirsFile(); - QRegExp reg(QStringLiteral("XDG_DESKTOP_DIR=\"([^\n]*)\"")); - QString line = QStringLiteral("XDG_DESKTOP_DIR=\"") + path + '\"'; - if(reg.indexIn(str) != -1) - str.replace(reg, line); - else { - if(!str.endsWith('\n')) - str += '\n'; - str += line + '\n'; - } - QString dir = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation); - if(QDir().mkpath(dir)) { // write the file - QSaveFile file(dir + QStringLiteral("/user-dirs.dirs")); - if(file.open(QIODevice::WriteOnly | QIODevice::Text)) { - file.write(str.toLocal8Bit()); - file.commit(); - } - } -} - diff --git a/pcmanfm/xdgdir.h b/pcmanfm/xdgdir.h deleted file mode 100644 index 8a56539..0000000 --- a/pcmanfm/xdgdir.h +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2013 Hong Jen Yee (PCMan) - * - * This program 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. - * - * This program 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, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -#include -#include - -class XdgDir : public QObject -{ - Q_OBJECT - -public: - static QString readDesktopDir(); - - static void setDesktopDir(QString path); - -private: - static QString readUserDirsFile(); -};