parent
e49123d636
commit
080e186170
@ -1,8 +0,0 @@
|
||||
debian/*.debhelper
|
||||
debian/*.log
|
||||
debian/*.substvars
|
||||
debian/debhelper-build-stamp
|
||||
debian/files
|
||||
|
||||
debian/pcmanfm-qt/
|
||||
|
@ -1,6 +0,0 @@
|
||||
Upstream Authors:
|
||||
LXQt team: https://lxqt.org
|
||||
Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
Copyright:
|
||||
Copyright (c) 2013-2017 LXQt team
|
@ -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 <pbalicek@seznam.cz>)
|
||||
* 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 <Open with...>/<Other Applications> 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.
|
@ -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)
|
File diff suppressed because it is too large
Load Diff
@ -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
|
@ -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.
|
@ -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
|
||||
)
|
@ -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
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[ar]=سطح المكتب
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[cs]=Plocha
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[cs_CZ]=Plocha
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[da]=Skrivebord
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[de]=Arbeitsfläche
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[el]=Επιφάνεια εργασίας
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[eo]=Labortablo
|
@ -1 +0,0 @@
|
||||
Name[es]=Escritorio
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[es_VE]=Escritorio
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[eu]=Mahaigaina
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[fi]=Työpöytä
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[fr]=Bureau
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[hu]=Asztal
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[ia]=Scriptorio
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[it_IT]=Desktop
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[ja]=デスクトップ
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[lt]=Darbalaukis
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[nl]=Bureaublad
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[pl_PL]=Pulpit
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[pt]=Área de trabalho
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[pt_BR]=Área de trabalho
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[ro_RO]=Desktop
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[ru_RU]=Рабочий стол
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[sl]=Namizje
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[th_TH]=เดสก์ท็อป
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[tr]=Masaüstü
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[uk]=Стільниця
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[zh_CN]=桌面
|
@ -1,2 +0,0 @@
|
||||
# Translations
|
||||
Name[zh_TW]=桌面
|
@ -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
|
||||
)
|
@ -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
|
@ -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) <pcman.tw@gmail.com>.
|
@ -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)
|
@ -1,180 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AboutDialog</class>
|
||||
<widget class="QDialog" name="AboutDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>430</width>
|
||||
<height>325</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>About</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="help-about">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><span style=" font-size:16pt; font-weight:600;">PCManFM-Qt</span></p></body></html></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="version">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Lightweight file manager</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string><html><head/><body><p><a href="https://lxqt.org/"><span style=" text-decoration: underline; color:#0000ff;">https://lxqt.org/</span></a></p></body></html></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="tabsClosable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Authors</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="plainTextEdit_2">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="plainText">
|
||||
<string>Programming:
|
||||
* Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
</string>
|
||||
</property>
|
||||
<property name="backgroundVisible">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>License</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="plainTextEdit">
|
||||
<property name="readOnly">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="plainText">
|
||||
<string>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.</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>AboutDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>AboutDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -1,895 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDBusConnection>
|
||||
#include <QDBusInterface>
|
||||
#include <QDir>
|
||||
#include <QDesktopWidget>
|
||||
#include <QVector>
|
||||
#include <QLocale>
|
||||
#include <QLibraryInfo>
|
||||
#include <QPixmapCache>
|
||||
#include <QFile>
|
||||
#include <QMessageBox>
|
||||
#include <QCommandLineParser>
|
||||
#include <QSocketNotifier>
|
||||
#include <QScreen>
|
||||
#include <QWindow>
|
||||
#include <QFileSystemWatcher>
|
||||
|
||||
#include <gio/gio.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <libfm-qt/mountoperation.h>
|
||||
#include <libfm-qt/filesearchdialog.h>
|
||||
#include <libfm-qt/core/terminal.h>
|
||||
|
||||
#include "applicationadaptor.h"
|
||||
#include "preferencesdialog.h"
|
||||
#include "desktoppreferencesdialog.h"
|
||||
#include "autorundialog.h"
|
||||
#include "launcher.h"
|
||||
#include "xdgdir.h"
|
||||
#include "connectserverdialog.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
|
||||
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<Application*>(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<Fm::FileSearchDialog*>(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<ConnectServerDialog*>(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<DesktopWindow::WallpaperMode>(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<MainWindow*>(window);
|
||||
mainWindow->updateFromSettings(settings_);
|
||||
}
|
||||
}
|
||||
if(desktopManagerEnabled()) {
|
||||
updateDesktopsFromSettings();
|
||||
}
|
||||
}
|
||||
|
||||
void Application::updateDesktopsFromSettings(bool changeSlide) {
|
||||
QVector<DesktopWindow*>::iterator it;
|
||||
for(it = desktopWindows_.begin(); it != desktopWindows_.end(); ++it) {
|
||||
DesktopWindow* desktopWindow = static_cast<DesktopWindow*>(*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<xcb_generic_event_t*>(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 <xxx> --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<QSocketNotifier*>(sender())) {
|
||||
notifier->setEnabled(false);
|
||||
char c;
|
||||
::read(sigterm_fd[1], &c, sizeof(c));
|
||||
quit();
|
||||
notifier->setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace PCManFM
|
@ -1,157 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QApplication>
|
||||
#include "settings.h"
|
||||
#include <libfm-qt/libfmqt.h>
|
||||
#include <libfm-qt/editbookmarksdialog.h>
|
||||
#include <QVector>
|
||||
#include <QPointer>
|
||||
#include <QProxyStyle>
|
||||
#include <QTranslator>
|
||||
#include <gio/gio.h>
|
||||
|
||||
#include <libfm-qt/core/filepath.h>
|
||||
#include <libfm-qt/core/fileinfo.h>
|
||||
|
||||
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<DesktopWindow*> desktopWindows_;
|
||||
QPointer<PreferencesDialog> preferencesDialog_;
|
||||
QPointer<DesktopPreferencesDialog> desktopPreferencesDialog_;
|
||||
QPointer<Fm::EditBookmarksDialog> editBookmarksialog_;
|
||||
QTranslator translator;
|
||||
QTranslator qtTranslator;
|
||||
GVolumeMonitor* volumeMonitor_;
|
||||
|
||||
QFileSystemWatcher* userDirsWatcher_;
|
||||
QString userDirsFile_;
|
||||
QString userDesktopFolder_;
|
||||
bool lxqtRunning_;
|
||||
|
||||
int argc_;
|
||||
char** argv_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // PCMANFM_APPLICATION_H
|
@ -1,117 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AutoRunDialog</class>
|
||||
<widget class="QDialog" name="AutoRunDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>334</width>
|
||||
<height>312</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Removable medium is inserted</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="drive-removable-media">
|
||||
<normaloff>../../../.designer/backup</normaloff>../../../.designer/backup</iconset>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="icon">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string><b>Removable medium is inserted</b></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Type of medium:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="mediumType">
|
||||
<property name="text">
|
||||
<string>Detecting...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Please select the action you want to perform:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QListWidget" name="listWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>AutoRunDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>AutoRunDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -1,142 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QListWidgetItem>
|
||||
#include "application.h"
|
||||
#include "mainwindow.h"
|
||||
#include <libfm-qt/core/filepath.h>
|
||||
#include <libfm-qt/core/iconinfo.h>
|
||||
|
||||
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<void*>();
|
||||
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<Application*>(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<void*>(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
|
@ -1,54 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDialog>
|
||||
#include "ui_autorun.h"
|
||||
#include <gio/gio.h>
|
||||
|
||||
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
|
@ -1,92 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>BulkRenameDialog</class>
|
||||
<widget class="QDialog" name="BulkRenameDialog">
|
||||
<property name="windowTitle">
|
||||
<string>Bulk Rename</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="verticalSpacing">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSpinBox" name="spinBox">
|
||||
<property name="minimum">
|
||||
<number>-1000</number>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>1000</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="2">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::MinimumExpanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>5</width>
|
||||
<height>5</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="label2">
|
||||
<property name="text">
|
||||
<string># will be replaced by numbers starting with:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::MinimumExpanding</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>5</width>
|
||||
<height>5</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="3">
|
||||
<widget class="QLabel" name="label1">
|
||||
<property name="text">
|
||||
<string>Rename selected files to:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="3">
|
||||
<widget class="QLineEdit" name="lineEdit">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Name#</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -1,103 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2017 Pedram Pourang (Tsu Jan) <tsujan2000@gmail.com>
|
||||
|
||||
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 <QTimer>
|
||||
#include <QPushButton>
|
||||
#include <QMessageBox>
|
||||
#include <QProgressDialog>
|
||||
|
||||
#include <libfm-qt/utilities.h>
|
||||
|
||||
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
|
@ -1,57 +0,0 @@
|
||||
/*
|
||||
Copyright (C) 2017 Pedram Pourang (Tsu Jan) <tsujan2000@gmail.com>
|
||||
|
||||
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 <QDialog>
|
||||
|
||||
#include <libfm-qt/core/fileinfo.h>
|
||||
|
||||
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
|
@ -1,173 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ConnectServerDialog</class>
|
||||
<widget class="QDialog" name="ConnectServerDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>450</width>
|
||||
<height>256</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Connect to remote server</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="folder-remote"/>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="5" column="0" colspan="4">
|
||||
<widget class="QRadioButton" name="ananymousLogin">
|
||||
<property name="text">
|
||||
<string>Anonymous &login</string>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1" colspan="3">
|
||||
<widget class="QLineEdit" name="path"/>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QRadioButton" name="loginAsUser">
|
||||
<property name="text">
|
||||
<string>Login as &user:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1" colspan="3">
|
||||
<widget class="QLineEdit" name="userName"/>
|
||||
</item>
|
||||
<item row="1" column="1" colspan="3">
|
||||
<widget class="QComboBox" name="serverType"/>
|
||||
</item>
|
||||
<item row="8" column="0" colspan="4">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="4">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Specify remote folder to connect</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Port:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Path:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="host"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Host:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QSpinBox" name="port">
|
||||
<property name="maximum">
|
||||
<number>65535</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>ConnectServerDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>254</x>
|
||||
<y>249</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>ConnectServerDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>322</x>
|
||||
<y>249</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>loginAsUser</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>userName</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>65</x>
|
||||
<y>194</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>163</x>
|
||||
<y>184</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -1,88 +0,0 @@
|
||||
#include "connectserverdialog.h"
|
||||
#include <QMessageBox>
|
||||
#include <QPushButton>
|
||||
|
||||
namespace PCManFM {
|
||||
|
||||
ConnectServerDialog::ConnectServerDialog(QWidget *parent): QDialog(parent) {
|
||||
serverTypes = QList<ServerType>{
|
||||
{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<void(QComboBox::*)(int)>(&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<const QList<ServerType>&>(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
|
@ -1,38 +0,0 @@
|
||||
#ifndef CONNECTSERVERDIALOG_H
|
||||
#define CONNECTSERVERDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <QList>
|
||||
#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<ServerType> serverTypes;
|
||||
};
|
||||
|
||||
} // namespace PCManFM
|
||||
|
||||
#endif // CONNECTSERVERDIALOG_H
|
@ -1,60 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DesktopFolder</class>
|
||||
<widget class="QWidget" name="DesktopFolder">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>352</width>
|
||||
<height>81</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Form</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Desktop</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_4">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Desktop folder:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="desktopFolder">
|
||||
<property name="toolTip">
|
||||
<string>Image file</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Folder path</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="browseDesktopFolder">
|
||||
<property name="text">
|
||||
<string>&Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
@ -1,548 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>DesktopPreferencesDialog</class>
|
||||
<widget class="QDialog" name="DesktopPreferencesDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>534</width>
|
||||
<height>434</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Desktop Preferences</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="generalPage">
|
||||
<attribute name="title">
|
||||
<string>General</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Background</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="2" column="1" colspan="2">
|
||||
<widget class="QComboBox" name="wallpaperMode">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Wallpaper mode:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Wallpaper image file:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="Fm::ColorButton" name="backgroundColor">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string>Select background color:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="3">
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="imageFile">
|
||||
<property name="toolTip">
|
||||
<string>Image file</string>
|
||||
</property>
|
||||
<property name="statusTip">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Image file path</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="browse">
|
||||
<property name="text">
|
||||
<string>&Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_5">
|
||||
<property name="title">
|
||||
<string>Icons</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="text">
|
||||
<string>Icon size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="iconSize"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>Label Text</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="1">
|
||||
<widget class="Fm::ColorButton" name="textColor">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="Fm::ColorButton" name="shadowColor">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select text color:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select shadow color:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select font:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="Fm::FontButton" name="font">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Spacing</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>Minimum item margins:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QSpinBox" name="hMargin">
|
||||
<property name="toolTip">
|
||||
<string>3 px by default.</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> px</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>48</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>3</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="text">
|
||||
<string>x</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QSpinBox" name="vMargin">
|
||||
<property name="toolTip">
|
||||
<string>1 px by default.
|
||||
A space is also reserved for 3 lines of text.</string>
|
||||
</property>
|
||||
<property name="suffix">
|
||||
<string> px</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>48</number>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>1</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="4">
|
||||
<widget class="QCheckBox" name="lockMargins">
|
||||
<property name="text">
|
||||
<string>Lock</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="5">
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>5</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>10</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="bgPage">
|
||||
<attribute name="title">
|
||||
<string>Slide Show</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="slideShow">
|
||||
<property name="title">
|
||||
<string>Enable Slide Show</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout_4">
|
||||
<item row="0" column="0" colspan="7">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="text">
|
||||
<string>Wallpaper image folder:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="6">
|
||||
<widget class="QPushButton" name="folderBrowse">
|
||||
<property name="text">
|
||||
<string>Browse</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QSpinBox" name="hours">
|
||||
<property name="suffix">
|
||||
<string> hour(s)</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>24</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>and</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="margin">
|
||||
<number>5</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="toolTip">
|
||||
<string>Intervals less than 5min will be ignored</string>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Interval:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="4">
|
||||
<widget class="QSpinBox" name="minutes">
|
||||
<property name="suffix">
|
||||
<string> minute(s)</string>
|
||||
</property>
|
||||
<property name="maximum">
|
||||
<number>55</number>
|
||||
</property>
|
||||
<property name="singleStep">
|
||||
<number>5</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="5">
|
||||
<spacer name="horizontalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>10</width>
|
||||
<height>5</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="6">
|
||||
<widget class="QLineEdit" name="imageFolder">
|
||||
<property name="placeholderText">
|
||||
<string>Wallpaper folder</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<spacer name="horizontalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Minimum</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>5</width>
|
||||
<height>5</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="6">
|
||||
<widget class="QCheckBox" name="randomize">
|
||||
<property name="text">
|
||||
<string>Randomize the slide show</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_3">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="advancedPage">
|
||||
<attribute name="title">
|
||||
<string>Advanced</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="advancedPageLayout">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<property name="title">
|
||||
<string>Window Manager</string>
|
||||
</property>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_3">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="showWmMenu">
|
||||
<property name="text">
|
||||
<string>Show menus provided by window managers when desktop is clicked</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Fm::ColorButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header location="global">libfm-qt/colorbutton.h</header>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>Fm::FontButton</class>
|
||||
<extends>QPushButton</extends>
|
||||
<header location="global">libfm-qt/fontbutton.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>DesktopPreferencesDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>DesktopPreferencesDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -1,261 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QFileDialog>
|
||||
#include <QImageReader>
|
||||
#include <QFile>
|
||||
#include <QDir>
|
||||
#include <QSaveFile>
|
||||
#include <QRegExp>
|
||||
#include <QDebug>
|
||||
#include <QStandardPaths>
|
||||
|
||||
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<Application*>(qApp)->settings();
|
||||
ui.setupUi(this);
|
||||
|
||||
// setup wallpaper modes
|
||||
connect(ui.wallpaperMode, static_cast<void (QComboBox::*)(int)>(&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<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue);
|
||||
}
|
||||
else
|
||||
disconnect(ui.hMargin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue);
|
||||
}
|
||||
|
||||
void DesktopPreferencesDialog::applySettings()
|
||||
{
|
||||
Settings& settings = static_cast<Application*>(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<Application*>(qApp)->updateDesktopsFromSettings();
|
||||
}
|
||||
|
||||
void DesktopPreferencesDialog::accept() {
|
||||
applySettings();
|
||||
static_cast<Application*>(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<QByteArray> 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<QWidget*>(name + "Page");
|
||||
if(page)
|
||||
ui.tabWidget->setCurrentWidget(page);
|
||||
}
|
||||
|
||||
void DesktopPreferencesDialog::setEditDesktopFolder(const bool enabled)
|
||||
{
|
||||
editDesktopFolderEnabled = enabled;
|
||||
if (editDesktopFolderEnabled)
|
||||
setupDesktopFolderUi();
|
||||
}
|
||||
|
||||
} // namespace PCManFM
|
@ -1,68 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDialog>
|
||||
#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
|
File diff suppressed because it is too large
Load Diff
@ -1,171 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <unordered_map>
|
||||
#include <string>
|
||||
|
||||
#include <QHash>
|
||||
#include <QPoint>
|
||||
#include <QByteArray>
|
||||
#include <xcb/xcb.h>
|
||||
#include <libfm-qt/core/folder.h>
|
||||
|
||||
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<const Fm::FileInfo>& 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<Fm::Folder> 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<std::string, QPoint> customItemPos_;
|
||||
QHash<QModelIndex, QString> displayNames_; // only for desktop entries and shortcuts
|
||||
QTimer* relayoutTimer_;
|
||||
QTimer* selectionTimer_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // PCMANFM_DESKTOPWINDOW_H
|
@ -1,67 +0,0 @@
|
||||
/*
|
||||
* <one line to give the library's name and an idea of what it does.>
|
||||
* Copyright (C) 2014 <copyright holder> <email>
|
||||
*
|
||||
* 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 <libfm-qt/core/filepath.h>
|
||||
|
||||
namespace PCManFM {
|
||||
|
||||
Launcher::Launcher(PCManFM::MainWindow* mainWindow):
|
||||
Fm::FileLauncher(),
|
||||
mainWindow_(mainWindow) {
|
||||
|
||||
Application* app = static_cast<Application*>(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<Application*>(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
|
@ -1,44 +0,0 @@
|
||||
/*
|
||||
* <one line to give the library's name and an idea of what it does.>
|
||||
* Copyright (C) 2014 <copyright holder> <email>
|
||||
*
|
||||
* 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 <libfm-qt/filelauncher.h>
|
||||
|
||||
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
|
@ -1,873 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>MainWindow</class>
|
||||
<widget class="QMainWindow" name="MainWindow">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>460</width>
|
||||
<height>369</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>File Manager</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="folder">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<widget class="QWidget" name="centralwidget">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="PCManFM::TabBar" name="tabBar" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="acceptDrops">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QSplitter" name="splitter">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<widget class="Fm::SidePane" name="sidePane" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="QFrame" name="frame">
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<property name="leftMargin">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="stackedWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="filterBar">
|
||||
<property name="toolTip">
|
||||
<string>Focus with Ctrl+I</string>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>Filter by string...</string>
|
||||
</property>
|
||||
<property name="clearButtonEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QMenuBar" name="menubar">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>460</width>
|
||||
<height>30</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::PreventContextMenu</enum>
|
||||
</property>
|
||||
<widget class="QMenu" name="menu_File">
|
||||
<property name="title">
|
||||
<string>&File</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuCreateNew">
|
||||
<property name="title">
|
||||
<string>C&reate New</string>
|
||||
</property>
|
||||
<addaction name="actionNewFolder"/>
|
||||
<addaction name="actionNewBlankFile"/>
|
||||
</widget>
|
||||
<addaction name="actionNewTab"/>
|
||||
<addaction name="actionNewWin"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="menuCreateNew"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFileProperties"/>
|
||||
<addaction name="actionFolderProperties"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionCloseTab"/>
|
||||
<addaction name="actionCloseWindow"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_Help">
|
||||
<property name="title">
|
||||
<string>&Help</string>
|
||||
</property>
|
||||
<addaction name="actionAbout"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_View">
|
||||
<property name="title">
|
||||
<string>&View</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menuSorting">
|
||||
<property name="title">
|
||||
<string>&Sorting</string>
|
||||
</property>
|
||||
<addaction name="actionByFileName"/>
|
||||
<addaction name="actionByMTime"/>
|
||||
<addaction name="actionByFileSize"/>
|
||||
<addaction name="actionByFileType"/>
|
||||
<addaction name="actionByOwner"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionAscending"/>
|
||||
<addaction name="actionDescending"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionFolderFirst"/>
|
||||
<addaction name="actionCaseSensitive"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_View_2">
|
||||
<property name="title">
|
||||
<string>&View</string>
|
||||
</property>
|
||||
<addaction name="actionIconView"/>
|
||||
<addaction name="actionThumbnailView"/>
|
||||
<addaction name="actionCompactView"/>
|
||||
<addaction name="actionDetailedList"/>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuToolbars">
|
||||
<property name="title">
|
||||
<string>&Toolbars</string>
|
||||
</property>
|
||||
<addaction name="actionFilter"/>
|
||||
<addaction name="actionMenu_bar"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menuPathBarStyle">
|
||||
<property name="title">
|
||||
<string>Path &Bar</string>
|
||||
</property>
|
||||
<addaction name="actionLocationBar"/>
|
||||
<addaction name="actionPathButtons"/>
|
||||
</widget>
|
||||
<addaction name="actionReload"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionShowHidden"/>
|
||||
<addaction name="menuSorting"/>
|
||||
<addaction name="menu_View_2"/>
|
||||
<addaction name="actionPreserveView"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="menuToolbars"/>
|
||||
<addaction name="menuPathBarStyle"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_Edit">
|
||||
<property name="title">
|
||||
<string>&Edit</string>
|
||||
</property>
|
||||
<addaction name="actionCut"/>
|
||||
<addaction name="actionCopy"/>
|
||||
<addaction name="actionPaste"/>
|
||||
<addaction name="actionRename"/>
|
||||
<addaction name="actionDelete"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionSelectAll"/>
|
||||
<addaction name="actionInvertSelection"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionBulkRename"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionPreferences"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_Bookmarks">
|
||||
<property name="title">
|
||||
<string>&Bookmarks</string>
|
||||
</property>
|
||||
<addaction name="actionAddToBookmarks"/>
|
||||
<addaction name="actionEditBookmarks"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_Go">
|
||||
<property name="title">
|
||||
<string>&Go</string>
|
||||
</property>
|
||||
<addaction name="actionHome"/>
|
||||
<addaction name="actionDesktop"/>
|
||||
<addaction name="actionComputer"/>
|
||||
<addaction name="actionTrash"/>
|
||||
<addaction name="actionNetwork"/>
|
||||
<addaction name="actionApplications"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionGoBack"/>
|
||||
<addaction name="actionGoForward"/>
|
||||
<addaction name="actionGoUp"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionConnectToServer"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_Tool">
|
||||
<property name="title">
|
||||
<string>&Tool</string>
|
||||
</property>
|
||||
<addaction name="actionOpenTerminal"/>
|
||||
<addaction name="actionOpenAsRoot"/>
|
||||
<addaction name="actionFindFiles"/>
|
||||
</widget>
|
||||
<addaction name="menu_File"/>
|
||||
<addaction name="menu_Edit"/>
|
||||
<addaction name="menu_View"/>
|
||||
<addaction name="menu_Go"/>
|
||||
<addaction name="menu_Bookmarks"/>
|
||||
<addaction name="menu_Tool"/>
|
||||
<addaction name="menu_Help"/>
|
||||
</widget>
|
||||
<widget class="PCManFM::StatusBar" name="statusbar"/>
|
||||
<widget class="QToolBar" name="toolBar">
|
||||
<property name="contextMenuPolicy">
|
||||
<enum>Qt::PreventContextMenu</enum>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Main Toolbar</string>
|
||||
</property>
|
||||
<property name="movable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="floatable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<attribute name="toolBarArea">
|
||||
<enum>TopToolBarArea</enum>
|
||||
</attribute>
|
||||
<attribute name="toolBarBreak">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<addaction name="actionNewTab"/>
|
||||
<addaction name="actionGoBack"/>
|
||||
<addaction name="actionGoForward"/>
|
||||
<addaction name="actionGoUp"/>
|
||||
<addaction name="actionReload"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionIconView"/>
|
||||
<addaction name="actionThumbnailView"/>
|
||||
<addaction name="actionCompactView"/>
|
||||
<addaction name="actionDetailedList"/>
|
||||
<addaction name="separator"/>
|
||||
<addaction name="actionGo"/>
|
||||
<addaction name="actionMenu"/>
|
||||
</widget>
|
||||
<action name="actionGoUp">
|
||||
<property name="icon">
|
||||
<iconset theme="go-up">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go &Up</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go Up</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Alt+Up</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionHome">
|
||||
<property name="icon">
|
||||
<iconset theme="user-home">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Home</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Alt+Home</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionReload">
|
||||
<property name="icon">
|
||||
<iconset theme="view-refresh">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Reload</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F5</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGo">
|
||||
<property name="icon">
|
||||
<iconset theme="go-jump">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionQuit">
|
||||
<property name="icon">
|
||||
<iconset theme="application-exit">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Quit</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAbout">
|
||||
<property name="icon">
|
||||
<iconset theme="help-about">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&About</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNewWin">
|
||||
<property name="icon">
|
||||
<iconset theme="window-new">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&New Window</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>New Window</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+N</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionShowHidden">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Show &Hidden</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+H</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionComputer">
|
||||
<property name="icon">
|
||||
<iconset theme="computer">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Computer</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionTrash">
|
||||
<property name="icon">
|
||||
<iconset theme="user-trash">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Trash</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNetwork">
|
||||
<property name="text">
|
||||
<string>&Network</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDesktop">
|
||||
<property name="icon">
|
||||
<iconset theme="user-desktop">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Desktop</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAddToBookmarks">
|
||||
<property name="icon">
|
||||
<iconset theme="list-add">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Add to Bookmarks</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionApplications">
|
||||
<property name="text">
|
||||
<string>&Applications</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionReload_2">
|
||||
<property name="text">
|
||||
<string>Reload</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionIconView">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Icon View</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCompactView">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Compact View</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDetailedList">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Detailed List</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionThumbnailView">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Thumbnail View</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCut">
|
||||
<property name="icon">
|
||||
<iconset theme="edit-cut">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Cu&t</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+X</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCopy">
|
||||
<property name="icon">
|
||||
<iconset theme="edit-copy">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Copy</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+C</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPaste">
|
||||
<property name="icon">
|
||||
<iconset theme="edit-paste">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Paste</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+V</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionSelectAll">
|
||||
<property name="text">
|
||||
<string>Select &All</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+A</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPreferences">
|
||||
<property name="text">
|
||||
<string>Pr&eferences</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionAscending">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Ascending</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDescending">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Descending</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionByFileName">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&By File Name</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionByMTime">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>By &Modification Time</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionByFileType">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>By File &Type</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionByOwner">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>By &Owner</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFolderFirst">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Folder First</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPreserveSorting">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Preserve sorting for this folder</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNewTab">
|
||||
<property name="icon">
|
||||
<iconset theme="window-new">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>New &Tab</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>New Tab</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+T</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGoBack">
|
||||
<property name="icon">
|
||||
<iconset theme="go-previous">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go &Back</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go Back</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Alt+Left</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionGoForward">
|
||||
<property name="icon">
|
||||
<iconset theme="go-next">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Go &Forward</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Go Forward</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Alt+Right</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionInvertSelection">
|
||||
<property name="text">
|
||||
<string>&Invert Selection</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionDelete">
|
||||
<property name="icon">
|
||||
<iconset theme="edit-delete">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Delete</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Del</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionRename">
|
||||
<property name="text">
|
||||
<string>&Rename</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F2</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseTab">
|
||||
<property name="text">
|
||||
<string>C&lose Tab</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+W</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFileProperties">
|
||||
<property name="text">
|
||||
<string>File &Properties</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Alt+Return</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFolderProperties">
|
||||
<property name="text">
|
||||
<string>&Folder Properties</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCaseSensitive">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Case Sensitive</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionByFileSize">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>By File &Size</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseWindow">
|
||||
<property name="text">
|
||||
<string>&Close Window</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Q</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEdit_Bookmarks">
|
||||
<property name="text">
|
||||
<string>Edit Bookmarks</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionOpenTerminal">
|
||||
<property name="text">
|
||||
<string>Open &Terminal</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F4</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionOpenAsRoot">
|
||||
<property name="text">
|
||||
<string>Open as &Root</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionEditBookmarks">
|
||||
<property name="text">
|
||||
<string>&Edit Bookmarks</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNewFolder">
|
||||
<property name="icon">
|
||||
<iconset theme="folder-new">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Folder</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Shift+N</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionNewBlankFile">
|
||||
<property name="icon">
|
||||
<iconset theme="document-new">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Blank File</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+Alt+N</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFindFiles">
|
||||
<property name="text">
|
||||
<string>&Find Files</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>F3</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionFilter">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Filter</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+B</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseLeft">
|
||||
<property name="icon">
|
||||
<iconset theme="go-previous">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Close &previous tabs</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseRight">
|
||||
<property name="icon">
|
||||
<iconset theme="go-next">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Close &next tabs</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionCloseOther">
|
||||
<property name="text">
|
||||
<string>Close &other tabs</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionMenu_bar">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Menu bar</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Menu bar</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+M</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionMenu">
|
||||
<property name="icon">
|
||||
<iconset theme="application-menu">
|
||||
<normaloff>.</normaloff>.</iconset>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Menu</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Menu</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPreserveView">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Preserve Settings for This Folder</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionConnectToServer">
|
||||
<property name="text">
|
||||
<string>Connect to &Server</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionLocationBar">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Location</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionPathButtons">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>&Path Buttons</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="actionBulkRename">
|
||||
<property name="text">
|
||||
<string>&Bulk Rename</string>
|
||||
</property>
|
||||
<property name="toolTip">
|
||||
<string>Bulk Rename</string>
|
||||
</property>
|
||||
<property name="shortcut">
|
||||
<string>Ctrl+F2</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>PCManFM::TabBar</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>tabbar.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>PCManFM::StatusBar</class>
|
||||
<extends>QStatusBar</extends>
|
||||
<header>statusbar.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
<customwidget>
|
||||
<class>Fm::SidePane</class>
|
||||
<extends>QWidget</extends>
|
||||
<header location="global">libfm-qt/sidepane.h</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
File diff suppressed because it is too large
Load Diff
@ -1,218 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QMainWindow>
|
||||
#include <QListView>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QLineEdit>
|
||||
#include <QTabWidget>
|
||||
#include <libfm/fm.h>
|
||||
#include <QMessageBox>
|
||||
#include <QTabBar>
|
||||
#include <QStackedWidget>
|
||||
#include <QSplitter>
|
||||
#include "launcher.h"
|
||||
#include <libfm-qt/core/filepath.h>
|
||||
#include <libfm-qt/core/bookmarks.h>
|
||||
|
||||
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<TabPage*>(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<Fm::Bookmarks> bookmarks_;
|
||||
Launcher fileLauncher_;
|
||||
int rightClickIndex_;
|
||||
bool updatingViewMenu_;
|
||||
QAction* menuSep_;
|
||||
|
||||
static MainWindow* lastActive_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_MAIN_WINDOW_H
|
@ -1,29 +0,0 @@
|
||||
<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
|
||||
<node>
|
||||
<interface name="org.pcmanfm.Application">
|
||||
<method name="preferences">
|
||||
<arg type="s" direction="in"/>
|
||||
</method>
|
||||
<method name="desktopPrefrences">
|
||||
<arg type="s" direction="in"/>
|
||||
</method>
|
||||
<method name="desktopManager">
|
||||
<arg type="b" direction="in"/>
|
||||
</method>
|
||||
<method name="launchFiles">
|
||||
<arg type="s" direction="in"/>
|
||||
<arg type="as" direction="in"/>
|
||||
<arg type="b" direction="in"/>
|
||||
</method>
|
||||
<method name="quit">
|
||||
</method>
|
||||
<method name="setWallpaper">
|
||||
<arg type="s" direction="in"/>
|
||||
<arg type="s" direction="in"/>
|
||||
</method>
|
||||
<method name="findFiles">
|
||||
<arg type="as" direction="in"/>
|
||||
</method>
|
||||
<property name="desktopManagerEnabled" type="b" access="read"/>
|
||||
</interface>
|
||||
</node>
|
@ -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
|
@ -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
|
@ -1,15 +0,0 @@
|
||||
#include <libfm/fm.h>
|
||||
#include "application.h"
|
||||
#include <libfm-qt/libfmqt.h>
|
||||
|
||||
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();
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,400 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDir>
|
||||
#include <QHash>
|
||||
#include <QStringBuilder>
|
||||
#include <QSettings>
|
||||
|
||||
#include <libfm-qt/folderview.h>
|
||||
#include <libfm-qt/core/terminal.h>
|
||||
#include <libfm-qt/core/archiver.h>
|
||||
|
||||
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<QString, QString>& 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<QString, QString> 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<QString, QString>::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<Application*>(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<Application*>(qApp)->settings();
|
||||
applyDisplayPage(settings);
|
||||
applyUiPage(settings);
|
||||
applyBehaviorPage(settings);
|
||||
applyThumbnailPage(settings);
|
||||
applyVolumePage(settings);
|
||||
applyAdvancedPage(settings);
|
||||
|
||||
settings.save();
|
||||
|
||||
Application* app = static_cast<Application*>(qApp);
|
||||
app->updateFromSettings();
|
||||
}
|
||||
|
||||
void PreferencesDialog::accept() {
|
||||
applySettings();
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void PreferencesDialog::selectPage(QString name) {
|
||||
if(!name.isEmpty()) {
|
||||
QWidget* page = findChild<QWidget*>(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<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue);
|
||||
}
|
||||
else {
|
||||
disconnect(ui.hMargin, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), ui.vMargin, &QSpinBox::setValue);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace PCManFM
|
@ -1,74 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDialog>
|
||||
#include "ui_preferences.h"
|
||||
#include <QString>
|
||||
|
||||
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
|
@ -1,775 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QDir>
|
||||
#include <QFile>
|
||||
#include <QStringBuilder>
|
||||
#include <QSettings>
|
||||
#include <QApplication>
|
||||
#include "desktopwindow.h"
|
||||
#include <libfm-qt/utilities.h>
|
||||
#include <libfm-qt/folderconfig.h>
|
||||
#include <QStandardPaths>
|
||||
|
||||
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<int> & Settings::iconSizes(IconType type) {
|
||||
static const QList<int> sizes_big = {96, 72, 64, 48, 32};
|
||||
static const QList<int> sizes_thumbnail = {256, 224, 192, 160, 128, 96, 64};
|
||||
static const QList<int> 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<int> & 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
|
@ -1,982 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QObject>
|
||||
#include <libfm/fm.h>
|
||||
#include <libfm-qt/folderview.h>
|
||||
#include <libfm-qt/foldermodel.h>
|
||||
#include "desktopwindow.h"
|
||||
#include <libfm-qt/sidepane.h>
|
||||
#include <libfm-qt/core/thumbnailjob.h>
|
||||
#include <libfm-qt/core/archiver.h>
|
||||
|
||||
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<int> & 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<QString> 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<QString> 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
|
@ -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 <QPainter>
|
||||
#include <QStyleOption>
|
||||
|
||||
#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_);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -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 <QStatusBar>
|
||||
#include <QLabel>
|
||||
#include <QTimer>
|
||||
|
||||
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
|
@ -1,110 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2014 Kuzma Shapran <kuzma.shapran@gmail.com>
|
||||
|
||||
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 <QPointer>
|
||||
#include <QMouseEvent>
|
||||
#include <QApplication>
|
||||
#include <QDrag>
|
||||
#include <QMimeData>
|
||||
|
||||
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<QDrag> 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -1,55 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2014 Kuzma Shapran <kuzma.shapran@gmail.com>
|
||||
|
||||
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 <QTabBar>
|
||||
|
||||
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
|
@ -1,692 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <libfm-qt/filemenu.h>
|
||||
#include <libfm-qt/mountoperation.h>
|
||||
#include <libfm-qt/proxyfoldermodel.h>
|
||||
#include <libfm-qt/cachedfoldermodel.h>
|
||||
#include <libfm-qt/core/fileinfo.h>
|
||||
#include <libfm-qt/utilities.h>
|
||||
#include <QApplication>
|
||||
#include <QCursor>
|
||||
#include <QMessageBox>
|
||||
#include <QScrollBar>
|
||||
#include <QDir>
|
||||
#include "settings.h"
|
||||
#include "application.h"
|
||||
#include <QTimer>
|
||||
#include <QTextStream>
|
||||
#include <QDebug>
|
||||
|
||||
using namespace Fm;
|
||||
|
||||
namespace PCManFM {
|
||||
|
||||
bool ProxyFilter::filterAcceptsRow(const Fm::ProxyFolderModel* model, const std::shared_ptr<const Fm::FileInfo>& 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<Application*>(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<Application*>(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<Application*>(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<Application*>(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<Application*>(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<Application*>(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<size_t>(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<Application*>(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<Application*>(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<Application*>(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<Application*>(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<Application*>(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<Application*>(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
|
@ -1,249 +0,0 @@
|
||||
/*
|
||||
|
||||
Copyright (C) 2013 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
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 <QWidget>
|
||||
#include <QVBoxLayout>
|
||||
#include <libfm/fm.h>
|
||||
#include <libfm-qt/browsehistory.h>
|
||||
#include "view.h"
|
||||
#include "settings.h"
|
||||
|
||||
#include <libfm-qt/core/fileinfo.h>
|
||||
#include <libfm-qt/core/filepath.h>
|
||||
#include <libfm-qt/core/folder.h>
|
||||
|
||||
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<const Fm::FileInfo>& 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<Fm::Folder>& folder() {
|
||||
return folder_;
|
||||
}
|
||||
|
||||
Fm::FolderModel* folderModel() {
|
||||
return reinterpret_cast<Fm::FolderModel*>(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<Fm::Folder> 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
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[ar]=سطح المكتب
|
||||
GenericName[ar]=تفضيلات سطح المكتب
|
||||
Comment[ar]=غيّر خلفيّات مدير سطح المكتب وسلوكه
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
Name[da]=Skrivebord
|
||||
GenericName[da]=Skrivebordsindstillinger
|
||||
Comment[da]=Skift desktop managerens tapeter og adfærd
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[de]=Schreibtisch
|
||||
GenericName[de]=Schreibtischeinstellungen
|
||||
Comment[de]=Einstellungen wie Hintergrundbild oder verwendete Menüs
|
@ -1,3 +0,0 @@
|
||||
Name[el]=Επιφάνεια εργασίας
|
||||
GenericName[el]=Ρυθμίσεις της επιφάνειας εργασίας
|
||||
Comment[el]=Αλλαγή της ταπετσαρίας και της συμπεριφοράς του διαχειριστή της επιφάνειας εργασίας
|
@ -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
|
@ -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
|
@ -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
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[it]=Scrivania
|
||||
GenericName[it]=Preferenze della scrivania
|
||||
Comment[it]=Configura percorso e aspetto della scrivania
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[lt]=Darbalaukis
|
||||
GenericName[lt]=Darbalaukio nustatymai
|
||||
Comment[lt]=Keisti darbalaukio tvarkytuvės darbalaukio foną ir elgseną
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[pl]=Pulpit
|
||||
GenericName[pl]=Ustawienia pulpitu
|
||||
Comment[pl]=Zmiana tapety oraz zachowania pulpitu
|
@ -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
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[ru]=Рабочий стол
|
||||
GenericName[ru]=Настройки рабочего стола
|
||||
Comment[ru]=Изменить обои и поведение менеджера рабочего стола
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[zh_CN]=桌面
|
||||
GenericName[zh_CN]=桌面设置
|
||||
Comment[zh_CN]=更改墙纸与桌面管理器的行为。
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[ar]=مدير الملفّات PCManFM-Qt
|
||||
GenericName[ar]=مدير ملفّات
|
||||
Comment[ar]=تصفّح نظام الملفّات وأدر ملفّاتك
|
@ -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
|
@ -1,3 +0,0 @@
|
||||
Name[da]=PCManFM-Qt-filhåndtering
|
||||
GenericName[da]=Filhåndtering
|
||||
Comment[da]=Gennemse filsystemet og håndtér filerne
|
@ -1,4 +0,0 @@
|
||||
#Translations
|
||||
Name[de]=PCManFM-Qt
|
||||
GenericName[de]=Dateimanager
|
||||
Comment[de]=Dateimanager der Desktop-Umgebung LXQt
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue