From 080e18617006b9a8a1331b0a8647701b470615e8 Mon Sep 17 00:00:00 2001 From: Simon Quigley Date: Sat, 14 Jul 2018 18:17:16 -0500 Subject: [PATCH] Remove orig tar stuff. --- .gitignore | 8 - AUTHORS | 6 - CHANGELOG | 750 ------- CMakeLists.txt | 69 - Doxyfile.in | 1890 ----------------- LICENSE | 280 --- README.md | 62 - autostart/CMakeLists.txt | 17 - autostart/lxqt-desktop.desktop.in | 9 - .../translations/lxqt-desktop_ar.desktop | 2 - .../translations/lxqt-desktop_cs.desktop | 2 - .../translations/lxqt-desktop_cs_CZ.desktop | 2 - .../translations/lxqt-desktop_da.desktop | 2 - .../translations/lxqt-desktop_de.desktop | 2 - .../translations/lxqt-desktop_el.desktop | 2 - .../translations/lxqt-desktop_eo.desktop | 2 - .../translations/lxqt-desktop_es.desktop | 1 - .../translations/lxqt-desktop_es_VE.desktop | 2 - .../translations/lxqt-desktop_eu.desktop | 2 - .../translations/lxqt-desktop_fi.desktop | 2 - .../translations/lxqt-desktop_fr.desktop | 2 - .../translations/lxqt-desktop_hu.desktop | 2 - .../translations/lxqt-desktop_ia.desktop | 2 - .../translations/lxqt-desktop_it_IT.desktop | 2 - .../translations/lxqt-desktop_ja.desktop | 2 - .../translations/lxqt-desktop_lt.desktop | 2 - .../translations/lxqt-desktop_nl.desktop | 2 - .../translations/lxqt-desktop_pl_PL.desktop | 2 - .../translations/lxqt-desktop_pt.desktop | 2 - .../translations/lxqt-desktop_pt_BR.desktop | 2 - .../translations/lxqt-desktop_ro_RO.desktop | 2 - .../translations/lxqt-desktop_ru.desktop | 2 - .../translations/lxqt-desktop_ru_RU.desktop | 2 - .../translations/lxqt-desktop_sl.desktop | 2 - .../translations/lxqt-desktop_th_TH.desktop | 2 - .../translations/lxqt-desktop_tr.desktop | 2 - .../translations/lxqt-desktop_uk.desktop | 2 - .../translations/lxqt-desktop_zh_CN.desktop | 2 - .../translations/lxqt-desktop_zh_TW.desktop | 2 - config/CMakeLists.txt | 8 - config/pcmanfm-qt/lxqt/settings.conf.in | 53 - pcmanfm-qt.1.in | 51 - pcmanfm/CMakeLists.txt | 97 - pcmanfm/about.ui | 180 -- pcmanfm/application.cpp | 895 -------- pcmanfm/application.h | 157 -- pcmanfm/autorun.ui | 117 - pcmanfm/autorundialog.cpp | 142 -- pcmanfm/autorundialog.h | 54 - pcmanfm/bulk-rename.ui | 92 - pcmanfm/bulkrename.cpp | 103 - pcmanfm/bulkrename.h | 57 - pcmanfm/connect.ui | 173 -- pcmanfm/connectserverdialog.cpp | 88 - pcmanfm/connectserverdialog.h | 38 - pcmanfm/desktop-folder.ui | 60 - pcmanfm/desktop-preferences.ui | 548 ----- pcmanfm/desktoppreferencesdialog.cpp | 261 --- pcmanfm/desktoppreferencesdialog.h | 68 - pcmanfm/desktopwindow.cpp | 1339 ------------ pcmanfm/desktopwindow.h | 171 -- pcmanfm/launcher.cpp | 67 - pcmanfm/launcher.h | 44 - pcmanfm/main-win.ui | 873 -------- pcmanfm/mainwindow.cpp | 1518 ------------- pcmanfm/mainwindow.h | 218 -- pcmanfm/org.pcmanfm.Application.xml | 29 - pcmanfm/pcmanfm-qt-desktop-pref.desktop.in | 9 - pcmanfm/pcmanfm-qt.desktop.in | 10 - pcmanfm/pcmanfm.cpp | 15 - pcmanfm/preferences.ui | 1070 ---------- pcmanfm/preferencesdialog.cpp | 400 ---- pcmanfm/preferencesdialog.h | 74 - pcmanfm/settings.cpp | 775 ------- pcmanfm/settings.h | 982 --------- pcmanfm/statusbar.cpp | 96 - pcmanfm/statusbar.h | 63 - pcmanfm/tabbar.cpp | 110 - pcmanfm/tabbar.h | 55 - pcmanfm/tabpage.cpp | 692 ------ pcmanfm/tabpage.h | 249 --- .../pcmanfm-qt-desktop-pref_ar.desktop | 4 - .../pcmanfm-qt-desktop-pref_ca.desktop | 3 - .../pcmanfm-qt-desktop-pref_da.desktop | 3 - .../pcmanfm-qt-desktop-pref_de.desktop | 4 - .../pcmanfm-qt-desktop-pref_el.desktop | 3 - .../pcmanfm-qt-desktop-pref_es.desktop | 3 - .../pcmanfm-qt-desktop-pref_fr.desktop | 4 - .../pcmanfm-qt-desktop-pref_hu.desktop | 4 - .../pcmanfm-qt-desktop-pref_it.desktop | 4 - .../pcmanfm-qt-desktop-pref_lt.desktop | 4 - .../pcmanfm-qt-desktop-pref_pl.desktop | 4 - .../pcmanfm-qt-desktop-pref_pt.desktop | 4 - .../pcmanfm-qt-desktop-pref_ru.desktop | 4 - .../pcmanfm-qt-desktop-pref_tr.desktop | 4 - .../pcmanfm-qt-desktop-pref_zh_CN.desktop | 4 - pcmanfm/translations/pcmanfm-qt_ar.desktop | 4 - pcmanfm/translations/pcmanfm-qt_ca.desktop | 4 - pcmanfm/translations/pcmanfm-qt_da.desktop | 3 - pcmanfm/translations/pcmanfm-qt_de.desktop | 4 - pcmanfm/translations/pcmanfm-qt_el.desktop | 4 - pcmanfm/translations/pcmanfm-qt_es.desktop | 3 - pcmanfm/translations/pcmanfm-qt_fr.desktop | 4 - pcmanfm/translations/pcmanfm-qt_hu.desktop | 4 - pcmanfm/translations/pcmanfm-qt_it.desktop | 4 - pcmanfm/translations/pcmanfm-qt_lt.desktop | 4 - pcmanfm/translations/pcmanfm-qt_pl.desktop | 4 - pcmanfm/translations/pcmanfm-qt_pt.desktop | 4 - pcmanfm/translations/pcmanfm-qt_pt_BR.desktop | 4 - pcmanfm/translations/pcmanfm-qt_ru.desktop | 4 - pcmanfm/translations/pcmanfm-qt_tr.desktop | 4 - pcmanfm/translations/pcmanfm-qt_zh_CN.desktop | 4 - pcmanfm/view.cpp | 150 -- pcmanfm/view.h | 72 - pcmanfm/xdgdir.cpp | 72 - pcmanfm/xdgdir.h | 33 - 116 files changed, 15696 deletions(-) delete mode 100644 .gitignore delete mode 100644 AUTHORS delete mode 100644 CHANGELOG delete mode 100644 CMakeLists.txt delete mode 100644 Doxyfile.in delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 autostart/CMakeLists.txt delete mode 100644 autostart/lxqt-desktop.desktop.in delete mode 100644 autostart/translations/lxqt-desktop_ar.desktop delete mode 100644 autostart/translations/lxqt-desktop_cs.desktop delete mode 100644 autostart/translations/lxqt-desktop_cs_CZ.desktop delete mode 100644 autostart/translations/lxqt-desktop_da.desktop delete mode 100644 autostart/translations/lxqt-desktop_de.desktop delete mode 100644 autostart/translations/lxqt-desktop_el.desktop delete mode 100644 autostart/translations/lxqt-desktop_eo.desktop delete mode 100644 autostart/translations/lxqt-desktop_es.desktop delete mode 100644 autostart/translations/lxqt-desktop_es_VE.desktop delete mode 100644 autostart/translations/lxqt-desktop_eu.desktop delete mode 100644 autostart/translations/lxqt-desktop_fi.desktop delete mode 100644 autostart/translations/lxqt-desktop_fr.desktop delete mode 100644 autostart/translations/lxqt-desktop_hu.desktop delete mode 100644 autostart/translations/lxqt-desktop_ia.desktop delete mode 100644 autostart/translations/lxqt-desktop_it_IT.desktop delete mode 100644 autostart/translations/lxqt-desktop_ja.desktop delete mode 100644 autostart/translations/lxqt-desktop_lt.desktop delete mode 100644 autostart/translations/lxqt-desktop_nl.desktop delete mode 100644 autostart/translations/lxqt-desktop_pl_PL.desktop delete mode 100644 autostart/translations/lxqt-desktop_pt.desktop delete mode 100644 autostart/translations/lxqt-desktop_pt_BR.desktop delete mode 100644 autostart/translations/lxqt-desktop_ro_RO.desktop delete mode 100644 autostart/translations/lxqt-desktop_ru.desktop delete mode 100644 autostart/translations/lxqt-desktop_ru_RU.desktop delete mode 100644 autostart/translations/lxqt-desktop_sl.desktop delete mode 100644 autostart/translations/lxqt-desktop_th_TH.desktop delete mode 100644 autostart/translations/lxqt-desktop_tr.desktop delete mode 100644 autostart/translations/lxqt-desktop_uk.desktop delete mode 100644 autostart/translations/lxqt-desktop_zh_CN.desktop delete mode 100644 autostart/translations/lxqt-desktop_zh_TW.desktop delete mode 100644 config/CMakeLists.txt delete mode 100644 config/pcmanfm-qt/lxqt/settings.conf.in delete mode 100644 pcmanfm-qt.1.in delete mode 100644 pcmanfm/CMakeLists.txt delete mode 100644 pcmanfm/about.ui delete mode 100644 pcmanfm/application.cpp delete mode 100644 pcmanfm/application.h delete mode 100644 pcmanfm/autorun.ui delete mode 100644 pcmanfm/autorundialog.cpp delete mode 100644 pcmanfm/autorundialog.h delete mode 100644 pcmanfm/bulk-rename.ui delete mode 100644 pcmanfm/bulkrename.cpp delete mode 100644 pcmanfm/bulkrename.h delete mode 100644 pcmanfm/connect.ui delete mode 100644 pcmanfm/connectserverdialog.cpp delete mode 100644 pcmanfm/connectserverdialog.h delete mode 100644 pcmanfm/desktop-folder.ui delete mode 100644 pcmanfm/desktop-preferences.ui delete mode 100644 pcmanfm/desktoppreferencesdialog.cpp delete mode 100644 pcmanfm/desktoppreferencesdialog.h delete mode 100644 pcmanfm/desktopwindow.cpp delete mode 100644 pcmanfm/desktopwindow.h delete mode 100644 pcmanfm/launcher.cpp delete mode 100644 pcmanfm/launcher.h delete mode 100644 pcmanfm/main-win.ui delete mode 100644 pcmanfm/mainwindow.cpp delete mode 100644 pcmanfm/mainwindow.h delete mode 100644 pcmanfm/org.pcmanfm.Application.xml delete mode 100644 pcmanfm/pcmanfm-qt-desktop-pref.desktop.in delete mode 100644 pcmanfm/pcmanfm-qt.desktop.in delete mode 100644 pcmanfm/pcmanfm.cpp delete mode 100644 pcmanfm/preferences.ui delete mode 100644 pcmanfm/preferencesdialog.cpp delete mode 100644 pcmanfm/preferencesdialog.h delete mode 100644 pcmanfm/settings.cpp delete mode 100644 pcmanfm/settings.h delete mode 100644 pcmanfm/statusbar.cpp delete mode 100644 pcmanfm/statusbar.h delete mode 100644 pcmanfm/tabbar.cpp delete mode 100644 pcmanfm/tabbar.h delete mode 100644 pcmanfm/tabpage.cpp delete mode 100644 pcmanfm/tabpage.h delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_ar.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_ca.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_da.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_de.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_el.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_es.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_fr.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_hu.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_it.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_lt.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_pl.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_pt.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_ru.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_tr.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt-desktop-pref_zh_CN.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_ar.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_ca.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_da.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_de.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_el.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_es.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_fr.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_hu.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_it.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_lt.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_pl.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_pt.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_pt_BR.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_ru.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_tr.desktop delete mode 100644 pcmanfm/translations/pcmanfm-qt_zh_CN.desktop delete mode 100644 pcmanfm/view.cpp delete mode 100644 pcmanfm/view.h delete mode 100644 pcmanfm/xdgdir.cpp delete mode 100644 pcmanfm/xdgdir.h 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(); -};