Compare commits
No commits in common. "ubuntu/plucky" and "debian/0.11.1-3" have entirely different histories.
ubuntu/plu
...
debian/0.1
10
.gitignore
vendored
Normal file
10
.gitignore
vendored
Normal file
@ -0,0 +1,10 @@
|
||||
build*/
|
||||
src/translations/libfm-qt
|
||||
|
||||
# Vim.gitignore
|
||||
[._]*.s[a-w][a-z]
|
||||
[._]s[a-w][a-z]
|
||||
*.un~
|
||||
Session.vim
|
||||
.netrwhist
|
||||
*~
|
6
AUTHORS
Normal file
6
AUTHORS
Normal file
@ -0,0 +1,6 @@
|
||||
Upstream Authors:
|
||||
LXQt team: http://lxqt.org
|
||||
Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
|
||||
Copyright:
|
||||
Copyright (c) 2013-2016 LXQt team
|
344
CHANGELOG
Normal file
344
CHANGELOG
Normal file
@ -0,0 +1,344 @@
|
||||
|
||||
libfm-qt-0.11.1 / 2016-09-24
|
||||
============================
|
||||
|
||||
* Bump version to 0.11.1 (#39)
|
||||
* Fix Custom Actions Submenu (#38)
|
||||
* Extend README.md
|
||||
* Add C++ wrappers for libfm C APIs.
|
||||
* Correct positioning of small icons in icon/thumbnail mode (#32)
|
||||
* Silence new compiler warnings (#36)
|
||||
* Adapt to QT_USE_QSTRINGBUILDER macro
|
||||
* Fixes xcb linking error
|
||||
* Use LXQtCompilerSettings cmake module
|
||||
* Replaces deprecated QStyleOptionViewItemV4
|
||||
* Fix item text direction with RTL layout (#33)
|
||||
* Set tabstops for mount operation password dialog (#31)
|
||||
* Fix memory leak in file open menu (#29)
|
||||
* Fixes https://github.com/lxde/pcmanfm-qt/issues/351. (#27)
|
||||
* build: Use external translations
|
||||
* ts-file removal (#26)
|
||||
* Fix memory leaks in file menu (#25)
|
||||
* Merge pull request #24 from philippwiesemann/fix-folder-menu-leak
|
||||
* translations: fix four typos in messages (#23)
|
||||
* Fix memory leak if restoring files from trash
|
||||
* Fix rename dialog displaying source info twice
|
||||
* Enable renaming in Properties dialog Fixes https://github.com/lxde/pcmanfm-qt/issues/324.
|
||||
* Cancel indexing job when closing filepropsdialog
|
||||
* Bump year
|
||||
|
||||
0.11.0 / 2016-02-27
|
||||
===================
|
||||
|
||||
* Bump version number and ABI version and preparing for the initial release.
|
||||
* Redirect focus operation on the folderview to the actual widget
|
||||
* Use grid layout to have proper properties alignment
|
||||
* Focus automatically on the first field of the filesearch dialog
|
||||
* Add (folder) custom actions to foldermenu.
|
||||
* Update czech translation (by Petr Balíček <pbalicek@seznam.cz>)
|
||||
* Fix compiling with Qt < 5.4
|
||||
* Add supports for freedesktop Xdnd direct save (XDS) protocol (closes #pcmanfm-qt/298). * Move Xdnd workarounds from pcmanfm-qt to libfm-qt.
|
||||
* Protected FolderView methods for getting and setting item delegate margins
|
||||
* Perform auto-completion for the path bar when the user press Tab key. This closes pcmanfm-qt/#201.
|
||||
* Disable unused options in file search dialog
|
||||
* Let the style engine draw the text selection rectangle.
|
||||
* Fix file search with smaller than option
|
||||
* Fix target language in Lithuanian translation file
|
||||
* Fix memory leak if reading stream for image failed
|
||||
* Update German translation
|
||||
* Polish translation updated
|
||||
* Polish translation updated
|
||||
* Add a missing type casting to fix a compiler warning.
|
||||
* Relicense libfm-qt to LGPL v.2.1.
|
||||
* Avoid using blocking calls when initializing the trash can to speed up startup.
|
||||
* Updated Russian translation Removed ru_RU file
|
||||
* Create DnD menu with supported actions only
|
||||
* make createAction public so can be hidden from view
|
||||
* Adds Runtime and Devel install COMPONENT
|
||||
* Quote everything that could break due to whitespaces
|
||||
* Use CMake GenerateExportHeader to generate ABI header file
|
||||
* Use no exceptions also with Clang
|
||||
* Uses CMAKE_VISIBILITY and CMAKE_CXX_VISIBILITY flags
|
||||
* Use QString() instead of ""
|
||||
* Fix duplicated mtp mounts in the side pane by adding workarounds for potential bugs of gvfs.
|
||||
* Replace g_io_scheduler which is deprecated with QThread in Fm::PathEdit. * Fix compiler warnings.
|
||||
* Adds .gitignore
|
||||
* Makes Release the default BUILD_TYPE
|
||||
* Adds INSTALL package configuration file
|
||||
* Removes XCB from the dependencies
|
||||
* Adds target_include_directories() for the INSTALL_INTERFACE.
|
||||
* Removes CMAKE_CURRENT_BINARY_DIR usage
|
||||
* Removes QTX_INCLUDE_DIRS
|
||||
* Removes Qt Creator .user file
|
||||
* Updates libraries dependencies
|
||||
* Adds REQUIRED_PACKAGE_VERSION variables
|
||||
* Adds generation of TARGETS CMake file
|
||||
* Creates and installs an package version file
|
||||
* Renames and moves LIBRARY_NAME variable to the top CMakeLists
|
||||
* Removes sub-project
|
||||
* Rename the library to libfm-qt and fix installed header files.
|
||||
* Split pcmanfm-qt into two parts and move libfm-qt to its own repository.
|
||||
* Update French translation
|
||||
* Italian translation updates
|
||||
* 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.)
|
||||
* 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
|
||||
* hu translations updated
|
||||
* Fixed several problems with item selection and alignment
|
||||
* Remove unnecessary qDebug traces
|
||||
* Update translations.
|
||||
* 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.
|
||||
* Update translations
|
||||
* 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
|
||||
* PlacesView: activate on click on the second column
|
||||
* SidePane: reduce size of button's column width
|
||||
* Added a filterbar + Handle virtually hidden files
|
||||
* Russian translation update
|
||||
* Update cs_CZ translation with the strings provided by petrbal in pull request #218.
|
||||
* 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 #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)
|
||||
* Check for null pointers.
|
||||
* Select the folder from where we have gone up.
|
||||
* 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
|
||||
* Update German translation
|
||||
* 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.
|
||||
* Create New menu actions, context menu in tree side pane, #163.
|
||||
* Store side pane mode setting, #157.
|
||||
* Fixes an translation regression
|
||||
* Updates translations
|
||||
* Uses LXQt lxqt_translate_ts() to handle translations
|
||||
* 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.
|
||||
* 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.
|
||||
* Hungarian translation
|
||||
* Fix #627 - long startup time. (This blocking is caused by checking the availability of "network:///".)
|
||||
* Enable text selection in file properties dialog
|
||||
* 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.
|
||||
* Polish translations added
|
||||
* 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.
|
||||
* Add more null checks.
|
||||
* 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.
|
||||
* 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.
|
||||
* 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.
|
||||
* Support linguistic sorting of file names. This fixes #105.
|
||||
* Update the folder model & view after files are changed.
|
||||
* Open folders in new tabs by middle clicking on items in the side pane.
|
||||
* 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.
|
||||
* Add spanish translations
|
||||
* Update Japanese translation
|
||||
* Add German translation
|
||||
* add Japanese translation
|
||||
* Implement "UnTrash" for files in trash:/// and close lxde/lxqt#136.
|
||||
* 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
|
||||
* 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.: 364 of 364 strings translated (0 need review).
|
||||
* New files added from LXDE Pootle server based on templates
|
||||
* Add cs_CZ translation for libfm-qt.
|
||||
* 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).
|
||||
* Bump package version number and library soversion to prepare for 0.2 release.
|
||||
* 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.
|
||||
* 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.
|
||||
* New files added from LXDE Pootle server based on templates
|
||||
* New files added from LXDE Pootle server based on templates
|
||||
* Improve update of translations to avoid unnecessary regeneration of ts files.
|
||||
* Improve handling of fallback icons. This closes bug #57.
|
||||
* Translations are lost accidentally in a previous commit. Restore them all.
|
||||
* Fix a crash in Fm::PlacesModel when gvfs is not available. This closes bug #35 - Ctrl+W closes all windows.
|
||||
* 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.
|
||||
* Fix bug #80 - make execute in context menu doesn't do change permissions.
|
||||
* Revert "fixed selection issue #45" This patch breaks copying files by DND in icon view mode and moving desktop icons.
|
||||
* Use qss instead of QPalette to set the background color of ColorButton. This fixed bug #192 of lxde-qt.
|
||||
* Rename the library from libfm-qt to libfm-qt5 when built with Qt5.
|
||||
* fixed selection issue #45
|
||||
* 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
|
||||
* Make sure clang compiler does not complain
|
||||
* Install pkgconfig file of libfm-qt to correct location in FreeBSD
|
||||
* Fix missing return values in several methods.
|
||||
* Avoid endless popups of error dialogs when there are errors launching files.
|
||||
* Save thumbnails as png files correctly.
|
||||
* Remember custom positions for desktop icons and fix #29.
|
||||
* 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.
|
||||
* 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.
|
||||
* 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
|
||||
* 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.
|
||||
* Add a wrapper class Fm::Path for FmPath C struct.
|
||||
* 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
|
||||
* 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.
|
||||
* Add "Empty trash" and fix a memory leak.
|
||||
* Fix memory leaks for bookmarks. Fix the broken "Network" item in places.
|
||||
* 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".
|
||||
* 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.
|
||||
* 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.
|
||||
* Trivial fix.
|
||||
* Add additional custom filter support to ProxyFolderModel.
|
||||
* 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.
|
||||
* Add soname 0.0.0 for libfm-qt, preparing for 0.1 release.
|
||||
* Fix crashes caused by incorrect deletion of dialog objects.
|
||||
* Enable thumbnail related settings.
|
||||
* Update zh_TW translations and translation templates.
|
||||
* Add Portuguese translation (pt).
|
||||
* Add Lithuanian translation (lt_LT).
|
||||
* 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.
|
||||
* Fix a crash caused by accessing data for invalid model index.
|
||||
* Add basic thumbnail support (need the latest thumbnail branch of libfm).
|
||||
* 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".
|
||||
* 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 a pkgconfig file for libfm-qt for use in other projects.
|
||||
* 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.
|
||||
* 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. Change base class of SidePane to QWidget.
|
||||
* 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.
|
||||
* 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.
|
||||
* Move files for libfm-qt and pcmanfm-qt to separate subdirs.
|
115
CMakeLists.txt
Normal file
115
CMakeLists.txt
Normal file
@ -0,0 +1,115 @@
|
||||
cmake_minimum_required(VERSION 3.0.2)
|
||||
project(libfm-qt)
|
||||
|
||||
set(LIBFM_QT_LIBRARY_NAME "fm-qt" CACHE STRING "fm-qt")
|
||||
|
||||
set(LIBFM_QT_VERSION_MAJOR 0)
|
||||
set(LIBFM_QT_VERSION_MINOR 11)
|
||||
set(LIBFM_QT_VERSION_PATCH 1)
|
||||
set(LIBFM_QT_VERSION ${LIBFM_QT_VERSION_MAJOR}.${LIBFM_QT_VERSION_MINOR}.${LIBFM_QT_VERSION_PATCH})
|
||||
|
||||
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake")
|
||||
|
||||
# We use the libtool versioning scheme for the internal so name, "current:revision:age"
|
||||
# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html#Updating-version-info
|
||||
# https://www.sourceware.org/autobook/autobook/autobook_91.html
|
||||
# http://pusling.com/blog/?p=352
|
||||
# Actually, libtool uses different ways on different operating systems. So there is no
|
||||
# universal way to translate a libtool version-info to a cmake version.
|
||||
# We use "(current-age).age.revision" as the cmake version.
|
||||
# current: 3, revision: 0, age: 0 => version: 3.0.0
|
||||
set(LIBFM_QT_LIB_VERSION "3.0.0")
|
||||
set(LIBFM_QT_LIB_SOVERSION "3")
|
||||
|
||||
set(REQUIRED_QT_VERSION "5.2")
|
||||
set(REQUIRED_LIBFM_VERSION "1.2.0")
|
||||
set(REQUIRED_LIBMENUCACHE_VERSION "0.4.0")
|
||||
|
||||
if (NOT CMAKE_BUILD_TYPE)
|
||||
set(CMAKE_BUILD_TYPE Release)
|
||||
endif()
|
||||
|
||||
find_package(Qt5Widgets "${REQUIRED_QT_VERSION}" REQUIRED)
|
||||
find_package(Qt5LinguistTools "${REQUIRED_QT_VERSION}" REQUIRED)
|
||||
find_package(Qt5X11Extras "${REQUIRED_QT_VERSION}" REQUIRED)
|
||||
find_package(XCB REQUIRED)
|
||||
|
||||
#Note: no run-time dependency on liblxqt, just a build dependency for lxqt_translate_ts/desktop
|
||||
find_package(lxqt REQUIRED)
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(SYSTEM_LIBS REQUIRED
|
||||
glib-2.0
|
||||
gio-2.0
|
||||
gio-unix-2.0
|
||||
)
|
||||
|
||||
pkg_check_modules(LIBFM REQUIRED libfm>="${REQUIRED_LIBFM_VERSION}")
|
||||
pkg_check_modules(LIBMENUCACHE REQUIRED libmenu-cache>="${REQUIRED_LIBMENUCACHE_VERSION}")
|
||||
|
||||
option(UPDATE_TRANSLATIONS "Update source translation translations/*.ts files" OFF)
|
||||
include(GNUInstallDirs)
|
||||
include(GenerateExportHeader)
|
||||
include(CMakePackageConfigHelpers)
|
||||
include(LXQtTranslateTs)
|
||||
include(LXQtTranslateDesktop)
|
||||
include(LXQtCompilerSettings NO_POLICY_SCOPE)
|
||||
|
||||
add_definitions(-DQT_NO_KEYWORDS)
|
||||
|
||||
# set visibility to hidden to hide symbols, unless they're exported manually in the code
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||
set(CMAKE_VISIBILITY_INLINES_HIDDEN 1)
|
||||
|
||||
|
||||
set(CMAKE_AUTOMOC TRUE)
|
||||
set(CMAKE_INCLUDE_CURRENT_DIR ON)
|
||||
|
||||
write_basic_package_version_file(
|
||||
"${CMAKE_BINARY_DIR}/${LIBFM_QT_LIBRARY_NAME}-config-version.cmake"
|
||||
VERSION ${LIBFM_QT_LIB_VERSION}
|
||||
COMPATIBILITY AnyNewerVersion
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${CMAKE_BINARY_DIR}/${LIBFM_QT_LIBRARY_NAME}-config-version.cmake"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${LIBFM_QT_LIBRARY_NAME}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
add_subdirectory(src)
|
||||
|
||||
# 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}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
endif()
|
||||
|
||||
# building tarball with CPack -------------------------------------------------
|
||||
# To create a source distribution, type:
|
||||
# make package_source
|
||||
include(InstallRequiredSystemLibraries)
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE")
|
||||
set(CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/README.md")
|
||||
set(CPACK_PACKAGE_VENDOR "")
|
||||
set(CPACK_PACKAGE_VERSION_MAJOR ${LIBFM_QT_VERSION_MAJOR})
|
||||
set(CPACK_PACKAGE_VERSION_MINOR ${LIBFM_QT_VERSION_MINOR})
|
||||
set(CPACK_PACKAGE_VERSION_PATCH ${LIBFM_QT_VERSION_PATCH})
|
||||
set(CPACK_GENERATOR TBZ2)
|
||||
set(CPACK_SOURCE_GENERATOR TBZ2)
|
||||
set(CPACK_SOURCE_IGNORE_FILES /build/;.gitignore;.*~;.git;.kdev4;temp)
|
||||
include(CPack)
|
1890
Doxyfile.in
Normal file
1890
Doxyfile.in
Normal file
File diff suppressed because it is too large
Load Diff
458
LICENSE
Normal file
458
LICENSE
Normal file
@ -0,0 +1,458 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 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.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
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 and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, 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 library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete 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 distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
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 Library or any portion
|
||||
of it, thus forming a work based on the Library, 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) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
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 Library, 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 Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you 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.
|
||||
|
||||
If distribution of 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 satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be 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.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library 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.
|
||||
|
||||
9. 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 Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
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 with
|
||||
this License.
|
||||
|
||||
11. 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 Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library 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 Library.
|
||||
|
||||
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.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library 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.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser 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 Library
|
||||
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 Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
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
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "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
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. 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 LIBRARY 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
|
||||
LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
27
README.md
Normal file
27
README.md
Normal file
@ -0,0 +1,27 @@
|
||||
# libfm-qt
|
||||
|
||||
## Overview
|
||||
|
||||
libfm-qt is the Qt port of libfm, a library providing components to build desktop file managers which belongs to [LXDE](http://lxde.org).
|
||||
|
||||
libfm-qt is licensed under the terms of the [LGPLv2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html) or any later version. See file LICENSE for its full text.
|
||||
|
||||
## Installation
|
||||
|
||||
### Compiling source code
|
||||
|
||||
Runtime dependencies are qtx11extras and libfm ≥ 1,2 (not all features are provided by libfm-qt yet).
|
||||
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/lxde/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) and openSUSE (Leap 42.1 and Tumbleweed).
|
||||
The library is still missing in Fedora which is providing version 0.10.0 of PCManFM-Qt only so far. This version was still including the code outsourced into libfm-qt later so libfm-qt will have to be provided by Fedora, too, as soon as the distribution upgrades to PCManFM-Qt ≥ 0.10.1.
|
||||
|
||||
## Development
|
||||
|
||||
Issues should go to the tracker of PCManFM-Qt at https://github.com/lxde/pcmanfm-qt/issues.
|
53
cmake/FindXCB.cmake
Normal file
53
cmake/FindXCB.cmake
Normal file
@ -0,0 +1,53 @@
|
||||
#.rst:
|
||||
# FindXCB
|
||||
# -------
|
||||
#
|
||||
# Find XCB libraries
|
||||
#
|
||||
# Tries to find xcb libraries on unix systems.
|
||||
#
|
||||
# - Be sure to set the COMPONENTS to the components you want to link to
|
||||
# - The XCB_LIBRARIES variable is set ONLY to your COMPONENTS list
|
||||
# - To use only a specific component check the XCB_LIBRARIES_${COMPONENT} variable
|
||||
#
|
||||
# The following values are defined
|
||||
#
|
||||
# ::
|
||||
#
|
||||
# XCB_FOUND - True if xcb is available
|
||||
# XCB_INCLUDE_DIRS - Include directories for xcb
|
||||
# XCB_LIBRARIES - List of libraries for xcb
|
||||
# XCB_DEFINITIONS - List of definitions for xcb
|
||||
#
|
||||
#=============================================================================
|
||||
# Copyright (c) 2015 Jari Vetoniemi
|
||||
#
|
||||
# Distributed under the OSI-approved BSD License (the "License");
|
||||
#
|
||||
# This software is distributed WITHOUT ANY WARRANTY; without even the
|
||||
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
# See the License for more information.
|
||||
#=============================================================================
|
||||
|
||||
include(FeatureSummary)
|
||||
set_package_properties(XCB PROPERTIES
|
||||
URL "http://xcb.freedesktop.org/"
|
||||
DESCRIPTION "X protocol C-language Binding")
|
||||
|
||||
find_package(PkgConfig)
|
||||
pkg_check_modules(PC_XCB QUIET xcb ${XCB_FIND_COMPONENTS})
|
||||
|
||||
find_library(XCB_LIBRARIES xcb HINTS ${PC_XCB_LIBRARY_DIRS})
|
||||
find_path(XCB_INCLUDE_DIRS xcb/xcb.h PATH_SUFFIXES xcb HINTS ${PC_XCB_INCLUDE_DIRS})
|
||||
|
||||
foreach(COMPONENT ${XCB_FIND_COMPONENTS})
|
||||
find_library(XCB_LIBRARIES_${COMPONENT} ${COMPONENT} HINTS ${PC_XCB_LIBRARY_DIRS})
|
||||
list(APPEND XCB_LIBRARIES ${XCB_LIBRARIES_${COMPONENT}})
|
||||
mark_as_advanced(XCB_LIBRARIES_${COMPONENT})
|
||||
endforeach(COMPONENT ${XCB_FIND_COMPONENTS})
|
||||
|
||||
set(XCB_DEFINITIONS ${PC_XCB_CFLAGS_OTHER})
|
||||
|
||||
include(FindPackageHandleStandardArgs)
|
||||
find_package_handle_standard_args(XCB DEFAULT_MSG XCB_LIBRARIES XCB_INCLUDE_DIRS)
|
||||
mark_as_advanced(XCB_INCLUDE_DIRS XCB_LIBRARIES XCB_DEFINITIONS)
|
63
cmake/fm-qt-config.cmake.in
Normal file
63
cmake/fm-qt-config.cmake.in
Normal file
@ -0,0 +1,63 @@
|
||||
#=============================================================================
|
||||
# Copyright 2015 Luís Pereira <luis.artur.pereira@gmail.com>
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. The name of the author may not be used to endorse or promote products
|
||||
# derived from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
||||
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#=============================================================================
|
||||
|
||||
@PACKAGE_INIT@
|
||||
|
||||
if (CMAKE_VERSION VERSION_LESS 3.0.2)
|
||||
message(FATAL_ERROR \"fm-qt requires at least CMake version 3.0.2\")
|
||||
endif()
|
||||
|
||||
include(CMakeFindDependencyMacro)
|
||||
|
||||
find_dependency(Qt5Widgets "@REQUIRED_QT_VERSION@")
|
||||
find_dependency(Qt5X11Extras "@REQUIRED_QT_VERSION@")
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
pkg_check_modules(PKG_GLIB glib-2.0)
|
||||
pkg_check_modules(PKG_GIO
|
||||
gio-2.0
|
||||
gio-unix-2.0
|
||||
)
|
||||
|
||||
pkg_check_modules(PKG_FM REQUIRED libfm>=@REQUIRED_LIBFM_VERSION@)
|
||||
pkg_check_modules(PKG_MENUCACHE REQUIRED libmenu-cache>=@REQUIRED_LIBMENUCACHE_VERSION@)
|
||||
|
||||
if (NOT TARGET @LIBFM_QT_LIBRARY_NAME@)
|
||||
include("${CMAKE_CURRENT_LIST_DIR}/@LIBFM_QT_LIBRARY_NAME@-targets.cmake")
|
||||
set_property(TARGET "@LIBFM_QT_LIBRARY_NAME@" APPEND PROPERTY
|
||||
INTERFACE_INCLUDE_DIRECTORIES
|
||||
"${PKG_GLIB_INCLUDE_DIRS}"
|
||||
"${PKG_GIO_INCLUDE_DIRS}"
|
||||
"${PKG_FM_INCLUDE_DIRS}"
|
||||
"${PKG_MENUCACHE_INCLUDE_DIRS}"
|
||||
)
|
||||
set_property(TARGET "@LIBFM_QT_LIBRARY_NAME@" APPEND PROPERTY
|
||||
INTERFACE_COMPILE_DEFINITIONS
|
||||
"QT_NO_KEYWORDS"
|
||||
"LIBFM_DATA_DIR=\"${PKG_FM_PREFIX}/share/libfm\""
|
||||
)
|
||||
endif()
|
548
debian/changelog
vendored
548
debian/changelog
vendored
@ -1,551 +1,3 @@
|
||||
libfm-qt (2.1.0-0ubuntu7) plucky; urgency=medium
|
||||
|
||||
* Update Standards-Version to 4.7.1, no changes needed.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 21 Feb 2025 16:22:38 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu6) plucky; urgency=medium
|
||||
|
||||
* Add a Provides: libfm-qt6 line, to make it easier to track and use in
|
||||
reverse dependencies.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Sun, 16 Feb 2025 18:59:48 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu5) plucky; urgency=medium
|
||||
|
||||
* No-change rebuild for Qt 6.8.2.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Mon, 03 Feb 2025 11:33:27 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu4) plucky; urgency=medium
|
||||
|
||||
* No-change rebuild for lxqt-build-tools C++17 -> C++20.
|
||||
* Update symbols from build logs.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 03 Jan 2025 03:53:09 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu3) plucky; urgency=medium
|
||||
|
||||
* No-change rebuild for Qt 6.8.1.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 04 Dec 2024 14:32:17 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu2) plucky; urgency=medium
|
||||
|
||||
* No-change rebuild for Qt 6.8.0.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 04 Dec 2024 14:32:17 -0600
|
||||
|
||||
libfm-qt (2.1.0-0ubuntu1) plucky; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
- Bump build dependencies.
|
||||
- Update symbols from amd64 build logs.
|
||||
* Add new build dependencies from the CMake output.
|
||||
* Make the package Lintian-clean.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 15 Nov 2024 15:31:59 -0600
|
||||
|
||||
libfm-qt (2.0.2-0ubuntu3) plucky; urgency=medium
|
||||
|
||||
* No-change rebuild against Qt 6.7.2 private-abi.
|
||||
|
||||
-- Rik Mills <rikmills@kde.org> Thu, 17 Oct 2024 17:52:48 +0100
|
||||
|
||||
libfm-qt (2.0.2-0ubuntu2) oracular; urgency=medium
|
||||
|
||||
* Fix symbols file.
|
||||
|
||||
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Sun, 25 Aug 2024 22:22:47 -0500
|
||||
|
||||
libfm-qt (2.0.2-0ubuntu1) oracular; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Bump Standards-Version to 4.7.0, no changes necessary.
|
||||
* Update copyright file.
|
||||
* Bump build deps.
|
||||
* Change binary package name to libfm-qt6.
|
||||
* Update symbols file.
|
||||
|
||||
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Thu, 15 Aug 2024 16:06:46 -0500
|
||||
|
||||
libfm-qt (1.4.0-0ubuntu1) noble; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Reorganized and fixed copyright file.
|
||||
* Added lxqt-menu-data as a build dependency.
|
||||
* Bumped soname to libfm-qt14.
|
||||
* Updated symbols file.
|
||||
|
||||
-- Aaron Rainbolt <arraybolt3@gmail.com> Sun, 05 Nov 2023 17:15:40 -0600
|
||||
|
||||
libfm-qt (1.3.0-0ubuntu2) mantic; urgency=medium
|
||||
|
||||
* Update symbols from build logs.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Fri, 11 Aug 2023 10:16:27 -0500
|
||||
|
||||
libfm-qt (1.3.0-0ubuntu1) mantic; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
- Bump build dependency accordingly.
|
||||
* Rename binary package for SONAME change, update symbols accordingly.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 26 Jul 2023 16:25:53 -0500
|
||||
|
||||
libfm-qt (1.2.1-0ubuntu1) lunar; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Updated copyright file.
|
||||
* Bumped Standards-Version to 4.6.2, no changes necessary.
|
||||
* Updated symbols file.
|
||||
* Ran wrap-and-sort.
|
||||
|
||||
-- Aaron Rainbolt <arraybolt3@ubuntu.com> Thu, 26 Jan 2023 20:18:59 -0600
|
||||
|
||||
libfm-qt (1.2.0-0ubuntu3) lunar; urgency=medium
|
||||
|
||||
* No-change rebuild against Qt 5.15.8.
|
||||
|
||||
-- Dmitry Shachnev <mitya57@ubuntu.com> Sat, 14 Jan 2023 10:19:25 +0300
|
||||
|
||||
libfm-qt (1.2.0-0ubuntu2) lunar; urgency=medium
|
||||
|
||||
* No-change rebuild against Qt 5.15.7.
|
||||
|
||||
-- Dmitry Shachnev <mitya57@ubuntu.com> Sat, 10 Dec 2022 12:50:58 +0300
|
||||
|
||||
libfm-qt (1.2.0-0ubuntu1) lunar; urgency=medium
|
||||
|
||||
* New upstream release.
|
||||
* Fix the watch file, for real this time.
|
||||
* Lubuntuify the package slightly, to make debhelper happy.
|
||||
* Remove reverse-applicable upstream patches.
|
||||
* Bump build dependencies to the latest upstream LXQt versions.
|
||||
* Rename libfm-qt11 -> libfm-qt12 and add necessary Breaks/Replaces.
|
||||
* Update symbols from amd64 build logs.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Wed, 16 Nov 2022 19:21:46 -0600
|
||||
|
||||
libfm-qt (1.1.0-3ubuntu1) kinetic; urgency=medium
|
||||
|
||||
* Revert the previous upload.
|
||||
* Make Breaks/Replaces stricter for libfm-qt11 on libfm-qt-common due to the
|
||||
nature of the reverted upload.
|
||||
|
||||
-- Simon Quigley <tsimonq2@ubuntu.com> Mon, 10 Oct 2022 11:06:03 -0500
|
||||
|
||||
libfm-qt (1.1.0-2ubuntu1) kinetic; urgency=medium
|
||||
|
||||
* Update debian/libfm-qt11.symbols for GCC 12.
|
||||
|
||||
-- Dmitry Shachnev <mitya57@ubuntu.com> Sat, 13 Aug 2022 21:37:11 +0300
|
||||
|
||||
libfm-qt (1.1.0-2) experimental; urgency=medium
|
||||
|
||||
* Upstreamed compatible changes from Ubuntu, modifying the following files:
|
||||
- control
|
||||
- copyright
|
||||
- libfm-qt11.symbols
|
||||
- libfm-qt-common.install
|
||||
- libfm-qt-dev.install
|
||||
- rules
|
||||
- upstream/*
|
||||
- patches directory
|
||||
|
||||
-- Aaron Rainbolt <arraybolt3@gmail.com> Thu, 14 Jul 2022 15:45:41 -0500
|
||||
|
||||
libfm-qt (1.1.0-1) experimental; urgency=medium
|
||||
|
||||
* debian/changelog: fix a typo.
|
||||
* New upstream version 1.0.0
|
||||
* Add debian/salsa-ci.yml file.
|
||||
* Update debian/upstream/signing-key.asc.
|
||||
* New upstream version 1.1.0
|
||||
* debian/control: build-deps on lxqt-build-tools (>=0.11.0~).
|
||||
* Bump to libfm-qt11 to match soname changes.
|
||||
* debian/libfm-qt11.shlibs: Added, restrict to latest upstream version.
|
||||
* Drop C++ symbols according to
|
||||
https://wiki.debian.org/UsingSymbolsFiles.
|
||||
|
||||
-- Andrew Lee (李健秋) <ajqlee@debian.org> Tue, 12 Jul 2022 22:33:35 +0800
|
||||
|
||||
libfm-qt (0.16.0-3) unstable; urgency=high
|
||||
|
||||
* Update symbols for armel, armhf, i386, mipsel and s390x to fix FTBFS.
|
||||
|
||||
-- Andrew Lee (李健秋) <ajqlee@debian.org> Sat, 09 Jan 2021 03:15:46 +0800
|
||||
|
||||
libfm-qt (0.16.0-2) unstable; urgency=medium
|
||||
|
||||
* Source only upload.
|
||||
|
||||
-- Andrew Lee (李健秋) <ajqlee@debian.org> Wed, 06 Jan 2021 21:31:49 +0800
|
||||
|
||||
libfm-qt (0.16.0-1) unstable; urgency=medium
|
||||
|
||||
* New upstream release. (Closes: #978219)
|
||||
* Drop fixed upstream patches.
|
||||
* Bump to libfm-qt8 to match soname changes.
|
||||
* Refresh debian/libfm-qt8.symbols file.
|
||||
|
||||
-- Andrew Lee (李健秋) <ajqlee@debian.org> Wed, 06 Jan 2021 04:30:38 +0800
|
||||
|
||||
libfm-qt (0.14.1-12.2) unstable; urgency=medium
|
||||
|
||||
* Non-maintainer upload.
|
||||
* Update symbols files from buildds’ logs to fix FTBFS on armel.
|
||||
|
||||
-- Dmitry Shachnev <mitya57@debian.org> Fri, 23 Oct 2020 20:28:57 +0300
|
||||
|
||||
libfm-qt (0.14.1-12.1) unstable; urgency=medium
|
||||
|
||||
* Non-maintainer upload.
|
||||
* Update symbols files for GCC 10 (closes: #957436).
|
||||
|
||||
-- Dmitry Shachnev <mitya57@debian.org> Sat, 17 Oct 2020 20:11:39 +0300
|
||||
|
||||
libfm-qt (0.14.1-12) unstable; urgency=medium
|
||||
|
||||
* Fixed symbol QRegEx -> QRegularExpression
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Tue, 22 Oct 2019 23:52:39 +0200
|
||||
|
||||
libfm-qt (0.14.1-11) unstable; urgency=medium
|
||||
|
||||
* Bumped Standards to 4.4.1, no changes needed
|
||||
* Switched to gbp, gbp.conf added
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 05 Oct 2019 12:56:09 +0200
|
||||
|
||||
libfm-qt (0.14.1-10) unstable; urgency=medium
|
||||
|
||||
* Fixed symbols for gcc 9.2.1 (Closes: #925742)
|
||||
* Bumped Standards to 4.4.0, no changes needed
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 17 Aug 2019 13:00:08 +0200
|
||||
|
||||
libfm-qt (0.14.1-9) unstable; urgency=medium
|
||||
|
||||
* Added upstream patch workaround-missed-file-monitoring.patch
|
||||
(Closes: #926803)
|
||||
* Added two new symbols - internal use only
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 08 Jun 2019 16:39:11 +0200
|
||||
|
||||
libfm-qt (0.14.1-8) unstable; urgency=medium
|
||||
|
||||
* Removed the wrongly introduced build dependency on lxqt-qtplugin
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 27 Apr 2019 18:40:25 +0200
|
||||
|
||||
libfm-qt (0.14.1-7) unstable; urgency=medium
|
||||
|
||||
* Workaround for GLib's recursive moving error (Closes: #927708)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 27 Apr 2019 10:50:16 +0200
|
||||
|
||||
libfm-qt (0.14.1-6) unstable; urgency=medium
|
||||
|
||||
* Fixed ignored creation-deletion sequences (Closes: #927707)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 21 Apr 2019 20:50:23 +0200
|
||||
|
||||
libfm-qt (0.14.1-5) unstable; urgency=medium
|
||||
|
||||
* Fixed license for vfs-search.c and vfs-menu.c - was forgotten upstream.
|
||||
* Fixed d/copyright that way.
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 18 Apr 2019 20:52:30 +0200
|
||||
|
||||
libfm-qt (0.14.1-4) unstable; urgency=medium
|
||||
|
||||
* Fix recursive copy to smb shares (and possible other remote filesystems)
|
||||
(Closes: #926626)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Mon, 08 Apr 2019 19:03:43 +0200
|
||||
|
||||
libfm-qt (0.14.1-3) unstable; urgency=medium
|
||||
|
||||
* Fixed the remaining symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 01 Mar 2019 01:34:43 +0100
|
||||
|
||||
libfm-qt (0.14.1-2) unstable; urgency=medium
|
||||
|
||||
* Fixed new and optional symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Tue, 26 Feb 2019 22:07:40 +0100
|
||||
|
||||
libfm-qt (0.14.1-1) unstable; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.14.1.
|
||||
* Fixed some symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 24 Feb 2019 19:31:01 +0100
|
||||
|
||||
libfm-qt (0.14.0-3) unstable; urgency=medium
|
||||
|
||||
* Switched to unstable
|
||||
* Fixed some more symbols
|
||||
* Ported back some upstream patches
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Tue, 05 Feb 2019 20:11:09 +0100
|
||||
|
||||
libfm-qt (0.14.0-2) experimental; urgency=medium
|
||||
|
||||
* Fixed a bunch of symbols for misc. architectures.
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 02 Feb 2019 17:46:02 +0100
|
||||
|
||||
libfm-qt (0.14.0-1) experimental; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.14.0.
|
||||
* Switched to experimental
|
||||
* Bumped Standards to 4.3.0, no changes needed
|
||||
* Dropped d/compat, use debhelper-compat = 12, no changes needed
|
||||
* Fixed years in d/copyright
|
||||
* Bumped minimum version lxqt-build-tools (>= 0.6.0~)
|
||||
* Removed obsolete PULL_TRANSLATIONS= OFF from dh_auto_configure
|
||||
* Removed obsolete build dependency libfm-dev
|
||||
* Added Build-Depends-Package field to symbols
|
||||
* Added l10n-package, moved from lxqt-l10n
|
||||
* Fixed symbols file for 0.14.0
|
||||
* Added d/upstream/metadata
|
||||
* Added new files do debian/copyright
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Wed, 30 Jan 2019 20:32:59 +0100
|
||||
|
||||
libfm-qt (0.13.1-10) unstable; urgency=medium
|
||||
|
||||
* Added Build-Depends-Package: libfm-qt-dev to libfm-qt-dev.symbols
|
||||
* Bumped Standards to 4.2.1
|
||||
* Fixed the first symbols (Closes: #916158)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 28 Dec 2018 16:41:09 +0100
|
||||
|
||||
libfm-qt (0.13.1-9) unstable; urgency=medium
|
||||
|
||||
* Fixed armel and riscv symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 31 Aug 2018 19:35:35 +0200
|
||||
|
||||
libfm-qt (0.13.1-8) unstable; urgency=medium
|
||||
|
||||
* Fixed missed blank in symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 31 Aug 2018 00:51:51 +0200
|
||||
|
||||
libfm-qt (0.13.1-7) unstable; urgency=medium
|
||||
|
||||
* Fixed another bunch of symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 30 Aug 2018 22:36:25 +0200
|
||||
|
||||
libfm-qt (0.13.1-6) unstable; urgency=medium
|
||||
|
||||
* Fixed a bunch of symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Tue, 31 Jul 2018 18:15:12 +0200
|
||||
|
||||
libfm-qt (0.13.1-5) unstable; urgency=medium
|
||||
|
||||
* Switch to unstable
|
||||
* Another round of symbol fixes
|
||||
* Bumped Standards to 4.1.5, no changes needed
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 07 Jul 2018 13:05:18 +0200
|
||||
|
||||
libfm-qt (0.13.1-4) experimental; urgency=medium
|
||||
|
||||
* Fixed some more symbols in architectures
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 29 Jun 2018 19:34:00 +0200
|
||||
|
||||
libfm-qt (0.13.1-3) experimental; urgency=medium
|
||||
|
||||
* Fixed some powerpcspe symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 28 Jun 2018 01:22:45 +0200
|
||||
|
||||
libfm-qt (0.13.1-2) experimental; urgency=medium
|
||||
|
||||
* Added dependency libglib2.0-bin (Closes: #902053)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 23 Jun 2018 14:45:18 +0200
|
||||
|
||||
libfm-qt (0.13.1-1) experimental; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.13.1.
|
||||
* Fixed some symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 03 Jun 2018 01:30:24 +0200
|
||||
|
||||
libfm-qt (0.13.0-2) experimental; urgency=medium
|
||||
|
||||
* Fixed the first big bunch of symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Mon, 28 May 2018 19:36:36 +0200
|
||||
|
||||
libfm-qt (0.13.0-1) experimental; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.13.0.
|
||||
* Removed build dependency libglib2.0-dev, thrown in via lxqt-build-tools
|
||||
* Bumped build dependency lxqt-build-tools to >= 0.5.0~
|
||||
* Renamed libfm-qt3 -> libfm-qt5. soname bumped
|
||||
* Added Breaks and replaces for libfm-qt3
|
||||
* Bumped years in copyright
|
||||
* Messed around with symbols (gcc7/gcc8, removals, new symbols)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Wed, 23 May 2018 23:02:00 +0200
|
||||
|
||||
libfm-qt (0.12.0-17) unstable; urgency=medium
|
||||
|
||||
* Fixed symbols for ia64
|
||||
* Fixed watch file to lxqt
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 29 Apr 2018 02:31:23 +0200
|
||||
|
||||
libfm-qt (0.12.0-16) unstable; urgency=medium
|
||||
|
||||
* fix some typos in symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Mon, 23 Apr 2018 02:07:46 +0200
|
||||
|
||||
libfm-qt (0.12.0-15) unstable; urgency=medium
|
||||
|
||||
* Added missed symbols (Closes: #896514)
|
||||
* Bumped debhelper build dependency to 11~
|
||||
* Bumped compat to 11
|
||||
* Bumped Standards to 4.1.4
|
||||
* Fixed VCS fields for salsa
|
||||
* Fixed upstream homepage
|
||||
* Fixed years and source in copyright
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 22 Apr 2018 22:39:57 +0200
|
||||
|
||||
libfm-qt (0.12.0-14) unstable; urgency=medium
|
||||
|
||||
* Bumped Standards to 4.1.2, no changes needed
|
||||
* Removed branch from VCS fields
|
||||
* Removed debian/gbp.conf
|
||||
* Removed trailing whitespaces
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Wed, 13 Dec 2017 20:08:02 +0100
|
||||
|
||||
libfm-qt (0.12.0-13) unstable; urgency=medium
|
||||
|
||||
* Transition to unstable
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Mon, 04 Dec 2017 18:41:41 +0100
|
||||
|
||||
libfm-qt (0.12.0-12) experimental; urgency=medium
|
||||
|
||||
* finally fixed the symbols for the very most architectures
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Fri, 01 Dec 2017 20:51:49 +0100
|
||||
|
||||
libfm-qt (0.12.0-11) experimental; urgency=medium
|
||||
|
||||
* added new symbol to mips64el
|
||||
* added and fixed a bunch of armel symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 05 Nov 2017 00:27:13 +0100
|
||||
|
||||
libfm-qt (0.12.0-10) experimental; urgency=medium
|
||||
|
||||
* fixed symbols for mips64el
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 04 Nov 2017 17:55:04 +0100
|
||||
|
||||
libfm-qt (0.12.0-9) experimental; urgency=medium
|
||||
|
||||
* next round of symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 29 Oct 2017 02:59:13 +0200
|
||||
|
||||
libfm-qt (0.12.0-8) experimental; urgency=medium
|
||||
|
||||
* introduced two optional symbols
|
||||
* fixed sh4 symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sat, 28 Oct 2017 17:45:54 +0200
|
||||
|
||||
libfm-qt (0.12.0-7) experimental; urgency=medium
|
||||
|
||||
* Some more symbol fixes for armel, armhf, mips, mipsel. hppa, m68k,
|
||||
ppc64 and sh4
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 26 Oct 2017 16:30:32 +0200
|
||||
|
||||
libfm-qt (0.12.0-6) experimental; urgency=medium
|
||||
|
||||
* Fixed symbols for arm64, ppc64el, s390x, hppa, powerpc, ppc64 and sparc64
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 26 Oct 2017 02:56:20 +0200
|
||||
|
||||
libfm-qt (0.12.0-5) experimental; urgency=medium
|
||||
|
||||
* Symbol fixes for i386 - this will introduce regressions for other
|
||||
architectures
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 26 Oct 2017 00:57:28 +0200
|
||||
|
||||
libfm-qt (0.12.0-4) experimental; urgency=medium
|
||||
|
||||
* Symbol fixes for armel, mipsel, hurd-i386, x32
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Tue, 24 Oct 2017 23:49:03 +0200
|
||||
|
||||
libfm-qt (0.12.0-3) experimental; urgency=medium
|
||||
|
||||
* Next round of fixed symbols
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Mon, 23 Oct 2017 01:29:24 +0200
|
||||
|
||||
libfm-qt (0.12.0-2) experimental; urgency=medium
|
||||
|
||||
* Fixed symbols for arm64 armhf i386 mips ppc64el alpha powerpc ppc64 sparc64
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 22 Oct 2017 20:42:08 +0200
|
||||
|
||||
libfm-qt (0.12.0-1) experimental; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.12.0.
|
||||
* Switched to experimental
|
||||
* Bumped Standards to 4.1.1
|
||||
* Fixed Symbols
|
||||
* Added build dependency libexif-dev
|
||||
* Added dependencies libexif-dev and libmenu-cache-dev to libfm-qt-dev
|
||||
* Added override for dh_missing
|
||||
* Bumped years in copyright
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 22 Oct 2017 16:34:45 +0200
|
||||
|
||||
libfm-qt (0.11.2-2) unstable; urgency=medium
|
||||
|
||||
* Bumped Standards to 4.0.0
|
||||
* Added dependency shared-mime-info (Closes: #866901)
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Sun, 02 Jul 2017 23:01:43 +0200
|
||||
|
||||
libfm-qt (0.11.2-1) unstable; urgency=medium
|
||||
|
||||
* Cherry-picking upstream release 0.11.2
|
||||
* Added new symbols
|
||||
* Removed build dependencies:
|
||||
- cmake
|
||||
- liblxqt0-dev
|
||||
- libqt5xdg-dev
|
||||
- pkg-config
|
||||
- qttools5-dev
|
||||
- qttools5-dev-tools
|
||||
* Added build dependency lxqt-build-tools
|
||||
* Added build dependency libfm-dev to libfm-qt-dev
|
||||
* Removed models.patch, applied upstream
|
||||
|
||||
-- Alf Gaida <agaida@siduction.org> Thu, 22 Dec 2016 01:32:58 +0100
|
||||
|
||||
libfm-qt (0.11.1-3) unstable; urgency=medium
|
||||
|
||||
* Backported a upstream fix for Icon Emblem Support.
|
||||
|
1
debian/compat
vendored
Normal file
1
debian/compat
vendored
Normal file
@ -0,0 +1 @@
|
||||
10
|
119
debian/control
vendored
119
debian/control
vendored
@ -1,73 +1,44 @@
|
||||
Source: libfm-qt
|
||||
Maintainer: Lubuntu Developers <lubuntu-devel@lists.ubuntu.com>
|
||||
Original-Maintainer: LXQt Packaging Team <pkg-lxqt-devel@lists.alioth.debian.org>
|
||||
Maintainer: LXQt Packaging Team <pkg-lxqt-devel@lists.alioth.debian.org>
|
||||
Uploaders: Alf Gaida <agaida@siduction.org>,
|
||||
ChangZhuo Chen (陳昌倬) <czchen@debian.org>,
|
||||
Andrew Lee (李健秋) <ajqlee@debian.org>,
|
||||
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>,
|
||||
Simon Quigley <tsimonq2@debian.org>,
|
||||
Aaron Rainbolt <arraybolt3@gmail.com>
|
||||
Shih-Yuan Lee (FourDollars) <fourdollars@gmail.com>
|
||||
Section: x11
|
||||
Priority: optional
|
||||
Build-Depends: debhelper-compat (= 13),
|
||||
libexif-dev,
|
||||
Build-Depends: debhelper (>= 10),
|
||||
cmake (>= 3.0.2),
|
||||
libfm-dev (>= 1.2.0),
|
||||
libglib2.0-dev,
|
||||
libkf5windowsystem-dev,
|
||||
liblxqt0-dev ( >= 0.11.0),
|
||||
libmenu-cache-dev,
|
||||
libqt5svg5-dev,
|
||||
libqt5x11extras5-dev,
|
||||
libqt5xdg-dev (>= 2.0.0),
|
||||
libx11-dev,
|
||||
libxcb-composite0-dev,
|
||||
libxcb-cursor-dev,
|
||||
libxcb-damage0-dev,
|
||||
libxcb-dpms0-dev,
|
||||
libxcb-dri2-0-dev,
|
||||
libxcb-dri3-dev,
|
||||
libxcb-ewmh-dev,
|
||||
libxcb-glx0-dev,
|
||||
libxcb-icccm4-dev,
|
||||
libxcb-image0-dev,
|
||||
libxcb-keysyms1-dev,
|
||||
libxcb-present-dev,
|
||||
libxcb-randr0-dev,
|
||||
libxcb-record0-dev,
|
||||
libxcb-render-util0-dev,
|
||||
libxcb-render0-dev,
|
||||
libxcb-res0-dev,
|
||||
libxcb-screensaver0-dev,
|
||||
libxcb-shape0-dev,
|
||||
libxcb-shm0-dev,
|
||||
libxcb-sync-dev,
|
||||
libxcb-util-dev,
|
||||
libxcb-xf86dri0-dev,
|
||||
libxcb-xfixes0-dev,
|
||||
libxcb-xinerama0-dev,
|
||||
libxcb-xinput-dev,
|
||||
libxcb-xkb-dev,
|
||||
libxcb-xtest0-dev,
|
||||
libxcb-xv0-dev,
|
||||
libxcb-xvmc0-dev,
|
||||
lxqt-build-tools (>= 2.1.0),
|
||||
lxqt-menu-data (>= 2.1.0),
|
||||
qt6-base-private-dev (>= 6.6.0),
|
||||
qt6-svg-dev (>= 6.6.0)
|
||||
Standards-Version: 4.7.1
|
||||
Vcs-Browser: https://git.lubuntu.me/Lubuntu/libfm-qt-packaging
|
||||
Vcs-Git: https://git.lubuntu.me/Lubuntu/libfm-qt-packaging.git
|
||||
Debian-Vcs-Browser: https://salsa.debian.org/lxqt-team/libfm-qt
|
||||
Debian-Vcs-Git: https://salsa.debian.org/lxqt-team/libfm-qt.git
|
||||
Homepage: https://github.com/lxqt/libfm-qt
|
||||
Rules-Requires-Root: no
|
||||
pkg-config,
|
||||
qtbase5-private-dev,
|
||||
qttools5-dev,
|
||||
qttools5-dev-tools
|
||||
Standards-Version: 3.9.8
|
||||
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/libfm-qt.git/?h=debian/sid
|
||||
Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/libfm-qt.git -b debian/sid
|
||||
Homepage: https://github.com/lxde/libfm-qt
|
||||
|
||||
Package: libfm-qt6-15
|
||||
Provides: libfm-qt6 (= 15)
|
||||
Replaces: libfm-qt14, libfm-qt6-14
|
||||
Breaks: libfm-qt14, libfm-qt6-14
|
||||
Package: libfm-qt3
|
||||
Provides: libfm-qt
|
||||
Conflicts: libfm-qt
|
||||
Replaces: libfm-qt5-2,
|
||||
libfm-qt2
|
||||
Breaks: libfm-qt5-2,
|
||||
libfm-qt2
|
||||
Architecture: any
|
||||
Multi-Arch: same
|
||||
Section: libs
|
||||
Depends: libfm-qt6-common,
|
||||
libglib2.0-bin,
|
||||
shared-mime-info,
|
||||
${misc:Depends},
|
||||
Depends: ${misc:Depends},
|
||||
${shlibs:Depends}
|
||||
Recommends: libfm-qt6-l10n
|
||||
Recommends: libfm-qt-l10n
|
||||
Pre-Depends: ${misc:Pre-Depends}
|
||||
Description: file management support for pcmanfm-qt
|
||||
Libfm-Qt is a companion library providing components to build desktop file
|
||||
@ -75,39 +46,15 @@ Description: file management support for pcmanfm-qt
|
||||
.
|
||||
This package contains helper library libfm-qt for pcmanfm-qt.
|
||||
|
||||
Package: libfm-qt6-common
|
||||
Architecture: all
|
||||
Multi-Arch: foreign
|
||||
Section: libs
|
||||
Depends: ${misc:Depends}
|
||||
Breaks: libfm-qt14
|
||||
Replaces: libfm-qt14
|
||||
Description: Common files for libfm-qt
|
||||
Libfm-Qt is a companion library providing components to build desktop file
|
||||
managers.
|
||||
.
|
||||
This package contains common files for libfm-qt.
|
||||
|
||||
Package: libfm-qt6-dev
|
||||
Package: libfm-qt-dev
|
||||
Replaces: libfm-qt5-dev
|
||||
Breaks: libfm-qt5-dev
|
||||
Architecture: any
|
||||
Section: libdevel
|
||||
Depends: libexif-dev,
|
||||
libfm-qt6-15 (= ${binary:Version}),
|
||||
libmenu-cache-dev,
|
||||
${misc:Depends}
|
||||
Depends: ${misc:Depends},
|
||||
libfm-qt3 (= ${binary:Version})
|
||||
Description: file management support library for pcmanfm-qt (development files)
|
||||
Libfm-Qt is a companion library providing components to build desktop file
|
||||
managers.
|
||||
.
|
||||
This package contains development files for helper library libfm-qt.
|
||||
|
||||
Package: libfm-qt6-l10n
|
||||
Architecture: all
|
||||
Multi-Arch: foreign
|
||||
Section: localization
|
||||
Depends: qt6-translations-l10n, ${misc:Depends}
|
||||
Description: Language package for libfm-qt
|
||||
Libfm-Qt is a companion library providing components to build desktop file
|
||||
managers.
|
||||
.
|
||||
This package contains the l10n files needed by the libfm-qt.
|
||||
|
25
debian/copyright
vendored
25
debian/copyright
vendored
@ -1,15 +1,12 @@
|
||||
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||
Upstream-Name: libfm-qt
|
||||
Source: https://github.com/lxqt/libfm-qt
|
||||
Source: https://github.com/lxde/libfm-qt
|
||||
|
||||
Files: *
|
||||
Copyright: 2013-2024 LXQt team
|
||||
2009 Juergen Hoetzel <juergen@archlinux.org>
|
||||
2010 Shae Smittle <starfall87@gmail.com>
|
||||
Copyright: 2013-2016 LXQt team
|
||||
2013-2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
2012-2013 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
2014 Kuzma Shapran <kuzma.shapran@gmail.com>
|
||||
2016 Mamoru TASAKA <mtasaka@fedoraproject.org>
|
||||
2012-2016 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
2009-2019 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
License: LGPL-2.1+
|
||||
|
||||
Files: cmake/fm-qt-config.cmake.in
|
||||
@ -17,18 +14,10 @@ Copyright: 2015 Luís Pereira <luis.artur.pereira@gmail.com>
|
||||
License: BSD-3-Clause
|
||||
|
||||
Files: debian/*
|
||||
Copyright: 2015 Andrew Lee (李健秋) <ajqlee@debian.org>
|
||||
2014-2015 Wen Liao <wen.cf83@gmail.com>
|
||||
Copyright: 2014-2015 Wen Liao <wen.cf83@gmail.com>
|
||||
2014-2016 ChangZhuo Chen (陳昌倬) <czchen@debian.org>
|
||||
2019 Rik Mills <rikmills@kubuntu.org>
|
||||
2013-2019 Alf Gaida <agaida@siduction.org>
|
||||
2018-2019 Walter Lapchynski <wxl@ubuntu.com>
|
||||
2018-2019 Dan Simmons <monetaryabyss@protonmail.com>
|
||||
2020 Gianfranco Costamagna <locutusofborg@debian.org>
|
||||
2019-2021 Raman Sarda <ramansarda2000@gmail.com>
|
||||
2019-2021 apt-ghetto <apt-ghetto@protonmail.com>
|
||||
2018-2025 Simon Quigley <tsimonq2@ubuntu.com>
|
||||
2022-2024 Aaron Rainbolt <arraybolt3@gmail.com>
|
||||
2013-2016 Alf Gaida <agaida@siduction.org>
|
||||
2015 Andrew Lee (李健秋) <ajqlee@debian.org>
|
||||
License: LGPL-2.1+
|
||||
|
||||
License: BSD-3-Clause
|
||||
|
4
debian/gbp.conf
vendored
4
debian/gbp.conf
vendored
@ -2,5 +2,7 @@
|
||||
debian-branch = debian/sid
|
||||
upstream-branch = upstream/latest
|
||||
pristine-tar = True
|
||||
compression = xz
|
||||
|
||||
[import-orig]
|
||||
# Use git cherrypick -n upstream instead.
|
||||
merge = False
|
||||
|
5
debian/libfm-qt-dev.install
vendored
Normal file
5
debian/libfm-qt-dev.install
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
usr/include/libfm-qt/*.h
|
||||
usr/lib/*/*.so
|
||||
usr/lib/*/pkgconfig/*
|
||||
|
||||
usr/share/cmake/fm-qt/*.cmake
|
761
debian/libfm-qt3.symbols
vendored
Normal file
761
debian/libfm-qt3.symbols
vendored
Normal file
@ -0,0 +1,761 @@
|
||||
libfm-qt.so.3 libfm-qt3 #MINVER#
|
||||
(c++)"Fm::AppChooserComboBox::~AppChooserComboBox()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::AppChooserComboBox(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::isChanged()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::onCurrentIndexChanged(int)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::selectedApp()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::setMimeType(_FmMimeType*)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserComboBox::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::accept()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::~AppChooserDialog()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::AppChooserDialog(_FmMimeType*, QWidget*, QFlags<Qt::WindowType>)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::customCommandToApp()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::isSetDefault()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::onSelectionChanged()@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::onTabChanged(int)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::setCanSetDefault(bool)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::setMimeType(_FmMimeType*)@Base" 0.10.0
|
||||
(c++)"Fm::AppChooserDialog::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::addMenuItems(QStandardItem*, _MenuCacheDir*)@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::~AppMenuView()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::AppMenuView(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::isAppSelected()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::onMenuCacheReload(_MenuCache*)@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectedApp()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectedAppDesktopFilePath()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectedAppDesktopId()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectedAppDesktopPath()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectedItem()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::selectionChanged()@Base" 0.10.0
|
||||
(c++)"Fm::AppMenuView::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::BookmarkAction::BookmarkAction(_FmBookmarkItem*, QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::add(_FmPath*, int)@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::backward()@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::~BrowseHistory()@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::BrowseHistory()@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::canBackward() const@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::canForward() const@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::forward()@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::setCurrentIndex(int)@Base" 0.10.0
|
||||
(c++)"Fm::BrowseHistory::setMaxCount(int)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::~CachedFolderModel()@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::CachedFolderModel(_FmFolder*)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::modelFromFolder(_FmFolder*)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::modelFromPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::CachedFolderModel::unref()@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::changed()@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::~ColorButton()@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::ColorButton(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::onClicked()@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::setColor(QColor const&)@Base" 0.10.0
|
||||
(c++)"Fm::ColorButton::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::copyFilesToClipboard(_FmPathList*)@Base" 0.10.0
|
||||
(c++)"Fm::createFileOrFolder(Fm::CreateFileType, _FmPath*, _FmTemplate*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::~CreateNewMenu()@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::CreateNewMenu(QWidget*, _FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::onCreateNew()@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::onCreateNewFile()@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::onCreateNewFolder()@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::CreateNewMenu::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::cutFilesToClipboard(_FmPathList*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::addRoot(_FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::columnCount(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::data(QModelIndex const&, int) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::~DirTreeModel()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::DirTreeModel(QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::dispName(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::fileInfo(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::filePath(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::flags(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::hasChildren(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::icon(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::indexFromItem(Fm::DirTreeModelItem*) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::indexFromPath(_FmPath*) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::index(int, int, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::isLoaded(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::addPlaceHolderChild()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::childFromName(char const*, int*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::childFromPath(_FmPath*, bool) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::~DirTreeModelItem()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::DirTreeModelItem()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::DirTreeModelItem(_FmFileInfo*, Fm::DirTreeModel*, Fm::DirTreeModelItem*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::freeFolder()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::itemFromIndex(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::itemFromPath(_FmPath*) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::index()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::insertFileInfo(_FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::insertItem(Fm::DirTreeModelItem*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::loadFolder()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::onFolderFilesAdded(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::onFolderFilesChanged(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::onFolderFilesRemoved(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::onFolderFinishLoading(_FmFolder*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::setShowHidden(bool)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModelItem::unloadFolder()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::loadRow(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::parent(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::rowCount(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::rowLoaded(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::setShowHidden(bool)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeModel::unloadRow(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::cancelPendingChdir()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::chdirRequested(int, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::createNewFolderRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::~DirTreeView()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::DirTreeView(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::expandPendingPath()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::mousePressEvent(QMouseEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onCollapsed(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onCustomContextMenuRequested(QPoint const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onExpanded(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onNewFolder()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onNewTab()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onNewWindow()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onOpen()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onOpenInTerminal()@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onRowLoaded(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::onSelectionChanged(QItemSelection const&, QItemSelection const&)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::openFolderInNewTabRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::openFolderInNewWindowRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::openFolderInTerminalRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::prepareFileMenu(Fm::FileMenu*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::setCurrentPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::setModel(QAbstractItemModel*)@Base" 0.10.0
|
||||
(c++)"Fm::DirTreeView::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::accept()@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::~EditBookmarksDialog()@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::EditBookmarksDialog(_FmBookmarks*, QWidget*, QFlags<Qt::WindowType>)@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::onAddItem()@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::onRemoveItem()@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::EditBookmarksDialog::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::execModelessDialog(QDialog*)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::ask(char const*, char* const*, int)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::error(_GAppLaunchContext*, _GError*, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::execFile(_FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::~FileLauncher()@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::FileLauncher()@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::funcs@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::getApp(_GList*, _FmMimeType*, _GError**)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::launchFiles(QWidget*, _GList*)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::launchPaths(QWidget*, _GList*)@Base" 0.10.0
|
||||
(c++)"Fm::FileLauncher::openFolder(_GAppLaunchContext*, _GList*, _GError**)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::addCustomActionItem(QMenu*, _FmFileActionItem*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::createMenu(_FmFileInfoList*, _FmFileInfo*, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::~FileMenu()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::FileMenu(_FmFileInfoList*, _FmFileInfo*, _FmPath*, QString const&, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::FileMenu(_FmFileInfoList*, _FmFileInfo*, _FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onApplicationTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onCompress()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onCopyTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onCustomActionTrigerred()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onCutTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onDeleteTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onExtract()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onExtractHere()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onFilePropertiesTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onOpenTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onOpenWithTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onPasteTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onRenameTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::onUnTrashTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::openFilesWithApp(_GAppInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::setUseTrash(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FileMenu::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::changeAttrFiles(_FmPathList*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::copyFiles(_FmPathList*, _FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::deleteFiles(_FmPathList*, bool, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::ask(QString, char* const*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::askRename(_FmFileInfo*, _FmFileInfo*, QString&)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::error(_GError*, FmJobErrorSeverity)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::~FileOperationDialog()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::FileOperationDialog(Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::reject()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setCurFile(QString)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setDestPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setPercent(unsigned int)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setPrepared()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setRemainingTime(unsigned int)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::setSourceFiles(_FmPathList*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperationDialog::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::disconnectJob()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::~FileOperation()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::FileOperation(Fm::FileOperation::Type, _FmPathList*, QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::finished()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::handleFinish()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::moveFiles(_FmPathList*, _FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobAsk(_FmFileOpsJob*, char const*, char* const*, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobAskRename(_FmFileOpsJob*, _FmFileInfo*, _FmFileInfo*, char**, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobCancelled(_FmFileOpsJob*, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobCurFile(_FmFileOpsJob*, char const*, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobError(_FmFileOpsJob*, _GError*, FmJobErrorSeverity, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobFinished(_FmFileOpsJob*, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobPercent(_FmFileOpsJob*, unsigned int, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onFileOpsJobPrepared(_FmFileOpsJob*, Fm::FileOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::onUiTimeout()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::run()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::showDialog()@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::symlinkFiles(_FmPathList*, _FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::trashFiles(_FmPathList*, bool, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FileOperation::unTrashFiles(_FmPathList*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::accept()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::~FilePropsDialog()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::FilePropsDialog(_FmFileInfoList*, QWidget*, QFlags<Qt::WindowType>)@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::initApplications()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::initGeneralPage()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::initOwner()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::initPermissionsPage()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::onDeepCountJobFinished(_FmDeepCountJob*, Fm::FilePropsDialog*)@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::onFileSizeTimerTimeout()@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FilePropsDialog::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FileSearchDialog::accept()@Base" 0.10.0
|
||||
(c++)"Fm::FileSearchDialog::~FileSearchDialog()@Base" 0.10.0
|
||||
(c++)"Fm::FileSearchDialog::FileSearchDialog(QStringList, QWidget*, QFlags<Qt::WindowType>)@Base" 0.10.0
|
||||
(c++)"Fm::FileSearchDialog::onAddPath()@Base" 0.10.0
|
||||
(c++)"Fm::FileSearchDialog::onRemovePath()@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::drawText(QPainter*, QStyleOptionViewItem&, QRectF&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::~FolderItemDelegate()@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::FolderItemDelegate(QAbstractItemView*, QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::iconModeFromState(QFlags<QStyle::StateFlag>)@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::paint(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::sizeHint(QStyleOptionViewItem const&, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderItemDelegate::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::addCustomActionItem(QMenu*, _FmFileActionItem*)@Base" 0.11.0
|
||||
(c++)"Fm::FolderMenu::addSortMenuItem(QString, int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::createSortMenu()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::~FolderMenu()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::FolderMenu(Fm::FolderView*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onCaseSensitiveActionTriggered(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onCustomActionTrigerred()@Base" 0.11.0
|
||||
(c++)"Fm::FolderMenu::onFolderFirstActionTriggered(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onInvertSelectionActionTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onPasteActionTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onPropertiesActionTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onSelectAllActionTriggered()@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onShowHiddenActionTriggered(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onSortActionTriggered(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::onSortOrderActionTriggered(bool)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderMenu::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::cacheThumbnails(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::columnCount(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::data(QModelIndex const&, int) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::dropMimeData(QMimeData const*, Qt::DropAction, int, int, QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::fileInfoFromIndex(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::findItemByFileInfo(_FmFileInfo*, int*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::findItemByName(char const*, int*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::findItemByPath(_FmPath*, int*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::flags(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::~FolderModel()@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::FolderModel()@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::headerData(int, Qt::Orientation, int) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::index(int, int, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::insertFiles(int, _FmFileInfoList*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModelItem::findThumbnail(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModelItem::~FolderModelItem()@Base" 0.10.0
|
||||
(c++)"Fm::FolderModelItem::FolderModelItem(_FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModelItem::FolderModelItem(Fm::FolderModelItem const&)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::itemFromIndex(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModelItem::removeThumbnail(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::mimeData(QList<QModelIndex> const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::mimeTypes() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onFilesAdded(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onFilesChanged(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onFilesRemoved(_FmFolder*, _GSList*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onFinishLoading(_FmFolder*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onStartLoading(_FmFolder*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::onThumbnailLoaded(_FmThumbnailLoader*, void*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::parent(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::releaseThumbnails(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::removeAll()@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::rowCount(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::setFolder(_FmFolder*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::supportedDropActions() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::thumbnailFromIndex(QModelIndex const&, int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::thumbnailLoaded(QModelIndex const&, int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderModel::updateIcons()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childDragEnterEvent(QDragEnterEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childDragLeaveEvent(QDragLeaveEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childDragMoveEvent(QDragMoveEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childDropEvent(QDropEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childMousePressEvent(QMouseEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::childView() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::clickedBack()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::clickedForward()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::clicked(int, _FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::contextMenuEvent(QContextMenuEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::emitClickedAt(Fm::FolderView::ClickType, QPoint const&)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::eventFilter(QObject*, QEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::event(QEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::~FolderView()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::FolderView(Fm::FolderView::ViewMode, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::iconSize(Fm::FolderView::ViewMode) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::indexFromFolderPath(_FmPath*) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::invertSelection()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::model() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::onAutoSelectionTimeout()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::onFileClicked(int, _FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::onItemActivated(QModelIndex)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::onSelChangedTimeout()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::onSelectionChanged(QItemSelection const&, QItemSelection const&)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::prepareFileMenu(Fm::FileMenu*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::prepareFolderMenu(Fm::FolderMenu*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selChanged(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectAll()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectedFilePaths() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectedFiles() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectedIndexes() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectedRows(int) const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::selectionModel() const@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::setAutoSelectionDelay(int)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::setIconSize(Fm::FolderView::ViewMode, QSize)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::setMargins(QSize)@Base" 0.11.0
|
||||
(c++)"Fm::FolderView::setModel(Fm::ProxyFolderModel*)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::setViewMode(Fm::FolderView::ViewMode)@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::sortChanged()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::updateGridSize()@Base" 0.10.0
|
||||
(c++)"Fm::FolderView::viewMode() const@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::changed()@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::~FontButton()@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::FontButton(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::onClicked()@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::setFont(QFont)@Base" 0.10.0
|
||||
(c++)"Fm::FontButton::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::gidFromName(QString)@Base" 0.10.0
|
||||
(c++)"Fm::gidToName(unsigned int)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::changed()@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::checkChanged()@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::convertFromGIconWithoutEmblems(_GIcon*)@Base" 0.11.1
|
||||
(c++)"Fm::IconTheme::emblems(_FmIcon*)@Base" 0.11.1
|
||||
(c++)"Fm::IconTheme::emblems(_GIcon*)@Base" 0.11.1
|
||||
(c++)"Fm::IconTheme::ensureCacheData(_FmIcon*)@Base" 0.11.1
|
||||
(c++)"Fm::IconTheme::eventFilter(QObject*, QEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::icon(_FmIcon*)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::iconFromNames(char const* const*)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::icon(_GIcon*)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::~IconTheme()@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::IconTheme()@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::instance()@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::IconTheme::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::isUriSchemeSupported(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::LibFmQt::~LibFmQt()@Base" 0.10.0
|
||||
(c++)"Fm::LibFmQt::LibFmQt()@Base" 0.10.0
|
||||
(c++)"Fm::LibFmQt::translator()@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::finished(_GError*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::handleFinish(_GError*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::~MountOperation()@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::MountOperation(bool, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onAbort(_GMountOperation*, Fm::MountOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onAskPassword(_GMountOperation*, char*, char*, char*, GAskPasswordFlags, Fm::MountOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onAskQuestion(_GMountOperation*, char*, char**, Fm::MountOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onEjectMountFinished(_GMount*, _GAsyncResult*, QPointer<Fm::MountOperation>*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onEjectVolumeFinished(_GVolume*, _GAsyncResult*, QPointer<Fm::MountOperation>*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onMountFileFinished(_GFile*, _GAsyncResult*, QPointer<Fm::MountOperation>*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onMountVolumeFinished(_GVolume*, _GAsyncResult*, QPointer<Fm::MountOperation>*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onShowProcesses(_GMountOperation*, char*, _GArray*, char**, Fm::MountOperation*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::onUnmountMountFinished(_GMount*, _GAsyncResult*, QPointer<Fm::MountOperation>*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::prepareUnmount(_GMount*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::MountOperation::wait()@Base" 0.10.0
|
||||
(c++)"Fm::pasteFilesFromClipboard(_FmPath*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::autoComplete()@Base" 0.11.0
|
||||
(c++)"Fm::PathEdit::event(QEvent*)@Base" 0.11.0
|
||||
(c++)"Fm::PathEdit::focusInEvent(QFocusEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::focusOutEvent(QFocusEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::freeCompleter()@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::onJobFinished()@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::onTextChanged(QString const&)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::~PathEdit()@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::PathEdit(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::reloadCompleter(bool)@Base" 0.10.0
|
||||
(c++)"Fm::PathEdit::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::pathListFromQUrls(QList<QUrl>)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelBookmarkItem::PlacesModelBookmarkItem(_FmBookmarkItem*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::createTrashItem()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::data(QModelIndex const&, int) const@Base" 0.11.1
|
||||
(c++)"Fm::PlacesModel::dropMimeData(QMimeData const*, Qt::DropAction, int, int, QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::flags(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::data(int) const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::itemFromBookmark(_FmBookmarkItem*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::itemFromMount(_GMount*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::itemFromPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::itemFromPath(QStandardItem*, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::itemFromVolume(_GVolume*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::~PlacesModelItem()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::PlacesModelItem()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::PlacesModelItem(char const*, QString, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::PlacesModelItem(_FmIcon*, QString, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::PlacesModelItem(QIcon, QString, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::setFileInfo(_FmFileInfo*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::setIcon(_FmIcon*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::setIcon(_GIcon*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::setPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelItem::updateIcon()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::loadBookmarks()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::mimeData(QList<QModelIndex> const&) const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::mimeTypes() const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelMountItem::PlacesModelMountItem(_GMount*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelMountItem::update()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onBookmarksChanged(_FmBookmarks*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onMountAdded(_GVolumeMonitor*, _GMount*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onMountChanged(_GVolumeMonitor*, _GMount*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onMountRemoved(_GVolumeMonitor*, _GMount*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onTrashChanged(_GFileMonitor*, _GFile*, _GFile*, GFileMonitorEvent, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onVolumeAdded(_GVolumeMonitor*, _GVolume*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onVolumeChanged(_GVolumeMonitor*, _GVolume*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::onVolumeRemoved(_GVolumeMonitor*, _GVolume*, Fm::PlacesModel*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::~PlacesModel()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::PlacesModel(QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::setShowApplications(bool)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::setShowDesktop(bool)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::setShowTrash(bool)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::supportedDropActions() const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::updateIcons()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModel::updateTrash()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelVolumeItem::isMounted()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelVolumeItem::PlacesModelVolumeItem(_GVolume*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesModelVolumeItem::update()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::activateRow(int, QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::chdirRequested(int, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::commitData(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::contextMenuEvent(QContextMenuEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::dragMoveEvent(QDragMoveEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::dropEvent(QDropEvent*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onClicked(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onDeleteBookmark()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onEjectButtonClicked(Fm::PlacesModelItem*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onEjectVolume()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onEmptyTrash()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onIconSizeChanged(QSize const&)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onMountVolume()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onMoveBookmarkDown()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onMoveBookmarkUp()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onOpenNewTab()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onOpenNewWindow()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onPressed(QModelIndex const&)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onRenameBookmark()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onUnmountMount()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::onUnmountVolume()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::~PlacesView()@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::PlacesView(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::setCurrentPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::PlacesView::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::addFilter(Fm::ProxyFolderModelFilter*)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::data(QModelIndex const&, int) const@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::fileInfoFromIndex(QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::filterAcceptsRow(int, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::lessThan(QModelIndex const&, QModelIndex const&) const@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::onThumbnailLoaded(QModelIndex const&, int)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::~ProxyFolderModel()@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::ProxyFolderModel(QObject*)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::removeFilter(Fm::ProxyFolderModelFilter*)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::setFolderFirst(bool)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::setShowHidden(bool)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::setShowThumbnails(bool)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::setSourceModel(QAbstractItemModel*)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::setThumbnailSize(int)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::sortFilterChanged()@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::sort(int, Qt::SortOrder)@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::ProxyFolderModel::updateFilters()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::accept()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::onFileNameChanged(QString)@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::onIgnoreClicked()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::onRenameClicked()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::reject()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::~RenameDialog()@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::RenameDialog(_FmFileInfo*, _FmFileInfo*, QWidget*, QFlags<Qt::WindowType>)@Base" 0.10.0
|
||||
(c++)"Fm::RenameDialog::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::renameFile(_FmFileInfo*, QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::chdirRequested(int, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::createNewFolderRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::initDirTree()@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::metaObject() const@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::modeByName(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::modeChanged(Fm::SidePane::Mode)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::modeName(Fm::SidePane::Mode)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::onComboCurrentIndexChanged(int)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::onDirTreeViewChdirRequested(int, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::onPlacesViewChdirRequested(int, _FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::openFolderInNewTabRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::openFolderInNewWindowRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::openFolderInTerminalRequested(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::prepareFileMenu(Fm::FileMenu*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::qt_metacall(QMetaObject::Call, int, void**)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::qt_metacast(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::setCurrentPath(_FmPath*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::setHomeDir(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::setIconSize(QSize)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::setMode(Fm::SidePane::Mode)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::setShowHidden(bool)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::~SidePane()@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::SidePane(QWidget*)@Base" 0.10.0
|
||||
(c++)"Fm::SidePane::staticMetaObject@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::getImageHeight(_GObject*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::getImageText(_GObject*, char const*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::getImageWidth(_GObject*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::image(_FmThumbnailLoader*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::localFilesOnly_@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::maxThumbnailFileSize_@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::readImageFromFile(char const*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::rotateImage(_GObject*, int)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::scaleImage(_GObject*, int, int)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::setImageText(_GObject*, char const*, char const*)@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::theThumbnailLoader@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::~ThumbnailLoader()@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::ThumbnailLoader()@Base" 0.10.0
|
||||
(c++)"Fm::ThumbnailLoader::writeImage(_GObject*, char const*)@Base" 0.10.0
|
||||
(c++)"Fm::uidFromName(QString)@Base" 0.10.0
|
||||
(c++)"Fm::uidToName(unsigned int)@Base" 0.10.0
|
||||
(c++)"Fm::uriExists(char const*)@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::AppChooserComboBox::~AppChooserComboBox()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::AppChooserDialog::~AppChooserDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::AppMenuView::~AppMenuView()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::ColorButton::~ColorButton()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::CreateNewMenu::~CreateNewMenu()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::DirTreeView::~DirTreeView()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::EditBookmarksDialog::~EditBookmarksDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FileMenu::~FileMenu()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FileOperationDialog::~FileOperationDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FilePropsDialog::~FilePropsDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FileSearchDialog::~FileSearchDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FolderMenu::~FolderMenu()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FolderView::~FolderView()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::FontButton::~FontButton()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::PathEdit::~PathEdit()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::PlacesView::~PlacesView()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::RenameDialog::~RenameDialog()@Base" 0.10.0
|
||||
(c++)"non-virtual thunk to Fm::SidePane::~SidePane()@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::AppChooserComboBox@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::AppChooserDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::AppMenuView@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::BookmarkAction@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::BrowseHistory@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::CachedFolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::ColorButton@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::CreateNewMenu@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::DirTreeModel@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::DirTreeView@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::EditBookmarksDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FileLauncher@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FileMenu@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FileOperation@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FileOperationDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FilePropsDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FileSearchDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FolderItemDelegate@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FolderMenu@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FolderModelItem@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FolderView@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::FontButton@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::IconTheme@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::MountOperation@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PathEdit@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModel@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModelBookmarkItem@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModel::ItemAction@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModelItem@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModelMountItem@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesModelVolumeItem@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::PlacesView@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::ProxyFolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::RenameDialog@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::SidePane@Base" 0.10.0
|
||||
(c++)"typeinfo for Fm::ThumbnailLoader@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::AppChooserComboBox@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::AppChooserDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::AppMenuView@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::BookmarkAction@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::BrowseHistory@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::CachedFolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::ColorButton@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::CreateNewMenu@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::DirTreeModel@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::DirTreeView@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::EditBookmarksDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FileLauncher@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FileMenu@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FileOperation@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FileOperationDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FilePropsDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FileSearchDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FolderItemDelegate@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FolderMenu@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FolderModelItem@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FolderView@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::FontButton@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::IconTheme@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::MountOperation@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PathEdit@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModel@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModelBookmarkItem@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModel::ItemAction@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModelItem@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModelMountItem@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesModelVolumeItem@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::PlacesView@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::ProxyFolderModel@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::RenameDialog@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::SidePane@Base" 0.10.0
|
||||
(c++)"typeinfo name for Fm::ThumbnailLoader@Base" 0.10.0
|
||||
(c++)"vtable for Fm::AppChooserComboBox@Base" 0.10.0
|
||||
(c++)"vtable for Fm::AppChooserDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::AppMenuView@Base" 0.10.0
|
||||
(c++)"vtable for Fm::BookmarkAction@Base" 0.10.0
|
||||
(c++)"vtable for Fm::BrowseHistory@Base" 0.10.0
|
||||
(c++)"vtable for Fm::CachedFolderModel@Base" 0.10.0
|
||||
(c++)"vtable for Fm::ColorButton@Base" 0.10.0
|
||||
(c++)"vtable for Fm::CreateNewMenu@Base" 0.10.0
|
||||
(c++)"vtable for Fm::DirTreeModel@Base" 0.10.0
|
||||
(c++)"vtable for Fm::DirTreeView@Base" 0.10.0
|
||||
(c++)"vtable for Fm::EditBookmarksDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FileLauncher@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FileMenu@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FileOperation@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FileOperationDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FilePropsDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FileSearchDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FolderItemDelegate@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FolderMenu@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FolderModel@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FolderModelItem@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FolderView@Base" 0.10.0
|
||||
(c++)"vtable for Fm::FontButton@Base" 0.10.0
|
||||
(c++)"vtable for Fm::IconTheme@Base" 0.10.0
|
||||
(c++)"vtable for Fm::MountOperation@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PathEdit@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModel@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModelBookmarkItem@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModel::ItemAction@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModelItem@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModelMountItem@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesModelVolumeItem@Base" 0.10.0
|
||||
(c++)"vtable for Fm::PlacesView@Base" 0.10.0
|
||||
(c++)"vtable for Fm::ProxyFolderModel@Base" 0.10.0
|
||||
(c++)"vtable for Fm::RenameDialog@Base" 0.10.0
|
||||
(c++)"vtable for Fm::SidePane@Base" 0.10.0
|
||||
(c++)"vtable for Fm::ThumbnailLoader@Base" 0.10.0
|
||||
fm_search_add_dir@Base 0.10.0
|
||||
fm_search_add_mime_type@Base 0.10.0
|
||||
fm_search_dup_path@Base 0.10.0
|
||||
fm_search_free@Base 0.10.0
|
||||
fm_search_get_content_ci@Base 0.10.0
|
||||
fm_search_get_content_pattern@Base 0.10.0
|
||||
fm_search_get_content_regex@Base 0.10.0
|
||||
fm_search_get_dirs@Base 0.10.0
|
||||
fm_search_get_max_mtime@Base 0.10.0
|
||||
fm_search_get_max_size@Base 0.10.0
|
||||
fm_search_get_mime_types@Base 0.10.0
|
||||
fm_search_get_min_mtime@Base 0.10.0
|
||||
fm_search_get_min_size@Base 0.10.0
|
||||
fm_search_get_name_ci@Base 0.10.0
|
||||
fm_search_get_name_patterns@Base 0.10.0
|
||||
fm_search_get_name_regex@Base 0.10.0
|
||||
fm_search_get_recursive@Base 0.10.0
|
||||
fm_search_get_show_hidden@Base 0.10.0
|
||||
fm_search_new@Base 0.10.0
|
||||
fm_search_remove_dir@Base 0.10.0
|
||||
fm_search_remove_mime_type@Base 0.10.0
|
||||
fm_search_set_content_ci@Base 0.10.0
|
||||
fm_search_set_content_pattern@Base 0.10.0
|
||||
fm_search_set_content_regex@Base 0.10.0
|
||||
fm_search_set_max_mtime@Base 0.10.0
|
||||
fm_search_set_max_size@Base 0.10.0
|
||||
fm_search_set_min_mtime@Base 0.10.0
|
||||
fm_search_set_min_size@Base 0.10.0
|
||||
fm_search_set_name_ci@Base 0.10.0
|
||||
fm_search_set_name_patterns@Base 0.10.0
|
||||
fm_search_set_name_regex@Base 0.10.0
|
||||
fm_search_set_recursive@Base 0.10.0
|
||||
fm_search_set_show_hidden@Base 0.10.0
|
||||
|
||||
|
||||
# arch-bits=64
|
||||
(arch-bits=64|c++)"Fm::MountOperation::onShowUnmountProgress(_GMountOperation*, char*, long, long, Fm::MountOperation*)@Base" 0.10.0
|
||||
(arch-bits=64|c++)"Fm::ThumbnailLoader::readImageFromStream(_GInputStream*, unsigned long, _GCancellable*)@Base" 0.10.0
|
||||
|
||||
|
||||
# arch-bits=32
|
||||
(arch-bits=32|c++)"Fm::MountOperation::onShowUnmountProgress(_GMountOperation*, char*, long long, long long, Fm::MountOperation*)@Base" 0.10.0
|
||||
(arch-bits=32|c++)"Fm::ThumbnailLoader::readImageFromStream(_GInputStream*, unsigned long long, _GCancellable*)@Base" 0.10.0
|
1678
debian/libfm-qt6-15.symbols
vendored
1678
debian/libfm-qt6-15.symbols
vendored
File diff suppressed because it is too large
Load Diff
3
debian/libfm-qt6-common.install
vendored
3
debian/libfm-qt6-common.install
vendored
@ -1,3 +0,0 @@
|
||||
usr/share/libfm-qt6/archivers.list
|
||||
usr/share/libfm-qt6/terminals.list
|
||||
usr/share/mime/packages/libfm-qt6-mimetypes.xml
|
8
debian/libfm-qt6-dev.install
vendored
8
debian/libfm-qt6-dev.install
vendored
@ -1,8 +0,0 @@
|
||||
usr/include/libfm-qt6/*.h
|
||||
usr/include/libfm-qt6/core/*.h
|
||||
usr/include/libfm-qt6/core/legacy/*.h
|
||||
usr/include/libfm-qt6/core/vfs/*.h
|
||||
usr/include/libfm-qt6/customactions/*.h
|
||||
usr/lib/*/*.so
|
||||
usr/lib/*/pkgconfig/*
|
||||
usr/share/cmake/fm-qt6/*.cmake
|
1
debian/libfm-qt6-l10n.install
vendored
1
debian/libfm-qt6-l10n.install
vendored
@ -1 +0,0 @@
|
||||
usr/share/libfm-qt6/translations
|
@ -1,16 +0,0 @@
|
||||
Description: Fix metadata for trusting executables
|
||||
To conform with the Ubuntu standard use metadata::trusted instead of metadata::trust. This patch must be applied after any upstream version changes since they refuse to conform.
|
||||
Author: Dan Simmons <monetaryabyss@protonmail.com>
|
||||
Bug: https://bugs.launchpad.net/bugs/1813687
|
||||
Last-Update: 2019-01-29
|
||||
--- a/src/core/fileinfo.cpp
|
||||
+++ b/src/core/fileinfo.cpp
|
||||
@@ -2,7 +2,7 @@
|
||||
#include "fileinfo_p.h"
|
||||
#include <gio/gio.h>
|
||||
|
||||
-#define METADATA_TRUST "metadata::trust"
|
||||
+#define METADATA_TRUST "metadata::trusted"
|
||||
|
||||
namespace Fm {
|
||||
|
344
debian/patches/model-places.patch
vendored
Normal file
344
debian/patches/model-places.patch
vendored
Normal file
@ -0,0 +1,344 @@
|
||||
Description: Fixed behaviour with icon emblems
|
||||
Backported a upstream fix for Icon Emblem Support. Only applies to
|
||||
pcmanfm-qt - no changes in released version needed.
|
||||
Author: Alf Gaida <agaida@siduction.org>
|
||||
|
||||
Last-Update: 2016-10-20
|
||||
|
||||
--- libfm-qt-0.11.1.orig/src/folderitemdelegate.cpp
|
||||
+++ libfm-qt-0.11.1/src/folderitemdelegate.cpp
|
||||
@@ -35,7 +35,9 @@ namespace Fm {
|
||||
FolderItemDelegate::FolderItemDelegate(QAbstractItemView* view, QObject* parent):
|
||||
QStyledItemDelegate(parent ? parent : view),
|
||||
view_(view),
|
||||
- symlinkIcon_(QIcon::fromTheme("emblem-symbolic-link")) {
|
||||
+ symlinkIcon_(QIcon::fromTheme("emblem-symbolic-link")),
|
||||
+ fileInfoRole_(Fm::FolderModel::FileInfoRole),
|
||||
+ fmIconRole_(-1) {
|
||||
}
|
||||
|
||||
FolderItemDelegate::~FolderItemDelegate() {
|
||||
@@ -78,9 +80,13 @@ QIcon::Mode FolderItemDelegate::iconMode
|
||||
// special thanks to Razor-qt developer Alec Moskvin(amoskvin) for providing the fix!
|
||||
void FolderItemDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const {
|
||||
Q_ASSERT(index.isValid());
|
||||
- FmFileInfo* file = static_cast<FmFileInfo*>(index.data(FolderModel::FileInfoRole).value<void*>());
|
||||
+ FmFileInfo* file = static_cast<FmFileInfo*>(index.data(fileInfoRole_).value<void*>());
|
||||
+ FmIcon* fmicon = static_cast<FmIcon*>(index.data(fmIconRole_).value<void*>());
|
||||
+ if(fmicon == nullptr && file != nullptr) {
|
||||
+ fmicon = fm_file_info_get_icon(file);
|
||||
+ }
|
||||
+ QList<Icon> emblems = fmicon != nullptr ? IconTheme::emblems(fmicon) : QList<Icon>();
|
||||
bool isSymlink = file && fm_file_info_is_symlink(file);
|
||||
-
|
||||
if(option.decorationPosition == QStyleOptionViewItem::Top ||
|
||||
option.decorationPosition == QStyleOptionViewItem::Bottom) {
|
||||
painter->save();
|
||||
@@ -100,9 +106,13 @@ void FolderItemDelegate::paint(QPainter*
|
||||
painter->drawPixmap(iconPos + QPoint(margin.width(), margin.height()), pixmap);
|
||||
|
||||
// draw some emblems for the item if needed
|
||||
- // we only support symlink emblem at the moment
|
||||
if(isSymlink)
|
||||
painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ if(!emblems.isEmpty()) {
|
||||
+ QPoint emblemPos(opt.rect.x() + opt.rect.width() / 2, opt.rect.y() + option.decorationSize.height() / 2);
|
||||
+ QIcon emblem = IconTheme::icon(emblems.first().dataPtr());
|
||||
+ painter->drawPixmap(emblemPos, emblem.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
|
||||
// draw the text
|
||||
// The text rect dimensions should be exactly as they were in sizeHint()
|
||||
@@ -118,14 +128,20 @@ void FolderItemDelegate::paint(QPainter*
|
||||
QStyledItemDelegate::paint(painter, option, index);
|
||||
|
||||
// draw emblems if needed
|
||||
- if(isSymlink) {
|
||||
+ if(isSymlink || !emblems.isEmpty()) {
|
||||
QStyleOptionViewItem opt = option;
|
||||
initStyleOption(&opt, index);
|
||||
QIcon::Mode iconMode = iconModeFromState(opt.state);
|
||||
- QPoint iconPos(opt.rect.x(), opt.rect.y() + (opt.rect.height() - option.decorationSize.height()) / 2);
|
||||
// draw some emblems for the item if needed
|
||||
- // we only support symlink emblem at the moment
|
||||
- painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ if(isSymlink) {
|
||||
+ QPoint iconPos(opt.rect.x(), opt.rect.y() + (opt.rect.height() - option.decorationSize.height()) / 2);
|
||||
+ painter->drawPixmap(iconPos, symlinkIcon_.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
+ else {
|
||||
+ QPoint iconPos(opt.rect.x() + option.decorationSize.width() / 2, opt.rect.y() + opt.rect.height() / 2);
|
||||
+ QIcon emblem = IconTheme::icon(emblems.first().dataPtr());
|
||||
+ painter->drawPixmap(iconPos, emblem.pixmap(option.decorationSize / 2, iconMode));
|
||||
+ }
|
||||
}
|
||||
}
|
||||
}
|
||||
--- libfm-qt-0.11.1.orig/src/folderitemdelegate.h
|
||||
+++ libfm-qt-0.11.1/src/folderitemdelegate.h
|
||||
@@ -41,6 +41,22 @@ public:
|
||||
return gridSize_;
|
||||
}
|
||||
|
||||
+ int fileInfoRole() {
|
||||
+ return fileInfoRole_;
|
||||
+ }
|
||||
+
|
||||
+ void setFileInfoRole(int role) {
|
||||
+ fileInfoRole_ = role;
|
||||
+ }
|
||||
+
|
||||
+ int fmIconRole() {
|
||||
+ return fmIconRole_;
|
||||
+ }
|
||||
+
|
||||
+ void setFmIconRole(int role) {
|
||||
+ fmIconRole_ = role;
|
||||
+ }
|
||||
+
|
||||
virtual QSize sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const;
|
||||
virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
|
||||
|
||||
@@ -52,6 +68,8 @@ private:
|
||||
QAbstractItemView* view_;
|
||||
QIcon symlinkIcon_;
|
||||
QSize gridSize_;
|
||||
+ int fileInfoRole_;
|
||||
+ int fmIconRole_;
|
||||
};
|
||||
|
||||
}
|
||||
--- libfm-qt-0.11.1.orig/src/icontheme.cpp
|
||||
+++ libfm-qt-0.11.1/src/icontheme.cpp
|
||||
@@ -28,12 +28,18 @@
|
||||
|
||||
namespace Fm {
|
||||
|
||||
+class IconCacheData {
|
||||
+public:
|
||||
+ QIcon qicon;
|
||||
+ QList<Icon> emblems;
|
||||
+};
|
||||
+
|
||||
static IconTheme* theIconTheme = NULL; // the global single instance of IconTheme.
|
||||
static const char* fallbackNames[] = {"unknown", "application-octet-stream", NULL};
|
||||
|
||||
-static void fmIconDataDestroy(gpointer data) {
|
||||
- QIcon* picon = reinterpret_cast<QIcon*>(data);
|
||||
- delete picon;
|
||||
+static void fmIconDataDestroy(gpointer user_data) {
|
||||
+ IconCacheData* data = reinterpret_cast<IconCacheData*>(user_data);
|
||||
+ delete data;
|
||||
}
|
||||
|
||||
IconTheme::IconTheme():
|
||||
@@ -88,7 +94,7 @@ QIcon IconTheme::iconFromNames(const cha
|
||||
return QIcon();
|
||||
}
|
||||
|
||||
-QIcon IconTheme::convertFromGIcon(GIcon* gicon) {
|
||||
+QIcon IconTheme::convertFromGIconWithoutEmblems(GIcon* gicon) {
|
||||
if(G_IS_THEMED_ICON(gicon)) {
|
||||
const gchar * const * names = g_themed_icon_get_names(G_THEMED_ICON(gicon));
|
||||
QIcon icon = iconFromNames(names);
|
||||
@@ -106,20 +112,36 @@ QIcon IconTheme::convertFromGIcon(GIcon*
|
||||
}
|
||||
|
||||
|
||||
+// static
|
||||
+IconCacheData* IconTheme::ensureCacheData(FmIcon* fmicon) {
|
||||
+ IconCacheData* data = reinterpret_cast<IconCacheData*>(fm_icon_get_user_data(fmicon));
|
||||
+ if(!data) { // we don't have a cache yet
|
||||
+ data = new IconCacheData();
|
||||
+ GIcon* gicon = G_ICON(fmicon);
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) { // special handling for emblemed icon
|
||||
+ GList* emblems = g_emblemed_icon_get_emblems(G_EMBLEMED_ICON(gicon));
|
||||
+ for(GList* l = emblems; l; l = l->next) {
|
||||
+ GIcon* emblem_gicon = g_emblem_get_icon(G_EMBLEM(l->data));
|
||||
+ data->emblems.append(Icon::fromGicon(emblem_gicon));
|
||||
+ }
|
||||
+ gicon = g_emblemed_icon_get_icon(G_EMBLEMED_ICON(gicon)); // get an emblemless GIcon
|
||||
+ }
|
||||
+ data->qicon = convertFromGIconWithoutEmblems(gicon);
|
||||
+ fm_icon_set_user_data(fmicon, data); // store it in FmIcon
|
||||
+ }
|
||||
+ return data;
|
||||
+}
|
||||
+
|
||||
//static
|
||||
QIcon IconTheme::icon(FmIcon* fmicon) {
|
||||
- // check if we have a cached version
|
||||
- QIcon* picon = reinterpret_cast<QIcon*>(fm_icon_get_user_data(fmicon));
|
||||
- if(!picon) { // we don't have a cache yet
|
||||
- picon = new QIcon(); // what a waste!
|
||||
- *picon = convertFromGIcon(G_ICON(fmicon));
|
||||
- fm_icon_set_user_data(fmicon, picon); // store it in FmIcon
|
||||
- }
|
||||
- return *picon;
|
||||
+ IconCacheData* data = ensureCacheData(fmicon);
|
||||
+ return data->qicon;
|
||||
}
|
||||
|
||||
//static
|
||||
QIcon IconTheme::icon(GIcon* gicon) {
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) // get an emblemless GIcon
|
||||
+ gicon = g_emblemed_icon_get_icon(G_EMBLEMED_ICON(gicon));
|
||||
if(G_IS_THEMED_ICON(gicon)) {
|
||||
FmIcon* fmicon = fm_icon_from_gicon(gicon);
|
||||
QIcon qicon = icon(fmicon);
|
||||
@@ -128,11 +150,26 @@ QIcon IconTheme::icon(GIcon* gicon) {
|
||||
}
|
||||
else if(G_IS_FILE_ICON(gicon)) {
|
||||
// we do not map GFileIcon to FmIcon deliberately.
|
||||
- return convertFromGIcon(gicon);
|
||||
+ return convertFromGIconWithoutEmblems(gicon);
|
||||
}
|
||||
return theIconTheme->fallbackIcon_;
|
||||
}
|
||||
|
||||
+// static
|
||||
+QList<Icon> IconTheme::emblems(FmIcon* fmicon) {
|
||||
+ IconCacheData* data = ensureCacheData(fmicon);
|
||||
+ return data->emblems;
|
||||
+}
|
||||
+
|
||||
+//static
|
||||
+QList<Icon> IconTheme::emblems(GIcon* gicon) {
|
||||
+ if(G_IS_EMBLEMED_ICON(gicon)) { // if this gicon contains emblems
|
||||
+ Icon fmicon = Icon::fromGicon(gicon);
|
||||
+ return emblems(fmicon.dataPtr());
|
||||
+ }
|
||||
+ return QList<Icon>();
|
||||
+}
|
||||
+
|
||||
// this method is called whenever there is an event on the QDesktopWidget object.
|
||||
bool IconTheme::eventFilter(QObject* obj, QEvent* event) {
|
||||
// we're only interested in the StyleChange event.
|
||||
--- libfm-qt-0.11.1.orig/src/icontheme.h
|
||||
+++ libfm-qt-0.11.1/src/icontheme.h
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <QIcon>
|
||||
#include <QString>
|
||||
#include "libfm/fm.h"
|
||||
+#include "icon.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
@@ -40,6 +41,8 @@ namespace Fm {
|
||||
|
||||
// Nice article about QPixmap from KDE: http://techbase.kde.org/Development/Tutorials/Graphics/Performance
|
||||
|
||||
+class IconCacheData;
|
||||
+
|
||||
class LIBFM_QT_API IconTheme: public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
@@ -49,6 +52,8 @@ public:
|
||||
static IconTheme* instance();
|
||||
static QIcon icon(FmIcon* fmicon);
|
||||
static QIcon icon(GIcon* gicon);
|
||||
+ static QList<Icon> emblems(FmIcon* fmicon);
|
||||
+ static QList<Icon> emblems(GIcon* gicon);
|
||||
|
||||
static void checkChanged(); // check if current icon theme name is changed
|
||||
Q_SIGNALS:
|
||||
@@ -56,8 +61,9 @@ Q_SIGNALS:
|
||||
|
||||
protected:
|
||||
bool eventFilter(QObject *obj, QEvent *event);
|
||||
- static QIcon convertFromGIcon(GIcon* gicon);
|
||||
+ static QIcon convertFromGIconWithoutEmblems(GIcon* gicon);
|
||||
static QIcon iconFromNames(const char * const * names);
|
||||
+ static IconCacheData* ensureCacheData(FmIcon* fmicon);
|
||||
|
||||
protected:
|
||||
QIcon fallbackIcon_;
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodel.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesmodel.cpp
|
||||
@@ -35,7 +35,6 @@ PlacesModel::PlacesModel(QObject* parent
|
||||
showApplications_(true),
|
||||
showDesktop_(true),
|
||||
ejectIcon_(QIcon::fromTheme("media-eject")) {
|
||||
-
|
||||
setColumnCount(2);
|
||||
|
||||
placesRoot = new QStandardItem(tr("Places"));
|
||||
@@ -504,6 +503,23 @@ Qt::ItemFlags PlacesModel::flags(const Q
|
||||
return QStandardItemModel::flags(index);
|
||||
}
|
||||
|
||||
+
|
||||
+QVariant PlacesModel::data(const QModelIndex &index, int role) const {
|
||||
+ if(index.column() == 0 && index.parent().isValid()) {
|
||||
+ PlacesModelItem* item = static_cast<PlacesModelItem*>(QStandardItemModel::itemFromIndex(index));
|
||||
+ if(item != nullptr) {
|
||||
+ switch(role) {
|
||||
+ case FileInfoRole:
|
||||
+ return QVariant::fromValue<void*>(item->fileInfo());
|
||||
+ case FmIconRole:
|
||||
+ return QVariant::fromValue<void*>(item->icon());
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ return QStandardItemModel::data(index, role);
|
||||
+}
|
||||
+
|
||||
+
|
||||
bool PlacesModel::dropMimeData(const QMimeData* data, Qt::DropAction action, int row, int column, const QModelIndex& parent) {
|
||||
QStandardItem* item = itemFromIndex(parent);
|
||||
if(data->hasFormat("application/x-bookmark-row")) { // the data being dopped is a bookmark row
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodel.h
|
||||
+++ libfm-qt-0.11.1/src/placesmodel.h
|
||||
@@ -40,6 +40,11 @@ Q_OBJECT
|
||||
friend class PlacesView;
|
||||
public:
|
||||
|
||||
+ enum {
|
||||
+ FileInfoRole = Qt::UserRole,
|
||||
+ FmIconRole
|
||||
+ };
|
||||
+
|
||||
// QAction used for popup menus
|
||||
class ItemAction : public QAction {
|
||||
public:
|
||||
@@ -74,6 +79,8 @@ public:
|
||||
}
|
||||
void setShowDesktop(bool show);
|
||||
|
||||
+ QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
|
||||
+
|
||||
public Q_SLOTS:
|
||||
void updateIcons();
|
||||
void updateTrash();
|
||||
--- libfm-qt-0.11.1.orig/src/placesmodelitem.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesmodelitem.cpp
|
||||
@@ -21,6 +21,7 @@
|
||||
#include "placesmodelitem.h"
|
||||
#include "icontheme.h"
|
||||
#include <gio/gio.h>
|
||||
+#include <QPainter>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
--- libfm-qt-0.11.1.orig/src/placesview.cpp
|
||||
+++ libfm-qt-0.11.1/src/placesview.cpp
|
||||
@@ -28,6 +28,7 @@
|
||||
#include <QHeaderView>
|
||||
#include <QDebug>
|
||||
#include <QGuiApplication>
|
||||
+#include "folderitemdelegate.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
@@ -43,6 +44,11 @@ PlacesView::PlacesView(QWidget* parent):
|
||||
|
||||
setIconSize(QSize(24, 24));
|
||||
|
||||
+ FolderItemDelegate* delegate = new FolderItemDelegate(this, this);
|
||||
+ delegate->setFileInfoRole(PlacesModel::FileInfoRole);
|
||||
+ delegate->setFmIconRole(PlacesModel::FmIconRole);
|
||||
+ setItemDelegateForColumn(0, delegate);
|
||||
+
|
||||
// FIXME: we may share this model amont all views
|
||||
model_ = new PlacesModel(this);
|
||||
setModel(model_);
|
2
debian/patches/series
vendored
2
debian/patches/series
vendored
@ -1 +1 @@
|
||||
fix-metadata-for-trusting-executables.patch
|
||||
model-places.patch
|
||||
|
8
debian/rules
vendored
8
debian/rules
vendored
@ -2,15 +2,15 @@
|
||||
# export DH_VERBOSE = 1
|
||||
|
||||
export LC_ALL=C.UTF-8
|
||||
export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed
|
||||
export DEB_BUILD_MAINT_OPTIONS = hardening=+all
|
||||
|
||||
%:
|
||||
dh ${@} --buildsystem cmake
|
||||
|
||||
override_dh_missing:
|
||||
dh_missing --fail-missing
|
||||
dh ${@} --buildsystem cmake \
|
||||
--fail-missing
|
||||
|
||||
override_dh_auto_configure:
|
||||
dh_auto_configure -- \
|
||||
-DPULL_TRANSLATIONS=OFF \
|
||||
-DUPDATE_TRANSLATIONS=OFF \
|
||||
-DCMAKE_BUILD_TYPE=RelWithDebInfo
|
||||
|
12
debian/salsa-ci.yml
vendored
12
debian/salsa-ci.yml
vendored
@ -1,12 +0,0 @@
|
||||
# For more information on what jobs are run see:
|
||||
# https://salsa.debian.org/salsa-ci-team/pipeline
|
||||
#
|
||||
# To enable the jobs, go to your repository (at salsa.debian.org)
|
||||
# and click over Settings > CI/CD > Expand (in General pipelines).
|
||||
# In "Custom CI config path" write debian/salsa-ci.yml and click
|
||||
# in "Save Changes". The CI tests will run after the next commit.
|
||||
---
|
||||
include:
|
||||
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/salsa-ci.yml
|
||||
- https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/pipeline-jobs.yml
|
||||
|
5
debian/source/lintian-overrides
vendored
5
debian/source/lintian-overrides
vendored
@ -1,5 +0,0 @@
|
||||
# This list will always be very long, it's okay
|
||||
libfm-qt source: very-long-line-length-in-source-file * > 512 [data/archivers.list:*]
|
||||
|
||||
# Long lines in the upstream changelog are okay
|
||||
libfm-qt source: very-long-line-length-in-source-file * > 512 [CHANGELOG:*]
|
5
debian/upstream/metadata
vendored
5
debian/upstream/metadata
vendored
@ -1,5 +0,0 @@
|
||||
Name: libfm-qt
|
||||
Bug-Database: https://github.com/lxqt/libfm-qt/issues
|
||||
Bug-Submit: https://github.com/lxqt/libfm-qt/issues/new
|
||||
Changelog: https://github.com/lxqt/libfm-qt/blob/master/CHANGELOG
|
||||
Repository: https://github.com/lxqt/libfm-qt
|
96
debian/upstream/signing-key.asc
vendored
96
debian/upstream/signing-key.asc
vendored
@ -1,52 +1,50 @@
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
mQINBF6cxrwBEADfl3ydxNfLBbWGPesXty2baQgixZ3D6aCxadI2kX+aikmT8rd0
|
||||
ttDKN18cXV52Ssxnj0qhgf4hwnu/b0be6BzqSEyGM+UQR3X2CYpxrMakfW32Q18K
|
||||
X5ec0RPR2ucBq9G0r9t6FYC8FkJ4uQUU3xxrLW3z302S0Makjgzm8BV9WrFQ7oFF
|
||||
uJQj0BHbHYC4RyaZb2AfxY4Y92BPGTjtGekWqgw6vEXCCnvAbGYVQzvxZt3nw21/
|
||||
1YmV4g7xhGFQPbOf9v3ejFUJeJIGzuJf5NAh7kvfCdUBAGYH0gnj0GpOve4ftnaG
|
||||
sAId2CQwm3oYF4Tu7yBPTOBpkaKkNaT+UdwTyeKERuCZ9ocZWX++/YF9ItRkJ5mM
|
||||
zoP1GluWn2atNWpRh/K97gyAGgr2fSmrAA4d1JrVbMujZAHoHAOKwJKqX9jPziPZ
|
||||
BFHfhcIOzG3ZhXAuumHsd7uwfPBVt20g+G+cOjBghbSSu9EOtMkAZl1g3ybvZixu
|
||||
Jtxa5exZWEmU7vtytEb8eq9Dj5XcGoTDbErE2RpJ/20HPzhyRKg9RN4iGS+0OiHS
|
||||
oRbDi5IEOizvQjp2bsBmfa3rsoDSOqF2pevp+u8I56I6bU1GFpxxNC5IGvgo2Q79
|
||||
quz0oIk5hs3eLlUdEYsLGwR6pWJaJyf36vuDsq7iLrLyvHI5irAowO4r1QARAQAB
|
||||
tCVQZWRyYW0gUG91cmFuZyA8dHN1amFuMjAwMEBnbWFpbC5jb20+iQJOBBMBCAA4
|
||||
FiEEGd/fOleb1QnbtXLYvnkwB60i334FAl6cxrwCGwMFCwkIBwIGFQoJCAsCBBYC
|
||||
AwECHgECF4AACgkQvnkwB60i335f9RAAgRpn8gUa/l10UkVAnpM2Cz0MuNMwwCOq
|
||||
IfVnuZuPBtYYiTU5Su++/aPZe3fF5B4v61F+XjNi7qeVL2t52X3jZ/iIx9Syasb+
|
||||
vDAIfQ5t6lKXvOptWxf6vteOg6CHbXwpGHbPjUkUS2vQwRikjBnR0SnkrMoXtgSX
|
||||
amPFqsitNrOhEJfeDfo0NzKESZuliWrCFt2v8c5q18G8cCZAvPLBlGuwRl58cDep
|
||||
3EIibMI/9MUSJbKoiHlK+LcHtG7BQTNis/e7Pe1PkRmExfhxe1lNajtOx8FO72Tq
|
||||
B6zY6drippM9VaIc1M+zp9BRpsFu8whOmapCqlXHRgAK8xTdQRIGInQFqLWPOxSC
|
||||
f0B6N+EvQvgkyFQ1rW+u91OJBma46uKkhrwf+mDttVRncaIAkgE6e6pqm18yIPFk
|
||||
D42rt/yHcOl+2qkcJS3gPcg5UvlCzqOwg1rKZQIk+TcPuDx3r2UghDEYZN9X6vw3
|
||||
zCBufr7ygZNf4tkbnVARFWTR4GzyCseFkWgOVZL9DccAhs8NeMy1WLkUzB75adeR
|
||||
3LONmEL7xOI8FuknKY4e6EcWhmstNIDgXfRe0hwO0VBdW3unoZC/K2ZM/ZuZyMdK
|
||||
TFjvYJrNewmymKge68wo0054bGZn8oz17i2AosJz7kW+ITsxmxhVcpfl4bav9Neq
|
||||
RpQwhnhK9bC5Ag0EXpzGvAEQANbeRHFbpgQVIqV9WVOVnTj4FIqrTPTPKKa02vJA
|
||||
7tGpgFapgvjdxnMxJfV6wuwOBUUFLR7DrXlV8EVFAYc5qTIeSQXvJsWw6gQ3+f0D
|
||||
z13oGOhZPBIzIKnV/MZI/jhIio8kSPWAuM5hR2X9Hvw3/CLo+H+hZZ6cFYoCxrQS
|
||||
tTzcKMkdQizLLa+WNbqUSxg6I/P5k/smUDY9gKW7RtI5t/PupA3WTnsVD6CYWa3Q
|
||||
c1O/1mUgqT6nQ5N9KCPpjZQRT6D6eIMmePtS85z4PPeYMJxPsKRYWPGRxKhCSdZl
|
||||
/0wsC8aRtmwYT729e0ZgTAmUnj+rQp5hboF/ZPFjIoXR9G+0HnoY0a/nqVO4lUON
|
||||
AV25GnMFGVyiHHlbH/0gboywwnzEg8BZbk+Z/61oOzBIW09sfG8fn8bsbkpL+nHf
|
||||
Mi/Vauge6wSfw7I5AfSiwrSDNHmKVsu39koWV6JGxEeFr2MffF+CuaoJCNOr/ZII
|
||||
SYR5ku3Y/lMKyUH1Oas0RWzFrdRcInqYK90A0x083zP4V445MvCwbRPzQAkm9wOP
|
||||
kILLhE5FW+9/O0/9bpx4joJUDLV4d3hFZy7GSHKiZUs1QW6BV75JQKqoi+cVt+/L
|
||||
+o1S8CMNekjqdC2mWRosM3doo51zT/FWNzQA1QcoZP2hORJDfw66y+4wPq6o8y1W
|
||||
jR35ABEBAAGJAjYEGAEIACAWIQQZ3986V5vVCdu1cti+eTAHrSLffgUCXpzGvAIb
|
||||
DAAKCRC+eTAHrSLffgbJD/4qW5YOo/BayBhaUh2L7VP7JNlECb/2xNNOFKI1NjNr
|
||||
nOmgSJLzf74Uhmt5W+iVjmJBHrDceprIPkizmPrn90kIsPIMtHIDNxzUgKZHbnza
|
||||
j1vZyAeC+JV79X1hOVpprj1TJwy65lpxXNyYnGqeIOgyFokn9fOHXv8aMQwpNuUr
|
||||
bdUJ1C75jYrvwy/NR1DczIFFYgsbkDGDtjVBjyMc5JAgvUBz37/iVPJfWP6dKVnf
|
||||
abRnUVzHgvgK7bnab00SA1TiWvjHURGjo+5rnRtv8X/AgStc2Phjq68TMIgMn0F2
|
||||
kjUVvfQotNqzo9madNshvUDmsGtAzKh4e0dS1ear7u3nRp4Z7fqSrTEtXKNbEPwZ
|
||||
wdWrWmmQLacNQBSe/FtcMzGF6xIVr4lnrL0bFjqBdQpdTC7vns3QSKk8/GFiEfpv
|
||||
kzXrDbGV7jX2OWDjNHKcmXX2+E1CsNaJgS7zOgZw5jvbvlTLJUwyYNlM1VLI2OFW
|
||||
Oa86l8pqli+B7rpTbsAE9Ut8qUaWjm87oUNSJbaKgqNnMaE+b/8VJaEeWHgQJwsD
|
||||
bJSJ/O/vzlRtDjOJ1JDlMRLs7TnOFeUh5pgwyaJoidYbJEiGlMGJbI6BjwhDTBFO
|
||||
NLJtd3SsRjc7ICtGdCvej59IvCDTjxtkhx5okF03APi1aXpHQrE18/arFD7BpoGO
|
||||
sw==
|
||||
=gSIv
|
||||
mQINBFXQeMMBEACif4+9pTrC6uNmRng0ZbzLh7p3cazmbnp2YFgDQDJZ7ZNmebxy
|
||||
ngRuRhjGuDcFAL/37BwJnrBpfZFK9ljoH4Fo5Jm9cOELaTy7AIcEiV9dKMyrKF1E
|
||||
C76d8jHVuzuPbI92DkFdLZAdk+qjrrAy0x43PvUd+aaBGLcFs1ZMk7gOvElc2d95
|
||||
zWWSp5anjukmGbp+EsStnWJkF6VHj56qmklfYy5ioiVBOSpXo/RsACAcIlz8C8A1
|
||||
d4tNMiB2uF2OrUfrL8DD6m3nBqep+AYbIQrxMl9kUQH3I33e9kH/L+SHQyE6phS8
|
||||
Czq06WjV4TcJ9VWxm7hQCNLYSxhZYYr1AW45lS5+xmfBOq2qeLgvjbFxa8PPrsp6
|
||||
Bqgt8MjwUkXjU5IB7YulUBvFU2l0MJZWDBuNy0oNtCe1cU3JyIqLKjvzQQQ9eD5L
|
||||
o3Ul704TLHz0z+67Rxh05Mi4JvyFMjnooSJkNH8/7yXoBN0ZGOh1/5zMU1gK5bmP
|
||||
6hKgis2exSZNIS74mF6/PqGgcwk3PyI4T3keUQoNPj11M2EznLHxY19QZfQ5oMed
|
||||
8xOlHKjpcm8PYMB4gduNXlV7gI9h7UxuC5GuPiP2lmM6wUyHu48divxDk5UYgPEC
|
||||
xlPI2wHCNDsuy0EruCYIvrMSZfpYCCSrmXiOORBLO5qXkauILLkJarHqjQARAQAB
|
||||
tCBBbGYgR2FpZGEgPGFnYWlkYUBzaWR1Y3Rpb24ub3JnPokCOAQTAQIAIgUCVdB4
|
||||
wwIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQQsnI069epeOT2xAAgSHf
|
||||
41103cnElGf6TokPl4J6hdRPy2CUAjmBtMfr8eajYvGDGgnmsh9AGYGURjfFVCCf
|
||||
Ag+8b6nF3xg03UmgsuSO8H78HGv9kKzF9aHmLt+SXq3jUX+LnIkFHErZWjFAKdJr
|
||||
luu1j6ltxLe9PQljxZnugzMaUbW8eEPKvcriiDn3S4/DtikW/jpGA0MTY4ZWs9pZ
|
||||
L/6iRRH99L2X/cWO4sCgDXCTt4oK0f5OvwiuCoVOM+PYoIm31JICCKOlqamkCn7d
|
||||
2KH3nsy0v7tXgnrnb/zr8jVGsZLzUE51AFOzb5Ec74/2SAq8X4gbTppttLXEIooq
|
||||
nbepitW/PePkPY5gpfwHtFbl88qFnir+ABMefqRZkzeh0tsxJVLVHGP1KZykXpv7
|
||||
96A6Q1h7Zo9Ny7WwN5Xl02g35LVCaPyzd3A8A4315uMuP3iziq57UktKqh9d5S3t
|
||||
jfK7e9UfFQZBLfxn2sNPsjdYSNUQp/PXTTk/599h359WVuUIR866T8K7N7EEon3p
|
||||
qLItZljQ9Nmr/yGwKi9iQgi2LtZj5KUcF1zBLzZKf95FvoqSZqBXdFSjm+eYGaCH
|
||||
Q2IBnhyP92lEknSK9ystUJXmY69tQKBFqJxScwaS+7a/rfLKssQjSWxqk+SX4QeW
|
||||
e9z9FUpo71bq0Zkc/M9aOCoEEmhg4Ob/JWy08oC5Ag0EVdB4wwEQAKZDCc/C41y0
|
||||
omLFCAJybvHiFScM+jOpyGpQvceoviEhIT7h1br/pnSEMkgPQEDPWJGtKueg1/94
|
||||
sXTH24uefr3Y6JdZoBtprxl4JXUoOndgq1QH1xuUsy3/9YWU8Qboy9j8a8w0oCDE
|
||||
T8Z03KHCwqzD3K+44jhmhF+0eLoaaY8ohS8ziP+DcFKVHyatmS5yCCdjVrj6PxMp
|
||||
uy/y5SXT1kmiPdVAIzQlM5DlN6o46TV+BH0pPvVYjtwf31o0FckJxy5S1v0koCNB
|
||||
vX2b7tTDPKzn8G18eUVhGoUTZBUCp1gg36wJ0YY4xgZ9vI/xDCeHeAkyvGtaTAoy
|
||||
qP4rHoUO5KVRSDh7frSlrdbLGWHaQwOhcqoKd4qP/164wHPGkgHL1vztdOc7l1wx
|
||||
q3gMh2uwmJR0NRrw4WVuaIqL9lEbGBNijlmGsuqXfsMRhc/qoqgVDWvrcCtEoOwl
|
||||
TONGobW3jpCCjpa9SeGNjxuY6IVLn0lfX4hItNVY9sFA+H+yj4uBQ7zsmMUXafxt
|
||||
Yllm0f98yGNg5lnJg4bLOYu3IkpogUKNA3qkZ+6vRtwH70/bJGp7qdx/3G4W5dMX
|
||||
asd/rJjdELW+R/NVULAmK1ETSklaa3Z6vbTu8bN8gvP8pmMJ8f/U8+qzkuAqc201
|
||||
Z4O+s7ZsQfTiz5mm7zPGIYTnppDSno/rABEBAAGJAh8EGAECAAkFAlXQeMMCGwwA
|
||||
CgkQQsnI069epeMt0g/+JrwLhULD6NOxaLgxboh/KZkh/7ViU4cB+QPT8JIcWxkZ
|
||||
zj8uk85TUitEUzKmjp/ItCrhQE5WNNWbz/FBnAuLtaQuHhcHMA3Vu95UUCGi1vyZ
|
||||
ZRlS3YRM6S9BOzrjG7fGQJmO/RU3g6rb0TAwGFxDHj8t4JEDTc3zASG7wV/VTn06
|
||||
d8XIH9CZOw3kUuhkQ3OR/PEj1BCeCC+caC+tBjO0fgvDp8RV7NFQQ9kH8R3/xlWd
|
||||
6KMPtILE6fUft6LubWRGd1P5JBuzXivELolASajewbYtL/s87CCji3ngq0aT9raK
|
||||
m02wqFzNbX1iv+w2iqPQXq6pdRyxtJ8+Q8Z7zEBGJS5nkrYjsLTduZIjJHYHYH7f
|
||||
3/ydVjQ3z12iqHKElgaRI7RUmpNiNxVIr+TtuxzeC6G+CF++XNkUtJODvCmRaoJS
|
||||
waYsitz8+LSv3tawZJ0iQkKc9nerQMuBD+AzIr3i4NgXiEIN513esUtnKzeyIIsL
|
||||
ntUcBjXKuLCj8OZrZtexjq7edWWbN57/3ikyS2Z7y0i3O30qk5jmccSaS6kA7xTY
|
||||
WCDFzbN2v2y+vGu9KYn+2HtrP2BtNa8JTh3waNeLUTpn4GV4mMrsZjOy6vhhHb91
|
||||
1TKfI1gvjk7lE9xaWmcDjdI55dw3jIq8kK9SdgORGq9/S3g7KJNRjme+6GjqQfk=
|
||||
=h7ww
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
6
debian/watch
vendored
6
debian/watch
vendored
@ -1,5 +1,3 @@
|
||||
version=4
|
||||
opts="searchmode=plain, \
|
||||
pgpsigurlmangle=s/$/.asc/, \
|
||||
uversionmangle=s/(\d+\.\d+\.\d+).*/$1/" \
|
||||
https://api.github.com/repos/lxqt/@PACKAGE@/releases https:\/\/github.com\/lxqt\/@PACKAGE@\/releases\/download\/@ANY_VERSION@\/@PACKAGE@-@ANY_VERSION@.tar.xz
|
||||
opts="pgpsigurlmangle=s/$/.asc/" \
|
||||
https://github.com/lxde/libfm-qt/releases .*/libfm-qt-([\d\.]+).tar.xz
|
||||
|
195
src/CMakeLists.txt
Normal file
195
src/CMakeLists.txt
Normal file
@ -0,0 +1,195 @@
|
||||
include_directories(
|
||||
"${LIBFM_INCLUDE_DIRS}"
|
||||
"${LIBFM_INCLUDEDIR}/libfm" # to workaround incorrect #include in fm-actions.
|
||||
"${LIBMENUCACHE_INCLUDE_DIRS}"
|
||||
"${SYSTEM_LIBS_INCLUDE_DIRS}"
|
||||
"${XCB_INCLUDE_DIRS}"
|
||||
)
|
||||
|
||||
link_directories(
|
||||
"${LIBFM_LIBRARY_DIRS}"
|
||||
"${LIBMENUCACHE_LIBRARY_DIRS}"
|
||||
"${SYSTEM_LIBS_LIBRARY_DIRS}"
|
||||
)
|
||||
|
||||
set(libfm_SRCS
|
||||
libfmqt.cpp
|
||||
bookmarkaction.cpp
|
||||
sidepane.cpp
|
||||
icontheme.cpp
|
||||
filelauncher.cpp
|
||||
foldermodel.cpp
|
||||
foldermodelitem.cpp
|
||||
cachedfoldermodel.cpp
|
||||
proxyfoldermodel.cpp
|
||||
folderview.cpp
|
||||
folderitemdelegate.cpp
|
||||
createnewmenu.cpp
|
||||
filemenu.cpp
|
||||
foldermenu.cpp
|
||||
filepropsdialog.cpp
|
||||
applaunchcontext.cpp
|
||||
placesview.cpp
|
||||
placesmodel.cpp
|
||||
placesmodelitem.cpp
|
||||
dirtreeview.cpp
|
||||
dirtreemodel.cpp
|
||||
dirtreemodelitem.cpp
|
||||
dnddest.cpp
|
||||
mountoperation.cpp
|
||||
mountoperationpassworddialog.cpp
|
||||
mountoperationquestiondialog.cpp
|
||||
fileoperation.cpp
|
||||
fileoperationdialog.cpp
|
||||
renamedialog.cpp
|
||||
pathedit.cpp
|
||||
colorbutton.cpp
|
||||
fontbutton.cpp
|
||||
browsehistory.cpp
|
||||
utilities.cpp
|
||||
dndactionmenu.cpp
|
||||
editbookmarksdialog.cpp
|
||||
thumbnailloader.cpp
|
||||
execfiledialog.cpp
|
||||
appchoosercombobox.cpp
|
||||
appmenuview.cpp
|
||||
appchooserdialog.cpp
|
||||
filesearchdialog.cpp
|
||||
fm-search.c # might be moved to libfm later
|
||||
xdndworkaround.cpp
|
||||
)
|
||||
|
||||
set(libfm_UIS
|
||||
file-props.ui
|
||||
file-operation-dialog.ui
|
||||
rename-dialog.ui
|
||||
mount-operation-password.ui
|
||||
edit-bookmarks.ui
|
||||
exec-file.ui
|
||||
app-chooser-dialog.ui
|
||||
filesearch.ui
|
||||
)
|
||||
|
||||
qt5_wrap_ui(libfm_UIS_H ${libfm_UIS})
|
||||
|
||||
# add translation for libfm-qt
|
||||
lxqt_translate_ts(QM_FILES
|
||||
UPDATE_TRANSLATIONS ${UPDATE_TRANSLATIONS}
|
||||
SOURCES ${libfm_SRCS} ${libfm_UIS}
|
||||
INSTALL_DIR "${CMAKE_INSTALL_DATADIR}/libfm-qt/translations"
|
||||
PULL_TRANSLATIONS ${PULL_TRANSLATIONS}
|
||||
CLEAN_TRANSLATIONS ${CLEAN_TRANSLATIONS}
|
||||
TRANSLATIONS_REPO ${TRANSLATIONS_REPO}
|
||||
TRANSLATIONS_REFSPEC ${TRANSLATIONS_REFSPEC}
|
||||
)
|
||||
|
||||
add_library(${LIBFM_QT_LIBRARY_NAME} SHARED
|
||||
${libfm_SRCS}
|
||||
${libfm_UIS_H}
|
||||
${QM_FILES}
|
||||
)
|
||||
|
||||
set_property(
|
||||
TARGET ${LIBFM_QT_LIBRARY_NAME} APPEND
|
||||
PROPERTY COMPILE_DEFINITIONS
|
||||
LIBFM_DATA_DIR="${CMAKE_INSTALL_FULL_DATADIR}/libfm-qt"
|
||||
)
|
||||
|
||||
# only turn on custom actions support if it is enabled in libfm.
|
||||
if(EXISTS "${LIBFM_INCLUDEDIR}/libfm/fm-actions.h")
|
||||
set_property(TARGET ${LIBFM_QT_LIBRARY_NAME} APPEND PROPERTY COMPILE_DEFINITIONS CUSTOM_ACTIONS)
|
||||
endif()
|
||||
|
||||
install(EXPORT
|
||||
"${LIBFM_QT_LIBRARY_NAME}-targets"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${LIBFM_QT_LIBRARY_NAME}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
target_link_libraries(${LIBFM_QT_LIBRARY_NAME}
|
||||
Qt5::Widgets
|
||||
Qt5::X11Extras
|
||||
${LIBFM_LIBRARIES}
|
||||
${LIBMENUCACHE_LIBRARIES}
|
||||
${SYSTEM_LIBS_LIBRARIES}
|
||||
${XCB_LIBRARIES}
|
||||
)
|
||||
|
||||
# set libtool soname
|
||||
set_target_properties(${LIBFM_QT_LIBRARY_NAME} PROPERTIES
|
||||
VERSION ${LIBFM_QT_LIB_VERSION}
|
||||
SOVERSION ${LIBFM_QT_LIB_SOVERSION}
|
||||
)
|
||||
|
||||
target_include_directories(${LIBFM_QT_LIBRARY_NAME}
|
||||
PRIVATE "${LIB_XCB_INDLUDE_DIRS}"
|
||||
PRIVATE "${Qt5Gui_PRIVATE_INCLUDE_DIRS}"
|
||||
INTERFACE "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/${LIBFM_QT_LIBRARY_NAME}_export.h"
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/libfm-qt"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
file(GLOB libfm_HS "${CMAKE_CURRENT_SOURCE_DIR}/*.h")
|
||||
# install include header files (FIXME: can we make this cleaner? should dir name be versioned?)
|
||||
install(FILES ${libfm_HS}
|
||||
DESTINATION "${CMAKE_INSTALL_INCLUDEDIR}/libfm-qt"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
generate_export_header(${LIBFM_QT_LIBRARY_NAME}
|
||||
EXPORT_MACRO_NAME LIBFM_QT_API
|
||||
)
|
||||
|
||||
configure_package_config_file(
|
||||
"${PROJECT_SOURCE_DIR}/cmake/fm-qt-config.cmake.in"
|
||||
"${PROJECT_BINARY_DIR}/install/${LIBFM_QT_LIBRARY_NAME}-config.cmake"
|
||||
INSTALL_DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${LIBFM_QT_LIBRARY_NAME}"
|
||||
)
|
||||
|
||||
install(FILES
|
||||
"${PROJECT_BINARY_DIR}/install/${LIBFM_QT_LIBRARY_NAME}-config.cmake"
|
||||
DESTINATION "${CMAKE_INSTALL_DATADIR}/cmake/${LIBFM_QT_LIBRARY_NAME}"
|
||||
COMPONENT Devel
|
||||
)
|
||||
|
||||
# FIXME: add libtool version to the lib (soname) later.
|
||||
# FIXME: only export public symbols
|
||||
|
||||
install(TARGETS ${LIBFM_QT_LIBRARY_NAME}
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
EXPORT "${LIBFM_QT_LIBRARY_NAME}-targets"
|
||||
LIBRARY DESTINATION "${CMAKE_INSTALL_LIBDIR}"
|
||||
PUBLIC_HEADER
|
||||
COMPONENT Runtime
|
||||
)
|
||||
|
||||
export(TARGETS ${LIBFM_QT_LIBRARY_NAME}
|
||||
FILE "${CMAKE_BINARY_DIR}/${LIBFM_QT_LIBRARY_NAME}-targets.cmake"
|
||||
EXPORT_LINK_INTERFACE_LIBRARIES
|
||||
)
|
||||
|
||||
# install a pkgconfig file for libfm-qt
|
||||
set(REQUIRED_QT "Qt5Widgets >= ${REQUIRED_QT_VERSION} Qt5X11Extras >= ${REQUIRED_QT_VERSION}")
|
||||
configure_file(libfm-qt.pc.in lib${LIBFM_QT_LIBRARY_NAME}.pc @ONLY)
|
||||
# FreeBSD loves to install files to different locations
|
||||
# http://www.freebsd.org/doc/handbook/dirstructure.html
|
||||
if(${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD")
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/lib${LIBFM_QT_LIBRARY_NAME}.pc"
|
||||
DESTINATION libdata/pkgconfig
|
||||
COMPONENT Devel
|
||||
)
|
||||
else()
|
||||
install(FILES
|
||||
"${CMAKE_CURRENT_BINARY_DIR}/lib${LIBFM_QT_LIBRARY_NAME}.pc"
|
||||
DESTINATION "${CMAKE_INSTALL_LIBDIR}/pkgconfig"
|
||||
COMPONENT Devel
|
||||
)
|
||||
endif()
|
||||
|
||||
# prevent the generated files from being deleted during make cleaner
|
||||
set_directory_properties(PROPERTIES CLEAN_NO_CUSTOM true)
|
183
src/app-chooser-dialog.ui
Normal file
183
src/app-chooser-dialog.ui
Normal file
@ -0,0 +1,183 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AppChooserDialog</class>
|
||||
<widget class="QDialog" name="AppChooserDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>432</width>
|
||||
<height>387</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Choose an Application</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLabel" name="fileTypeHeader"/>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>1</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Installed Applications</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="Fm::AppMenuView" name="appMenuView"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>Custom Command</string>
|
||||
</attribute>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Command line to execute:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0" colspan="2">
|
||||
<widget class="QLineEdit" name="cmdLine"/>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Application name:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLineEdit" name="appName"/>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="text">
|
||||
<string><b>These special codes can be used in the command line:</b>
|
||||
<ul>
|
||||
<li><b>%f</b>: Represents a single file name</li>
|
||||
<li><b>%F</b>: Represents multiple file names</li>
|
||||
<li><b>%u</b>: Represents a single URI of the file</li>
|
||||
<li><b>%U</b>: Represents multiple URIs</li>
|
||||
</ul></string>
|
||||
</property>
|
||||
<property name="textFormat">
|
||||
<enum>Qt::RichText</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="keepTermOpen">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Keep terminal window open after command execution</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="useTerminal">
|
||||
<property name="text">
|
||||
<string>Execute in terminal emulator</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="setDefault">
|
||||
<property name="text">
|
||||
<string>Set selected application as default action of this file type</string>
|
||||
</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>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Fm::AppMenuView</class>
|
||||
<extends>QTreeView</extends>
|
||||
<header>appmenuview.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>AppChooserDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>227</x>
|
||||
<y>359</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>AppChooserDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>295</x>
|
||||
<y>365</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>useTerminal</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>keepTermOpen</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>72</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>79</x>
|
||||
<y>282</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
153
src/appchoosercombobox.cpp
Normal file
153
src/appchoosercombobox.cpp
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "appchoosercombobox.h"
|
||||
#include "icontheme.h"
|
||||
#include "appchooserdialog.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
AppChooserComboBox::AppChooserComboBox(QWidget* parent):
|
||||
QComboBox(parent),
|
||||
mimeType_(NULL),
|
||||
appInfos_(NULL),
|
||||
defaultApp_(NULL),
|
||||
defaultAppIndex_(-1),
|
||||
prevIndex_(0),
|
||||
blockOnCurrentIndexChanged_(false) {
|
||||
|
||||
// the new Qt5 signal/slot syntax cannot handle overloaded methods by default
|
||||
// hence a type-casting is needed here. really ugly!
|
||||
// reference: http://qt-project.org/forums/viewthread/21513
|
||||
connect((QComboBox*)this, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &AppChooserComboBox::onCurrentIndexChanged);
|
||||
}
|
||||
|
||||
AppChooserComboBox::~AppChooserComboBox() {
|
||||
if(mimeType_)
|
||||
fm_mime_type_unref(mimeType_);
|
||||
if(defaultApp_)
|
||||
g_object_unref(defaultApp_);
|
||||
// delete GAppInfo objects stored for Combobox
|
||||
if(appInfos_) {
|
||||
g_list_foreach(appInfos_, (GFunc)g_object_unref, NULL);
|
||||
g_list_free(appInfos_);
|
||||
}
|
||||
}
|
||||
|
||||
void AppChooserComboBox::setMimeType(FmMimeType* mimeType) {
|
||||
clear();
|
||||
if(mimeType_)
|
||||
fm_mime_type_unref(mimeType_);
|
||||
|
||||
mimeType_ = fm_mime_type_ref(mimeType);
|
||||
if(mimeType_) {
|
||||
const char* typeName = fm_mime_type_get_type(mimeType_);
|
||||
defaultApp_ = g_app_info_get_default_for_type(typeName, FALSE);
|
||||
appInfos_ = g_app_info_get_all_for_type(typeName);
|
||||
int i = 0;
|
||||
for(GList* l = appInfos_; l; l = l->next, ++i) {
|
||||
GAppInfo* app = G_APP_INFO(l->data);
|
||||
GIcon* gicon = g_app_info_get_icon(app);
|
||||
QString name = QString::fromUtf8(g_app_info_get_name(app));
|
||||
// QVariant data = qVariantFromValue<void*>(app);
|
||||
// addItem(IconTheme::icon(gicon), name, data);
|
||||
addItem(IconTheme::icon(gicon), name);
|
||||
if(g_app_info_equal(app, defaultApp_))
|
||||
defaultAppIndex_ = i;
|
||||
}
|
||||
}
|
||||
// add "Other applications" item
|
||||
insertSeparator(count());
|
||||
addItem(tr("Customize"));
|
||||
if(defaultAppIndex_ != -1)
|
||||
setCurrentIndex(defaultAppIndex_);
|
||||
}
|
||||
|
||||
// returns the currently selected app.
|
||||
GAppInfo* AppChooserComboBox::selectedApp() {
|
||||
return G_APP_INFO(g_list_nth_data(appInfos_, currentIndex()));
|
||||
}
|
||||
|
||||
bool AppChooserComboBox::isChanged() {
|
||||
return (defaultAppIndex_ != currentIndex());
|
||||
}
|
||||
|
||||
void AppChooserComboBox::onCurrentIndexChanged(int index) {
|
||||
if(index == -1 || index == prevIndex_ || blockOnCurrentIndexChanged_)
|
||||
return;
|
||||
|
||||
// the last item is "Customize"
|
||||
if(index == (count() - 1)) {
|
||||
/* TODO: let the user choose an app or add custom actions here. */
|
||||
QWidget* toplevel = topLevelWidget();
|
||||
AppChooserDialog dlg(mimeType_, toplevel);
|
||||
dlg.setWindowModality(Qt::WindowModal);
|
||||
dlg.setCanSetDefault(false);
|
||||
if(dlg.exec() == QDialog::Accepted) {
|
||||
GAppInfo* app = dlg.selectedApp();
|
||||
if(app) {
|
||||
/* see if it's already in the list to prevent duplication */
|
||||
GList* found = NULL;
|
||||
for(found = appInfos_; found; found = found->next) {
|
||||
if(g_app_info_equal(app, G_APP_INFO(found->data)))
|
||||
break;
|
||||
}
|
||||
|
||||
// inserting new items or change current index will recursively trigger onCurrentIndexChanged.
|
||||
// we need to block our handler to prevent recursive calls.
|
||||
blockOnCurrentIndexChanged_ = true;
|
||||
/* if it's already in the list, select it */
|
||||
if(found) {
|
||||
setCurrentIndex(g_list_position(appInfos_, found));
|
||||
g_object_unref(app);
|
||||
}
|
||||
else { /* if it's not found, add it to the list */
|
||||
appInfos_ = g_list_prepend(appInfos_, app);
|
||||
GIcon* gicon = g_app_info_get_icon(app);
|
||||
QString name = QString::fromUtf8(g_app_info_get_name(app));
|
||||
insertItem(0, IconTheme::icon(gicon), name);
|
||||
setCurrentIndex(0);
|
||||
}
|
||||
blockOnCurrentIndexChanged_ = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// block our handler to prevent recursive calls.
|
||||
blockOnCurrentIndexChanged_ = true;
|
||||
// restore to previously selected item
|
||||
setCurrentIndex(prevIndex_);
|
||||
blockOnCurrentIndexChanged_ = false;
|
||||
}
|
||||
else {
|
||||
prevIndex_ = index;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/* get a list of custom apps added with app-chooser.
|
||||
* the returned GList is owned by the combo box and shouldn't be freed. */
|
||||
const GList* AppChooserComboBox::customApps() {
|
||||
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace Fm
|
60
src/appchoosercombobox.h
Normal file
60
src/appchoosercombobox.h
Normal file
@ -0,0 +1,60 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_APPCHOOSERCOMBOBOX_H
|
||||
#define FM_APPCHOOSERCOMBOBOX_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QComboBox>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API AppChooserComboBox : public QComboBox {
|
||||
Q_OBJECT
|
||||
public:
|
||||
~AppChooserComboBox();
|
||||
AppChooserComboBox(QWidget* parent);
|
||||
|
||||
void setMimeType(FmMimeType* mimeType);
|
||||
|
||||
FmMimeType* mimeType() {
|
||||
return mimeType_;
|
||||
}
|
||||
|
||||
GAppInfo* selectedApp();
|
||||
// const GList* customApps();
|
||||
|
||||
bool isChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onCurrentIndexChanged(int index);
|
||||
|
||||
private:
|
||||
FmMimeType* mimeType_;
|
||||
GList* appInfos_; // applications used to open the file type
|
||||
GAppInfo* defaultApp_; // default application used to open the file type
|
||||
int defaultAppIndex_;
|
||||
int prevIndex_;
|
||||
bool blockOnCurrentIndexChanged_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_APPCHOOSERCOMBOBOX_H
|
286
src/appchooserdialog.cpp
Normal file
286
src/appchooserdialog.cpp
Normal file
@ -0,0 +1,286 @@
|
||||
/*
|
||||
* Copyright 2010-2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
* Copyright 2012-2013 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
*
|
||||
* 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 "appchooserdialog.h"
|
||||
#include "ui_app-chooser-dialog.h"
|
||||
#include <QPushButton>
|
||||
#include <gio/gdesktopappinfo.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
AppChooserDialog::AppChooserDialog(FmMimeType* mimeType, QWidget* parent, Qt::WindowFlags f):
|
||||
QDialog(parent, f),
|
||||
ui(new Ui::AppChooserDialog()),
|
||||
mimeType_(NULL),
|
||||
canSetDefault_(true),
|
||||
selectedApp_(NULL) {
|
||||
ui->setupUi(this);
|
||||
|
||||
connect(ui->appMenuView, &AppMenuView::selectionChanged, this, &AppChooserDialog::onSelectionChanged);
|
||||
connect(ui->tabWidget, &QTabWidget::currentChanged, this, &AppChooserDialog::onTabChanged);
|
||||
|
||||
if(!ui->appMenuView->isAppSelected())
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false); // disable OK button
|
||||
|
||||
if(mimeType)
|
||||
setMimeType(mimeType);
|
||||
}
|
||||
|
||||
AppChooserDialog::~AppChooserDialog() {
|
||||
delete ui;
|
||||
if(mimeType_)
|
||||
fm_mime_type_unref(mimeType_);
|
||||
if(selectedApp_)
|
||||
g_object_unref(selectedApp_);
|
||||
}
|
||||
|
||||
bool AppChooserDialog::isSetDefault() {
|
||||
return ui->setDefault->isChecked();
|
||||
}
|
||||
|
||||
|
||||
static void on_temp_appinfo_destroy(gpointer data, GObject* objptr) {
|
||||
char* filename = (char*)data;
|
||||
if(g_unlink(filename) < 0)
|
||||
g_critical("failed to remove %s", filename);
|
||||
/* else
|
||||
qDebug("temp file %s removed", filename); */
|
||||
g_free(filename);
|
||||
}
|
||||
|
||||
static GAppInfo* app_info_create_from_commandline(const char* commandline,
|
||||
const char* application_name,
|
||||
const char* bin_name,
|
||||
const char* mime_type,
|
||||
gboolean terminal, gboolean keep) {
|
||||
GAppInfo* app = NULL;
|
||||
char* dirname = g_build_filename(g_get_user_data_dir(), "applications", NULL);
|
||||
const char* app_basename = strrchr(bin_name, '/');
|
||||
|
||||
if(app_basename)
|
||||
app_basename++;
|
||||
else
|
||||
app_basename = bin_name;
|
||||
if(g_mkdir_with_parents(dirname, 0700) == 0) {
|
||||
char* filename = g_strdup_printf("%s/userapp-%s-XXXXXX.desktop", dirname, app_basename);
|
||||
int fd = g_mkstemp(filename);
|
||||
if(fd != -1) {
|
||||
GString* content = g_string_sized_new(256);
|
||||
g_string_printf(content,
|
||||
"[" G_KEY_FILE_DESKTOP_GROUP "]\n"
|
||||
G_KEY_FILE_DESKTOP_KEY_TYPE "=" G_KEY_FILE_DESKTOP_TYPE_APPLICATION "\n"
|
||||
G_KEY_FILE_DESKTOP_KEY_NAME "=%s\n"
|
||||
G_KEY_FILE_DESKTOP_KEY_EXEC "=%s\n"
|
||||
G_KEY_FILE_DESKTOP_KEY_CATEGORIES "=Other;\n"
|
||||
G_KEY_FILE_DESKTOP_KEY_NO_DISPLAY "=true\n",
|
||||
application_name,
|
||||
commandline
|
||||
);
|
||||
if(mime_type)
|
||||
g_string_append_printf(content,
|
||||
G_KEY_FILE_DESKTOP_KEY_MIME_TYPE "=%s\n",
|
||||
mime_type);
|
||||
g_string_append_printf(content,
|
||||
G_KEY_FILE_DESKTOP_KEY_TERMINAL "=%s\n",
|
||||
terminal ? "true" : "false");
|
||||
if(terminal)
|
||||
g_string_append_printf(content, "X-KeepTerminal=%s\n",
|
||||
keep ? "true" : "false");
|
||||
close(fd); /* g_file_set_contents() may fail creating duplicate */
|
||||
if(g_file_set_contents(filename, content->str, content->len, NULL)) {
|
||||
char* fbname = g_path_get_basename(filename);
|
||||
app = G_APP_INFO(g_desktop_app_info_new(fbname));
|
||||
g_free(fbname);
|
||||
/* if there is mime_type set then created application will be
|
||||
saved for the mime type (see fm_choose_app_for_mime_type()
|
||||
below) but if not then we should remove this temp. file */
|
||||
if(!mime_type || !application_name[0])
|
||||
/* save the name so this file will be removed later */
|
||||
g_object_weak_ref(G_OBJECT(app), on_temp_appinfo_destroy,
|
||||
g_strdup(filename));
|
||||
}
|
||||
else
|
||||
g_unlink(filename);
|
||||
g_string_free(content, TRUE);
|
||||
}
|
||||
g_free(filename);
|
||||
}
|
||||
g_free(dirname);
|
||||
return app;
|
||||
}
|
||||
|
||||
inline static char* get_binary(const char* cmdline, gboolean* arg_found) {
|
||||
/* see if command line contains %f, %F, %u, or %U. */
|
||||
const char* p = strstr(cmdline, " %");
|
||||
if(p) {
|
||||
if(!strchr("fFuU", *(p + 2)))
|
||||
p = NULL;
|
||||
}
|
||||
if(arg_found)
|
||||
*arg_found = (p != NULL);
|
||||
if(p)
|
||||
return g_strndup(cmdline, p - cmdline);
|
||||
else
|
||||
return g_strdup(cmdline);
|
||||
}
|
||||
|
||||
GAppInfo* AppChooserDialog::customCommandToApp() {
|
||||
GAppInfo* app = NULL;
|
||||
QByteArray cmdline = ui->cmdLine->text().toLocal8Bit();
|
||||
QByteArray app_name = ui->appName->text().toUtf8();
|
||||
if(!cmdline.isEmpty()) {
|
||||
gboolean arg_found = FALSE;
|
||||
char* bin1 = get_binary(cmdline.constData(), &arg_found);
|
||||
qDebug("bin1 = %s", bin1);
|
||||
/* see if command line contains %f, %F, %u, or %U. */
|
||||
if(!arg_found) { /* append %f if no %f, %F, %u, or %U was found. */
|
||||
cmdline += " %f";
|
||||
}
|
||||
|
||||
/* FIXME: is there any better way to do this? */
|
||||
/* We need to ensure that no duplicated items are added */
|
||||
if(mimeType_) {
|
||||
MenuCache* menu_cache;
|
||||
/* see if the command is already in the list of known apps for this mime-type */
|
||||
GList* apps = g_app_info_get_all_for_type(fm_mime_type_get_type(mimeType_));
|
||||
GList* l;
|
||||
for(l = apps; l; l = l->next) {
|
||||
GAppInfo* app2 = G_APP_INFO(l->data);
|
||||
const char* cmd = g_app_info_get_commandline(app2);
|
||||
char* bin2 = get_binary(cmd, NULL);
|
||||
if(g_strcmp0(bin1, bin2) == 0) {
|
||||
app = G_APP_INFO(g_object_ref(app2));
|
||||
qDebug("found in app list");
|
||||
g_free(bin2);
|
||||
break;
|
||||
}
|
||||
g_free(bin2);
|
||||
}
|
||||
g_list_foreach(apps, (GFunc)g_object_unref, NULL);
|
||||
g_list_free(apps);
|
||||
if(app)
|
||||
goto _out;
|
||||
|
||||
/* see if this command can be found in menu cache */
|
||||
menu_cache = menu_cache_lookup("applications.menu");
|
||||
if(menu_cache) {
|
||||
MenuCacheDir* root_dir = menu_cache_dup_root_dir(menu_cache);
|
||||
if(root_dir) {
|
||||
GSList* all_apps = menu_cache_list_all_apps(menu_cache);
|
||||
GSList* l;
|
||||
for(l = all_apps; l; l = l->next) {
|
||||
MenuCacheApp* ma = MENU_CACHE_APP(l->data);
|
||||
const char* exec = menu_cache_app_get_exec(ma);
|
||||
char* bin2;
|
||||
if(exec == NULL) {
|
||||
g_warning("application %s has no Exec statement", menu_cache_item_get_id(MENU_CACHE_ITEM(ma)));
|
||||
continue;
|
||||
}
|
||||
bin2 = get_binary(exec, NULL);
|
||||
if(g_strcmp0(bin1, bin2) == 0) {
|
||||
app = G_APP_INFO(g_desktop_app_info_new(menu_cache_item_get_id(MENU_CACHE_ITEM(ma))));
|
||||
qDebug("found in menu cache");
|
||||
menu_cache_item_unref(MENU_CACHE_ITEM(ma));
|
||||
g_free(bin2);
|
||||
break;
|
||||
}
|
||||
menu_cache_item_unref(MENU_CACHE_ITEM(ma));
|
||||
g_free(bin2);
|
||||
}
|
||||
g_slist_free(all_apps);
|
||||
menu_cache_item_unref(MENU_CACHE_ITEM(root_dir));
|
||||
}
|
||||
menu_cache_unref(menu_cache);
|
||||
}
|
||||
if(app)
|
||||
goto _out;
|
||||
}
|
||||
|
||||
/* FIXME: g_app_info_create_from_commandline force the use of %f or %u, so this is not we need */
|
||||
app = app_info_create_from_commandline(cmdline.constData(), app_name.constData(), bin1,
|
||||
mimeType_ ? fm_mime_type_get_type(mimeType_) : NULL,
|
||||
ui->useTerminal->isChecked(), ui->keepTermOpen->isChecked());
|
||||
_out:
|
||||
g_free(bin1);
|
||||
}
|
||||
return app;
|
||||
}
|
||||
|
||||
void AppChooserDialog::accept() {
|
||||
QDialog::accept();
|
||||
|
||||
if(ui->tabWidget->currentIndex() == 0) {
|
||||
selectedApp_ = ui->appMenuView->selectedApp();
|
||||
}
|
||||
else { // custom command line
|
||||
selectedApp_ = customCommandToApp();
|
||||
}
|
||||
|
||||
if(selectedApp_) {
|
||||
if(mimeType_ && fm_mime_type_get_type(mimeType_) && g_app_info_get_name(selectedApp_)[0]) {
|
||||
/* add this app to the mime-type */
|
||||
#if GLIB_CHECK_VERSION(2, 27, 6)
|
||||
g_app_info_set_as_last_used_for_type(selectedApp_, fm_mime_type_get_type(mimeType_), NULL);
|
||||
#else
|
||||
g_app_info_add_supports_type(selectedApp_, fm_mime_type_get_type(mimeType_), NULL);
|
||||
#endif
|
||||
/* if need to set default */
|
||||
if(ui->setDefault->isChecked())
|
||||
g_app_info_set_as_default_for_type(selectedApp_, fm_mime_type_get_type(mimeType_), NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AppChooserDialog::onSelectionChanged() {
|
||||
bool isAppSelected = ui->appMenuView->isAppSelected();
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(isAppSelected);
|
||||
}
|
||||
|
||||
void AppChooserDialog::setMimeType(FmMimeType* mimeType) {
|
||||
if(mimeType_)
|
||||
fm_mime_type_unref(mimeType_);
|
||||
|
||||
mimeType_ = mimeType ? fm_mime_type_ref(mimeType) : NULL;
|
||||
if(mimeType_) {
|
||||
QString text = tr("Select an application to open \"%1\" files")
|
||||
.arg(QString::fromUtf8(fm_mime_type_get_desc(mimeType_)));
|
||||
ui->fileTypeHeader->setText(text);
|
||||
}
|
||||
else {
|
||||
ui->fileTypeHeader->hide();
|
||||
ui->setDefault->hide();
|
||||
}
|
||||
}
|
||||
|
||||
void AppChooserDialog::setCanSetDefault(bool value) {
|
||||
canSetDefault_ = value;
|
||||
ui->setDefault->setVisible(value);
|
||||
}
|
||||
|
||||
void AppChooserDialog::onTabChanged(int index) {
|
||||
if(index == 0) { // app menu view
|
||||
onSelectionChanged();
|
||||
}
|
||||
else if(index == 1) { // custom command
|
||||
ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Fm
|
74
src/appchooserdialog.h
Normal file
74
src/appchooserdialog.h
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright 2010-2014 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
* Copyright 2012-2013 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
*
|
||||
* 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 FM_APPCHOOSERDIALOG_H
|
||||
#define FM_APPCHOOSERDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include "libfmqtglobals.h"
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Ui {
|
||||
class AppChooserDialog;
|
||||
}
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API AppChooserDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AppChooserDialog(FmMimeType* mimeType, QWidget* parent = NULL, Qt::WindowFlags f = 0);
|
||||
~AppChooserDialog();
|
||||
|
||||
virtual void accept();
|
||||
|
||||
void setMimeType(FmMimeType* mimeType);
|
||||
FmMimeType* mimeType() {
|
||||
return mimeType_;
|
||||
}
|
||||
|
||||
void setCanSetDefault(bool value);
|
||||
bool canSetDefault() {
|
||||
return canSetDefault_;
|
||||
}
|
||||
|
||||
GAppInfo* selectedApp() {
|
||||
return G_APP_INFO(g_object_ref(selectedApp_));
|
||||
}
|
||||
|
||||
bool isSetDefault();
|
||||
|
||||
private:
|
||||
GAppInfo* customCommandToApp();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onSelectionChanged();
|
||||
void onTabChanged(int index);
|
||||
|
||||
private:
|
||||
Ui::AppChooserDialog* ui;
|
||||
FmMimeType* mimeType_;
|
||||
bool canSetDefault_;
|
||||
GAppInfo* selectedApp_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_APPCHOOSERDIALOG_H
|
0
src/appinfo.h
Normal file
0
src/appinfo.h
Normal file
61
src/applaunchcontext.cpp
Normal file
61
src/applaunchcontext.cpp
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "applaunchcontext.h"
|
||||
#include <QX11Info>
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
typedef struct _FmAppLaunchContext {
|
||||
GAppLaunchContext parent;
|
||||
}FmAppLaunchContext;
|
||||
|
||||
G_DEFINE_TYPE(FmAppLaunchContext, fm_app_launch_context, G_TYPE_APP_LAUNCH_CONTEXT)
|
||||
|
||||
static char* fm_app_launch_context_get_display(GAppLaunchContext *context, GAppInfo *info, GList *files) {
|
||||
Display* dpy = QX11Info::display();
|
||||
if(dpy) {
|
||||
char* xstr = DisplayString(dpy);
|
||||
return g_strdup(xstr);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char* fm_app_launch_context_get_startup_notify_id(GAppLaunchContext *context, GAppInfo *info, GList *files) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void fm_app_launch_context_class_init(FmAppLaunchContextClass* klass) {
|
||||
GAppLaunchContextClass* app_launch_class = G_APP_LAUNCH_CONTEXT_CLASS(klass);
|
||||
app_launch_class->get_display = fm_app_launch_context_get_display;
|
||||
app_launch_class->get_startup_notify_id = fm_app_launch_context_get_startup_notify_id;
|
||||
}
|
||||
|
||||
static void fm_app_launch_context_init(FmAppLaunchContext* context) {
|
||||
}
|
||||
|
||||
FmAppLaunchContext* fm_app_launch_context_new_for_widget(QWidget* widget) {
|
||||
FmAppLaunchContext* context = (FmAppLaunchContext*)g_object_new(FM_TYPE_APP_LAUNCH_CONTEXT, NULL);
|
||||
return context;
|
||||
}
|
||||
|
||||
FmAppLaunchContext* fm_app_launch_context_new() {
|
||||
FmAppLaunchContext* context = (FmAppLaunchContext*)g_object_new(FM_TYPE_APP_LAUNCH_CONTEXT, NULL);
|
||||
return context;
|
||||
}
|
50
src/applaunchcontext.h
Normal file
50
src/applaunchcontext.h
Normal file
@ -0,0 +1,50 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_APP_LAUNCHCONTEXT_H
|
||||
#define FM_APP_LAUNCHCONTEXT_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <gio/gio.h>
|
||||
#include <QWidget>
|
||||
|
||||
#define FM_TYPE_APP_LAUNCH_CONTEXT (fm_app_launch_context_get_type())
|
||||
#define FM_APP_LAUNCH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),\
|
||||
FM_TYPE_APP_LAUNCH_CONTEXT, FmAppLaunchContext))
|
||||
#define FM_APP_LAUNCH_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),\
|
||||
FM_TYPE_APP_LAUNCH_CONTEXT, FmAppLaunchContextClass))
|
||||
#define FM_IS_APP_LAUNCH_CONTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),\
|
||||
FM_TYPE_APP_LAUNCH_CONTEXT))
|
||||
#define FM_IS_APP_LAUNCH_CONTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),\
|
||||
FM_TYPE_APP_LAUNCH_CONTEXT))
|
||||
#define FM_APP_LAUNCH_CONTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj),\
|
||||
FM_TYPE_APP_LAUNCH_CONTEXT, FmAppLaunchContextClass))
|
||||
|
||||
typedef struct _FmAppLaunchContext FmAppLaunchContext;
|
||||
|
||||
typedef struct _FmAppLaunchContextClass {
|
||||
GAppLaunchContextClass parent;
|
||||
}FmAppLaunchContextClass;
|
||||
|
||||
FmAppLaunchContext* fm_app_launch_context_new();
|
||||
FmAppLaunchContext* fm_app_launch_context_new_for_widget(QWidget* widget);
|
||||
GType fm_app_launch_context_get_type();
|
||||
|
||||
#endif // FM_APPLAUNCHCONTEXT_H
|
158
src/appmenuview.cpp
Normal file
158
src/appmenuview.cpp
Normal file
@ -0,0 +1,158 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "appmenuview.h"
|
||||
#include <QStandardItemModel>
|
||||
#include "icontheme.h"
|
||||
#include "appmenuview_p.h"
|
||||
#include <gio/gdesktopappinfo.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
AppMenuView::AppMenuView(QWidget* parent):
|
||||
QTreeView(parent),
|
||||
model_(new QStandardItemModel()),
|
||||
menu_cache(NULL),
|
||||
menu_cache_reload_notify(NULL) {
|
||||
|
||||
setHeaderHidden(true);
|
||||
setSelectionMode(SingleSelection);
|
||||
|
||||
// initialize model
|
||||
// TODO: share one model among all app menu view widgets
|
||||
// ensure that we're using lxmenu-data (FIXME: should we do this?)
|
||||
QByteArray oldenv = qgetenv("XDG_MENU_PREFIX");
|
||||
qputenv("XDG_MENU_PREFIX", "lxde-");
|
||||
menu_cache = menu_cache_lookup("applications.menu");
|
||||
// if(!oldenv.isEmpty())
|
||||
qputenv("XDG_MENU_PREFIX", oldenv); // restore the original value if needed
|
||||
|
||||
if(menu_cache) {
|
||||
MenuCacheDir* dir = menu_cache_dup_root_dir(menu_cache);
|
||||
menu_cache_reload_notify = menu_cache_add_reload_notify(menu_cache, _onMenuCacheReload, this);
|
||||
if(dir) { /* content of menu is already loaded */
|
||||
addMenuItems(NULL, dir);
|
||||
menu_cache_item_unref(MENU_CACHE_ITEM(dir));
|
||||
}
|
||||
}
|
||||
setModel(model_);
|
||||
connect(selectionModel(), &QItemSelectionModel::selectionChanged, this, &AppMenuView::selectionChanged);
|
||||
selectionModel()->select(model_->index(0, 0), QItemSelectionModel::SelectCurrent);
|
||||
}
|
||||
|
||||
AppMenuView::~AppMenuView() {
|
||||
delete model_;
|
||||
if(menu_cache) {
|
||||
if(menu_cache_reload_notify)
|
||||
menu_cache_remove_reload_notify(menu_cache, menu_cache_reload_notify);
|
||||
menu_cache_unref(menu_cache);
|
||||
}
|
||||
}
|
||||
|
||||
void AppMenuView::addMenuItems(QStandardItem* parentItem, MenuCacheDir* dir) {
|
||||
GSList* l;
|
||||
GSList* list;
|
||||
/* Iterate over all menu items in this directory. */
|
||||
for(l = list = menu_cache_dir_list_children(dir); l != NULL; l = l->next) {
|
||||
/* Get the menu item. */
|
||||
MenuCacheItem* menuItem = MENU_CACHE_ITEM(l->data);
|
||||
switch(menu_cache_item_get_type(menuItem)) {
|
||||
case MENU_CACHE_TYPE_NONE:
|
||||
case MENU_CACHE_TYPE_SEP:
|
||||
break;
|
||||
case MENU_CACHE_TYPE_APP:
|
||||
case MENU_CACHE_TYPE_DIR: {
|
||||
AppMenuViewItem* newItem = new AppMenuViewItem(menuItem);
|
||||
if(parentItem)
|
||||
parentItem->insertRow(parentItem->rowCount(), newItem);
|
||||
else
|
||||
model_->insertRow(model_->rowCount(), newItem);
|
||||
|
||||
if(menu_cache_item_get_type(menuItem) == MENU_CACHE_TYPE_DIR)
|
||||
addMenuItems(newItem, MENU_CACHE_DIR(menuItem));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
g_slist_free_full(list, (GDestroyNotify)menu_cache_item_unref);
|
||||
}
|
||||
|
||||
void AppMenuView::onMenuCacheReload(MenuCache* mc) {
|
||||
MenuCacheDir* dir = menu_cache_dup_root_dir(mc);
|
||||
model_->clear();
|
||||
/* FIXME: preserve original selection */
|
||||
if(dir) {
|
||||
addMenuItems(NULL, dir);
|
||||
menu_cache_item_unref(MENU_CACHE_ITEM(dir));
|
||||
selectionModel()->select(model_->index(0, 0), QItemSelectionModel::SelectCurrent);
|
||||
}
|
||||
}
|
||||
|
||||
bool AppMenuView::isAppSelected() {
|
||||
AppMenuViewItem* item = selectedItem();
|
||||
return (item && item->isApp());
|
||||
}
|
||||
|
||||
AppMenuViewItem* AppMenuView::selectedItem() {
|
||||
QModelIndexList selected = selectedIndexes();
|
||||
if(!selected.isEmpty()) {
|
||||
AppMenuViewItem* item = static_cast<AppMenuViewItem*>(model_->itemFromIndex(selected.first()
|
||||
));
|
||||
return item;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
GAppInfo* AppMenuView::selectedApp() {
|
||||
const char* id = selectedAppDesktopId();
|
||||
return id ? G_APP_INFO(g_desktop_app_info_new(id)) : NULL;
|
||||
}
|
||||
|
||||
QByteArray AppMenuView::selectedAppDesktopFilePath() {
|
||||
AppMenuViewItem* item = selectedItem();
|
||||
if(item && item->isApp()) {
|
||||
char* path = menu_cache_item_get_file_path(item->item());
|
||||
QByteArray ret(path);
|
||||
g_free(path);
|
||||
return ret;
|
||||
}
|
||||
return QByteArray();
|
||||
}
|
||||
|
||||
const char* AppMenuView::selectedAppDesktopId() {
|
||||
AppMenuViewItem* item = selectedItem();
|
||||
if(item && item->isApp()) {
|
||||
return menu_cache_item_get_id(item->item());
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FmPath* AppMenuView::selectedAppDesktopPath() {
|
||||
AppMenuViewItem* item = selectedItem();
|
||||
if(item && item->isApp()) {
|
||||
char* mpath = menu_cache_dir_make_path(MENU_CACHE_DIR(item));
|
||||
FmPath* path = fm_path_new_relative(fm_path_get_apps_menu(),
|
||||
mpath + 13 /* skip "/Applications" */);
|
||||
g_free(mpath);
|
||||
return path;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
} // namespace Fm
|
72
src/appmenuview.h
Normal file
72
src/appmenuview.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_APPMENUVIEW_H
|
||||
#define FM_APPMENUVIEW_H
|
||||
|
||||
#include <QTreeView>
|
||||
#include "libfmqtglobals.h"
|
||||
#include <libfm/fm.h>
|
||||
#include <menu-cache/menu-cache.h>
|
||||
|
||||
class QStandardItemModel;
|
||||
class QStandardItem;
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class AppMenuViewItem;
|
||||
|
||||
class LIBFM_QT_API AppMenuView : public QTreeView {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AppMenuView(QWidget* parent = NULL);
|
||||
~AppMenuView();
|
||||
|
||||
GAppInfo* selectedApp();
|
||||
|
||||
const char* selectedAppDesktopId();
|
||||
|
||||
QByteArray selectedAppDesktopFilePath();
|
||||
|
||||
FmPath * selectedAppDesktopPath();
|
||||
|
||||
bool isAppSelected();
|
||||
|
||||
Q_SIGNALS:
|
||||
void selectionChanged();
|
||||
|
||||
private:
|
||||
void addMenuItems(QStandardItem* parentItem, MenuCacheDir* dir);
|
||||
void onMenuCacheReload(MenuCache* mc);
|
||||
static void _onMenuCacheReload(MenuCache* mc, gpointer user_data) {
|
||||
static_cast<AppMenuView*>(user_data)->onMenuCacheReload(mc);
|
||||
}
|
||||
|
||||
AppMenuViewItem* selectedItem();
|
||||
|
||||
private:
|
||||
// gboolean fm_app_menu_view_is_item_app(, GtkTreeIter* it);
|
||||
QStandardItemModel* model_;
|
||||
MenuCache* menu_cache;
|
||||
MenuCacheNotifyId menu_cache_reload_notify;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_APPMENUVIEW_H
|
73
src/appmenuview_p.h
Normal file
73
src/appmenuview_p.h
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_APPMENUVIEW_P_H
|
||||
#define FM_APPMENUVIEW_P_H
|
||||
|
||||
#include <QStandardItem>
|
||||
#include <menu-cache/menu-cache.h>
|
||||
#include "icontheme.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class AppMenuViewItem : public QStandardItem {
|
||||
public:
|
||||
explicit AppMenuViewItem(MenuCacheItem* item):
|
||||
item_(menu_cache_item_ref(item)) {
|
||||
FmIcon* fmicon;
|
||||
if(menu_cache_item_get_icon(item))
|
||||
fmicon = fm_icon_from_name(menu_cache_item_get_icon(item));
|
||||
else
|
||||
fmicon = nullptr;
|
||||
setText(QString::fromUtf8(menu_cache_item_get_name(item)));
|
||||
setEditable(false);
|
||||
setDragEnabled(false);
|
||||
if(fmicon) {
|
||||
setIcon(IconTheme::icon(fmicon));
|
||||
fm_icon_unref(fmicon);
|
||||
}
|
||||
}
|
||||
|
||||
~AppMenuViewItem() {
|
||||
menu_cache_item_unref(item_);
|
||||
}
|
||||
|
||||
MenuCacheItem* item() {
|
||||
return item_;
|
||||
}
|
||||
|
||||
MenuCacheType type() {
|
||||
return menu_cache_item_get_type(item_);
|
||||
}
|
||||
|
||||
bool isApp() {
|
||||
return type() == MENU_CACHE_TYPE_APP;
|
||||
}
|
||||
|
||||
bool isDir() {
|
||||
return type() == MENU_CACHE_TYPE_DIR;
|
||||
}
|
||||
|
||||
private:
|
||||
MenuCacheItem* item_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_APPMENUVIEW_P_H
|
143
src/archiver.h
Normal file
143
src/archiver.h
Normal file
@ -0,0 +1,143 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_ARCHIVER_H__
|
||||
#define __LIBFM_QT_FM_ARCHIVER_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API Archiver {
|
||||
public:
|
||||
|
||||
|
||||
// default constructor
|
||||
Archiver() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
Archiver(Archiver&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmArchiver*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
~Archiver() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
(dataPtr_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static Archiver wrapPtr(FmArchiver* dataPtr) {
|
||||
Archiver obj;
|
||||
obj.dataPtr_ = reinterpret_cast<FmArchiver*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmArchiver* takeDataPtr() {
|
||||
FmArchiver* data = reinterpret_cast<FmArchiver*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmArchiver* dataPtr() {
|
||||
return reinterpret_cast<FmArchiver*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmArchiver*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
|
||||
// move assignment
|
||||
Archiver& operator=(Archiver&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmArchiver*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
void setDefault(void) {
|
||||
fm_archiver_set_default(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
static Archiver getDefault( ) {
|
||||
return wrapPtr(fm_archiver_get_default());
|
||||
}
|
||||
|
||||
|
||||
bool extractArchivesTo(GAppLaunchContext* ctx, FmPathList* files, FmPath* dest_dir) {
|
||||
return fm_archiver_extract_archives_to(dataPtr(), ctx, files, dest_dir);
|
||||
}
|
||||
|
||||
|
||||
bool extractArchives(GAppLaunchContext* ctx, FmPathList* files) {
|
||||
return fm_archiver_extract_archives(dataPtr(), ctx, files);
|
||||
}
|
||||
|
||||
|
||||
bool createArchive(GAppLaunchContext* ctx, FmPathList* files) {
|
||||
return fm_archiver_create_archive(dataPtr(), ctx, files);
|
||||
}
|
||||
|
||||
|
||||
bool isMimeTypeSupported(const char* type) {
|
||||
return fm_archiver_is_mime_type_supported(dataPtr(), type);
|
||||
}
|
||||
|
||||
|
||||
// the wrapped object cannot be copied.
|
||||
private:
|
||||
Archiver(const Archiver& other) = delete;
|
||||
Archiver& operator=(const Archiver& other) = delete;
|
||||
|
||||
|
||||
private:
|
||||
FmArchiver* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_ARCHIVER_H__
|
32
src/bookmarkaction.cpp
Normal file
32
src/bookmarkaction.cpp
Normal file
@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "bookmarkaction.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
BookmarkAction::BookmarkAction(FmBookmarkItem* item, QObject* parent):
|
||||
QAction(parent),
|
||||
item_(fm_bookmark_item_ref(item)) {
|
||||
|
||||
setText(QString::fromUtf8(item->name));
|
||||
}
|
||||
|
||||
} // namespace Fm
|
54
src/bookmarkaction.h
Normal file
54
src/bookmarkaction.h
Normal file
@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 BOOKMARKACTION_H
|
||||
#define BOOKMARKACTION_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QAction>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
// action used to create bookmark menu items
|
||||
class LIBFM_QT_API BookmarkAction : public QAction {
|
||||
public:
|
||||
explicit BookmarkAction(FmBookmarkItem* item, QObject* parent = 0);
|
||||
|
||||
virtual ~BookmarkAction() {
|
||||
if(item_)
|
||||
fm_bookmark_item_unref(item_);
|
||||
}
|
||||
|
||||
FmBookmarkItem* bookmark() {
|
||||
return item_;
|
||||
}
|
||||
|
||||
FmPath* path() {
|
||||
return item_->path;
|
||||
}
|
||||
|
||||
private:
|
||||
FmBookmarkItem* item_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // BOOKMARKACTION_H
|
163
src/bookmarks.h
Normal file
163
src/bookmarks.h
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_BOOKMARKS_H__
|
||||
#define __LIBFM_QT_FM_BOOKMARKS_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API Bookmarks {
|
||||
public:
|
||||
|
||||
|
||||
// default constructor
|
||||
Bookmarks() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
Bookmarks(FmBookmarks* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
Bookmarks(const Bookmarks& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
Bookmarks(Bookmarks&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
virtual ~Bookmarks() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static Bookmarks wrapPtr(FmBookmarks* dataPtr) {
|
||||
Bookmarks obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmBookmarks* takeDataPtr() {
|
||||
FmBookmarks* data = reinterpret_cast<FmBookmarks*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmBookmarks* dataPtr() {
|
||||
return reinterpret_cast<FmBookmarks*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmBookmarks*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
Bookmarks& operator=(const Bookmarks& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
Bookmarks& operator=(Bookmarks&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
GList* getAll(void) {
|
||||
return fm_bookmarks_get_all(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void rename(FmBookmarkItem* item, const char* new_name) {
|
||||
fm_bookmarks_rename(dataPtr(), item, new_name);
|
||||
}
|
||||
|
||||
|
||||
void reorder(FmBookmarkItem* item, int pos) {
|
||||
fm_bookmarks_reorder(dataPtr(), item, pos);
|
||||
}
|
||||
|
||||
|
||||
void remove(FmBookmarkItem* item) {
|
||||
fm_bookmarks_remove(dataPtr(), item);
|
||||
}
|
||||
|
||||
|
||||
FmBookmarkItem* insert(FmPath* path, const char* name, int pos) {
|
||||
return fm_bookmarks_insert(dataPtr(), path, name, pos);
|
||||
}
|
||||
|
||||
|
||||
static Bookmarks dup(void ) {
|
||||
return Bookmarks::wrapPtr(fm_bookmarks_dup());
|
||||
}
|
||||
|
||||
|
||||
// automatic type casting for GObject
|
||||
operator GObject*() {
|
||||
return reinterpret_cast<GObject*>(dataPtr_);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
GObject* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_BOOKMARKS_H__
|
90
src/browsehistory.cpp
Normal file
90
src/browsehistory.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "browsehistory.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
BrowseHistory::BrowseHistory():
|
||||
currentIndex_(0),
|
||||
maxCount_(10) {
|
||||
}
|
||||
|
||||
BrowseHistory::~BrowseHistory() {
|
||||
}
|
||||
|
||||
void BrowseHistory::add(FmPath* path, int scrollPos) {
|
||||
int lastIndex = size() - 1;
|
||||
if(currentIndex_ < lastIndex) {
|
||||
// if we're not at the last item, remove items after the current one.
|
||||
erase(begin() + currentIndex_ + 1, end());
|
||||
}
|
||||
|
||||
if(size() + 1 > maxCount_) {
|
||||
// if there are too many items, remove the oldest one.
|
||||
// FIXME: what if currentIndex_ == 0? remove the last item instead?
|
||||
if(currentIndex_ == 0)
|
||||
remove(lastIndex);
|
||||
else {
|
||||
remove(0);
|
||||
--currentIndex_;
|
||||
}
|
||||
}
|
||||
// add a path and current scroll position to browse history
|
||||
append(BrowseHistoryItem(path, scrollPos));
|
||||
currentIndex_ = size() - 1;
|
||||
}
|
||||
|
||||
void BrowseHistory::setCurrentIndex(int index) {
|
||||
if(index >= 0 && index < size()) {
|
||||
currentIndex_ = index;
|
||||
// FIXME: should we emit a signal for the change?
|
||||
}
|
||||
}
|
||||
|
||||
bool BrowseHistory::canBackward() const {
|
||||
return (currentIndex_ > 0);
|
||||
}
|
||||
|
||||
int BrowseHistory::backward() {
|
||||
if(canBackward())
|
||||
--currentIndex_;
|
||||
return currentIndex_;
|
||||
}
|
||||
|
||||
bool BrowseHistory::canForward() const {
|
||||
return (currentIndex_ + 1 < size());
|
||||
}
|
||||
|
||||
int BrowseHistory::forward() {
|
||||
if(canForward())
|
||||
++currentIndex_;
|
||||
return currentIndex_;
|
||||
}
|
||||
|
||||
void BrowseHistory::setMaxCount(int maxCount) {
|
||||
maxCount_ = maxCount;
|
||||
if(size() > maxCount) {
|
||||
// TODO: remove some items
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
131
src/browsehistory.h
Normal file
131
src/browsehistory.h
Normal file
@ -0,0 +1,131 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_BROWSEHISTORY_H
|
||||
#define FM_BROWSEHISTORY_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QVector>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
// class used to story browsing history of folder views
|
||||
// We use this class to replace FmNavHistory provided by libfm since
|
||||
// the original Libfm API is hard to use and confusing.
|
||||
|
||||
class LIBFM_QT_API BrowseHistoryItem {
|
||||
public:
|
||||
|
||||
BrowseHistoryItem():
|
||||
path_(NULL),
|
||||
scrollPos_(0) {
|
||||
}
|
||||
|
||||
BrowseHistoryItem(FmPath* path, int scrollPos = 0):
|
||||
path_(fm_path_ref(path)),
|
||||
scrollPos_(scrollPos) {
|
||||
}
|
||||
|
||||
BrowseHistoryItem(const BrowseHistoryItem& other):
|
||||
path_(other.path_ ? fm_path_ref(other.path_) : NULL),
|
||||
scrollPos_(other.scrollPos_) {
|
||||
}
|
||||
|
||||
~BrowseHistoryItem() {
|
||||
if(path_)
|
||||
fm_path_unref(path_);
|
||||
}
|
||||
|
||||
BrowseHistoryItem& operator=(const BrowseHistoryItem& other) {
|
||||
if(path_)
|
||||
fm_path_unref(path_);
|
||||
path_ = other.path_ ? fm_path_ref(other.path_) : NULL;
|
||||
scrollPos_ = other.scrollPos_;
|
||||
return *this;
|
||||
}
|
||||
|
||||
FmPath* path() const {
|
||||
return path_;
|
||||
}
|
||||
|
||||
int scrollPos() const {
|
||||
return scrollPos_;
|
||||
}
|
||||
|
||||
void setScrollPos(int pos) {
|
||||
scrollPos_ = pos;
|
||||
}
|
||||
|
||||
private:
|
||||
FmPath* path_;
|
||||
int scrollPos_;
|
||||
// TODO: we may need to store current selection as well. reserve room for furutre expansion.
|
||||
// void* reserved1;
|
||||
// void* reserved2;
|
||||
};
|
||||
|
||||
class LIBFM_QT_API BrowseHistory : public QVector<BrowseHistoryItem> {
|
||||
|
||||
public:
|
||||
BrowseHistory();
|
||||
virtual ~BrowseHistory();
|
||||
|
||||
int currentIndex() const {
|
||||
return currentIndex_;
|
||||
}
|
||||
void setCurrentIndex(int index);
|
||||
|
||||
FmPath* currentPath() const {
|
||||
return at(currentIndex_).path();
|
||||
}
|
||||
|
||||
int currentScrollPos() const {
|
||||
return at(currentIndex_).scrollPos();
|
||||
}
|
||||
|
||||
BrowseHistoryItem& currentItem() {
|
||||
return operator[](currentIndex_);
|
||||
}
|
||||
|
||||
void add(FmPath* path, int scrollPos = 0);
|
||||
|
||||
bool canForward() const;
|
||||
|
||||
bool canBackward() const;
|
||||
|
||||
int backward();
|
||||
|
||||
int forward();
|
||||
|
||||
int maxCount() const {
|
||||
return maxCount_;
|
||||
}
|
||||
|
||||
void setMaxCount(int maxCount);
|
||||
|
||||
private:
|
||||
int currentIndex_;
|
||||
int maxCount_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_BROWSEHISTORY_H
|
74
src/cachedfoldermodel.cpp
Normal file
74
src/cachedfoldermodel.cpp
Normal file
@ -0,0 +1,74 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "cachedfoldermodel.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
static GQuark data_id = 0;
|
||||
|
||||
|
||||
CachedFolderModel::CachedFolderModel(FmFolder* folder):
|
||||
FolderModel(),
|
||||
refCount(1) {
|
||||
|
||||
FolderModel::setFolder(folder);
|
||||
}
|
||||
|
||||
CachedFolderModel::~CachedFolderModel() {
|
||||
}
|
||||
|
||||
CachedFolderModel* CachedFolderModel::modelFromFolder(FmFolder* folder) {
|
||||
CachedFolderModel* model = NULL;
|
||||
if(!data_id)
|
||||
data_id = g_quark_from_static_string("CachedFolderModel");
|
||||
gpointer qdata = g_object_get_qdata(G_OBJECT(folder), data_id);
|
||||
model = reinterpret_cast<CachedFolderModel*>(qdata);
|
||||
if(model) {
|
||||
// qDebug("cache found!!");
|
||||
model->ref();
|
||||
}
|
||||
else {
|
||||
model = new CachedFolderModel(folder);
|
||||
g_object_set_qdata(G_OBJECT(folder), data_id, model);
|
||||
}
|
||||
return model;
|
||||
}
|
||||
|
||||
CachedFolderModel* CachedFolderModel::modelFromPath(FmPath* path) {
|
||||
FmFolder* folder = fm_folder_from_path(path);
|
||||
if(folder) {
|
||||
CachedFolderModel* model = modelFromFolder(folder);
|
||||
g_object_unref(folder);
|
||||
return model;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void CachedFolderModel::unref() {
|
||||
// qDebug("unref cache");
|
||||
--refCount;
|
||||
if(refCount <= 0) {
|
||||
g_object_set_qdata(G_OBJECT(folder()), data_id, NULL);
|
||||
deleteLater();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
51
src/cachedfoldermodel.h
Normal file
51
src/cachedfoldermodel.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_CACHEDFOLDERMODEL_H
|
||||
#define FM_CACHEDFOLDERMODEL_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include "foldermodel.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API CachedFolderModel : public FolderModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
CachedFolderModel(FmFolder* folder);
|
||||
void ref() {
|
||||
++refCount;
|
||||
}
|
||||
void unref();
|
||||
|
||||
static CachedFolderModel* modelFromFolder(FmFolder* folder);
|
||||
static CachedFolderModel* modelFromPath(FmPath* path);
|
||||
|
||||
private:
|
||||
virtual ~CachedFolderModel();
|
||||
void setFolder(FmFolder* folder);
|
||||
private:
|
||||
int refCount;
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_CACHEDFOLDERMODEL_H
|
53
src/colorbutton.cpp
Normal file
53
src/colorbutton.cpp
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "colorbutton.h"
|
||||
#include <QColorDialog>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
ColorButton::ColorButton(QWidget* parent): QPushButton(parent) {
|
||||
connect(this, &QPushButton::clicked, this, &ColorButton::onClicked);
|
||||
}
|
||||
|
||||
ColorButton::~ColorButton() {
|
||||
|
||||
}
|
||||
|
||||
void ColorButton::onClicked() {
|
||||
QColorDialog dlg(color_);
|
||||
if(dlg.exec() == QDialog::Accepted) {
|
||||
setColor(dlg.selectedColor());
|
||||
}
|
||||
}
|
||||
|
||||
void ColorButton::setColor(const QColor& color) {
|
||||
if(color != color_) {
|
||||
color_ = color;
|
||||
// use qss instead of QPalette to set the background color
|
||||
// otherwise, this won't work when using the gtk style.
|
||||
QString style = QString("QPushButton{background-color:%1;}").arg(color.name());
|
||||
setStyleSheet(style);
|
||||
Q_EMIT changed();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
55
src/colorbutton.h
Normal file
55
src/colorbutton.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_COLORBUTTON_H
|
||||
#define FM_COLORBUTTON_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QPushButton>
|
||||
#include <QColor>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API ColorButton : public QPushButton {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit ColorButton(QWidget* parent = 0);
|
||||
virtual ~ColorButton();
|
||||
|
||||
void setColor(const QColor&);
|
||||
|
||||
QColor color() const {
|
||||
return color_;
|
||||
}
|
||||
|
||||
Q_SIGNALS:
|
||||
void changed();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onClicked();
|
||||
|
||||
private:
|
||||
QColor color_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_COLORBUTTON_H
|
152
src/config.h
Normal file
152
src/config.h
Normal file
@ -0,0 +1,152 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_CONFIG_H__
|
||||
#define __LIBFM_QT_FM_CONFIG_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API Config {
|
||||
public:
|
||||
|
||||
|
||||
Config(void ) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(fm_config_new());
|
||||
}
|
||||
|
||||
|
||||
Config(FmConfig* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
Config(const Config& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
Config(Config&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
virtual ~Config() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static Config wrapPtr(FmConfig* dataPtr) {
|
||||
Config obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmConfig* takeDataPtr() {
|
||||
FmConfig* data = reinterpret_cast<FmConfig*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmConfig* dataPtr() {
|
||||
return reinterpret_cast<FmConfig*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmConfig*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
Config& operator=(const Config& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
Config& operator=(Config&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
void emitChanged(const char* changed_key) {
|
||||
fm_config_emit_changed(dataPtr(), changed_key);
|
||||
}
|
||||
|
||||
|
||||
void save(const char* name) {
|
||||
fm_config_save(dataPtr(), name);
|
||||
}
|
||||
|
||||
|
||||
void loadFromKeyFile(GKeyFile* kf) {
|
||||
fm_config_load_from_key_file(dataPtr(), kf);
|
||||
}
|
||||
|
||||
|
||||
void loadFromFile(const char* name) {
|
||||
fm_config_load_from_file(dataPtr(), name);
|
||||
}
|
||||
|
||||
|
||||
// automatic type casting for GObject
|
||||
operator GObject*() {
|
||||
return reinterpret_cast<GObject*>(dataPtr_);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
GObject* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_CONFIG_H__
|
90
src/createnewmenu.cpp
Normal file
90
src/createnewmenu.cpp
Normal file
@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "createnewmenu.h"
|
||||
#include "folderview.h"
|
||||
#include "icontheme.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
CreateNewMenu::CreateNewMenu(QWidget* dialogParent, FmPath* dirPath, QWidget* parent):
|
||||
QMenu(parent), dialogParent_(dialogParent), dirPath_(dirPath) {
|
||||
QAction* action = new QAction(QIcon::fromTheme("folder-new"), tr("Folder"), this);
|
||||
connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNewFolder);
|
||||
addAction(action);
|
||||
|
||||
action = new QAction(QIcon::fromTheme("document-new"), tr("Blank File"), this);
|
||||
connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNewFile);
|
||||
addAction(action);
|
||||
|
||||
// add more items to "Create New" menu from templates
|
||||
GList* templates = fm_template_list_all(fm_config->only_user_templates);
|
||||
if(templates) {
|
||||
addSeparator();
|
||||
for(GList* l = templates; l; l = l->next) {
|
||||
FmTemplate* templ = (FmTemplate*)l->data;
|
||||
/* we support directories differently */
|
||||
if(fm_template_is_directory(templ))
|
||||
continue;
|
||||
FmMimeType* mime_type = fm_template_get_mime_type(templ);
|
||||
const char* label = fm_template_get_label(templ);
|
||||
QString text = QString("%1 (%2)").arg(QString::fromUtf8(label)).arg(QString::fromUtf8(fm_mime_type_get_desc(mime_type)));
|
||||
FmIcon* icon = fm_template_get_icon(templ);
|
||||
if(!icon)
|
||||
icon = fm_mime_type_get_icon(mime_type);
|
||||
QAction* action = addAction(IconTheme::icon(icon), text);
|
||||
action->setObjectName(QString::fromUtf8(fm_template_get_name(templ, NULL)));
|
||||
connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNew);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
CreateNewMenu::~CreateNewMenu() {
|
||||
}
|
||||
|
||||
void CreateNewMenu::onCreateNewFile() {
|
||||
if(dirPath_)
|
||||
createFileOrFolder(CreateNewTextFile, dirPath_);
|
||||
}
|
||||
|
||||
void CreateNewMenu::onCreateNewFolder() {
|
||||
if(dirPath_)
|
||||
createFileOrFolder(CreateNewFolder, dirPath_);
|
||||
}
|
||||
|
||||
void CreateNewMenu::onCreateNew() {
|
||||
QAction* action = static_cast<QAction*>(sender());
|
||||
QByteArray name = action->objectName().toUtf8();
|
||||
GList* templates = fm_template_list_all(fm_config->only_user_templates);
|
||||
FmTemplate* templ = NULL;
|
||||
for(GList* l = templates; l; l = l->next) {
|
||||
FmTemplate* t = (FmTemplate*)l->data;
|
||||
if(name == fm_template_get_name(t, NULL)) {
|
||||
templ = t;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(templ) { // template found
|
||||
if(dirPath_)
|
||||
createFileOrFolder(CreateWithTemplate, dirPath_, templ, dialogParent_);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Fm
|
51
src/createnewmenu.h
Normal file
51
src/createnewmenu.h
Normal file
@ -0,0 +1,51 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_CREATENEWMENU_H
|
||||
#define FM_CREATENEWMENU_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QMenu>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class FolderView;
|
||||
|
||||
class LIBFM_QT_API CreateNewMenu : public QMenu {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit CreateNewMenu(QWidget* dialogParent, FmPath* dirPath,
|
||||
QWidget* parent = 0);
|
||||
virtual ~CreateNewMenu();
|
||||
|
||||
protected Q_SLOTS:
|
||||
void onCreateNewFolder();
|
||||
void onCreateNewFile();
|
||||
void onCreateNew();
|
||||
|
||||
private:
|
||||
QWidget* dialogParent_;
|
||||
FmPath* dirPath_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_CREATENEWMENU_H
|
49
src/customaction_p.h
Normal file
49
src/customaction_p.h
Normal file
@ -0,0 +1,49 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_CUSTOMACTION_P_H
|
||||
#define FM_CUSTOMACTION_P_H
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class CustomAction : public QAction {
|
||||
public:
|
||||
explicit CustomAction(FmFileActionItem* item, QObject* parent = NULL):
|
||||
QAction(QString::fromUtf8(fm_file_action_item_get_name(item)), parent),
|
||||
item_(reinterpret_cast<FmFileActionItem*>(fm_file_action_item_ref(item))) {
|
||||
const char* icon_name = fm_file_action_item_get_icon(item);
|
||||
if(icon_name)
|
||||
setIcon(QIcon::fromTheme(icon_name));
|
||||
}
|
||||
|
||||
virtual ~CustomAction() {
|
||||
fm_file_action_item_unref(item_);
|
||||
}
|
||||
|
||||
FmFileActionItem* item() {
|
||||
return item_;
|
||||
}
|
||||
|
||||
private:
|
||||
FmFileActionItem* item_;
|
||||
};
|
||||
|
||||
} // namespace Fm
|
||||
|
||||
#endif
|
128
src/deepcountjob.h
Normal file
128
src/deepcountjob.h
Normal file
@ -0,0 +1,128 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_DEEP_COUNT_JOB_H__
|
||||
#define __LIBFM_QT_FM_DEEP_COUNT_JOB_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
#include "job.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API DeepCountJob: public Job {
|
||||
public:
|
||||
|
||||
|
||||
DeepCountJob(FmPathList* paths, FmDeepCountJobFlags flags) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(fm_deep_count_job_new(paths, flags));
|
||||
}
|
||||
|
||||
|
||||
// default constructor
|
||||
DeepCountJob() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
DeepCountJob(FmDeepCountJob* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
DeepCountJob(const DeepCountJob& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
DeepCountJob(DeepCountJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static DeepCountJob wrapPtr(FmDeepCountJob* dataPtr) {
|
||||
DeepCountJob obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmDeepCountJob* takeDataPtr() {
|
||||
FmDeepCountJob* data = reinterpret_cast<FmDeepCountJob*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmDeepCountJob* dataPtr() {
|
||||
return reinterpret_cast<FmDeepCountJob*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmDeepCountJob*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
DeepCountJob& operator=(const DeepCountJob& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
DeepCountJob& operator=(DeepCountJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
void setDest(dev_t dev, const char* fs_id) {
|
||||
fm_deep_count_job_set_dest(dataPtr(), dev, fs_id);
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_DEEP_COUNT_JOB_H__
|
148
src/dirlistjob.h
Normal file
148
src/dirlistjob.h
Normal file
@ -0,0 +1,148 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_DIR_LIST_JOB_H__
|
||||
#define __LIBFM_QT_FM_DIR_LIST_JOB_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
#include "job.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API DirListJob: public Job {
|
||||
public:
|
||||
|
||||
|
||||
DirListJob(FmPath* path, gboolean dir_only) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(fm_dir_list_job_new(path, dir_only));
|
||||
}
|
||||
|
||||
|
||||
// default constructor
|
||||
DirListJob() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
DirListJob(FmDirListJob* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
DirListJob(const DirListJob& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
DirListJob(DirListJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static DirListJob wrapPtr(FmDirListJob* dataPtr) {
|
||||
DirListJob obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmDirListJob* takeDataPtr() {
|
||||
FmDirListJob* data = reinterpret_cast<FmDirListJob*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmDirListJob* dataPtr() {
|
||||
return reinterpret_cast<FmDirListJob*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmDirListJob*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
DirListJob& operator=(const DirListJob& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
DirListJob& operator=(DirListJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
void addFoundFile(FmFileInfo* file) {
|
||||
fm_dir_list_job_add_found_file(dataPtr(), file);
|
||||
}
|
||||
|
||||
|
||||
void setIncremental(gboolean set) {
|
||||
fm_dir_list_job_set_incremental(dataPtr(), set);
|
||||
}
|
||||
|
||||
|
||||
FmFileInfoList* getFiles(void) {
|
||||
return fm_dir_list_job_get_files(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
static DirListJob newForGfile(GFile* gf) {
|
||||
return DirListJob::wrapPtr(fm_dir_list_job_new_for_gfile(gf));
|
||||
}
|
||||
|
||||
|
||||
static DirListJob new2(FmPath* path, FmDirListJobFlags flags) {
|
||||
return DirListJob::wrapPtr(fm_dir_list_job_new2(path, flags));
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_DIR_LIST_JOB_H__
|
205
src/dirtreemodel.cpp
Normal file
205
src/dirtreemodel.cpp
Normal file
@ -0,0 +1,205 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "dirtreemodel.h"
|
||||
#include "dirtreemodelitem.h"
|
||||
#include <QDebug>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
DirTreeModel::DirTreeModel(QObject* parent):
|
||||
showHidden_(false) {
|
||||
}
|
||||
|
||||
DirTreeModel::~DirTreeModel() {
|
||||
}
|
||||
|
||||
// QAbstractItemModel implementation
|
||||
|
||||
Qt::ItemFlags DirTreeModel::flags(const QModelIndex& index) const {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
if(item && item->isPlaceHolder())
|
||||
return Qt::ItemIsEnabled;
|
||||
return QAbstractItemModel::flags(index);
|
||||
}
|
||||
|
||||
QVariant DirTreeModel::data(const QModelIndex& index, int role) const {
|
||||
if(!index.isValid() || index.column() > 1) {
|
||||
return QVariant();
|
||||
}
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
if(item) {
|
||||
FmFileInfo* info = item->fileInfo_;
|
||||
switch(role) {
|
||||
case Qt::ToolTipRole:
|
||||
return QVariant(item->displayName_);
|
||||
case Qt::DisplayRole:
|
||||
return QVariant(item->displayName_);
|
||||
case Qt::DecorationRole:
|
||||
return QVariant(item->icon_);
|
||||
case FileInfoRole:
|
||||
return qVariantFromValue((void*)info);
|
||||
}
|
||||
}
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
int DirTreeModel::columnCount(const QModelIndex& parent) const {
|
||||
return 1;
|
||||
}
|
||||
|
||||
int DirTreeModel::rowCount(const QModelIndex& parent) const {
|
||||
if(!parent.isValid())
|
||||
return rootItems_.count();
|
||||
DirTreeModelItem* item = itemFromIndex(parent);
|
||||
if(item)
|
||||
return item->children_.count();
|
||||
return 0;
|
||||
}
|
||||
|
||||
QModelIndex DirTreeModel::parent(const QModelIndex& child) const {
|
||||
DirTreeModelItem* item = itemFromIndex(child);
|
||||
if(item && item->parent_) {
|
||||
item = item->parent_; // go to parent item
|
||||
if(item) {
|
||||
const QList<DirTreeModelItem*>& items = item->parent_ ? item->parent_->children_ : rootItems_;
|
||||
int row = items.indexOf(item); // this is Q(n) and may be slow :-(
|
||||
if(row >= 0)
|
||||
return createIndex(row, 0, (void*)item);
|
||||
}
|
||||
}
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
QModelIndex DirTreeModel::index(int row, int column, const QModelIndex& parent) const {
|
||||
if(row >= 0 && column >= 0 && column == 0) {
|
||||
if(!parent.isValid()) { // root items
|
||||
if(row < rootItems_.count()) {
|
||||
const DirTreeModelItem* item = rootItems_.at(row);
|
||||
return createIndex(row, column, (void*)item);
|
||||
}
|
||||
}
|
||||
else { // child items
|
||||
DirTreeModelItem* parentItem = itemFromIndex(parent);
|
||||
if(row < parentItem->children_.count()) {
|
||||
const DirTreeModelItem* item = parentItem->children_.at(row);
|
||||
return createIndex(row, column, (void*)item);
|
||||
}
|
||||
}
|
||||
}
|
||||
return QModelIndex(); // invalid index
|
||||
}
|
||||
|
||||
bool DirTreeModel::hasChildren(const QModelIndex& parent) const {
|
||||
DirTreeModelItem* item = itemFromIndex(parent);
|
||||
return item ? !item->isPlaceHolder() : true;
|
||||
}
|
||||
|
||||
QModelIndex DirTreeModel::indexFromItem(DirTreeModelItem* item) const {
|
||||
Q_ASSERT(item);
|
||||
const QList<DirTreeModelItem*>& items = item->parent_ ? item->parent_->children_ : rootItems_;
|
||||
int row = items.indexOf(item);
|
||||
if(row >= 0)
|
||||
return createIndex(row, 0, (void*)item);
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
// public APIs
|
||||
QModelIndex DirTreeModel::addRoot(FmFileInfo* root) {
|
||||
DirTreeModelItem* item = new DirTreeModelItem(root, this);
|
||||
int row = rootItems_.count();
|
||||
beginInsertRows(QModelIndex(), row, row);
|
||||
item->fileInfo_ = fm_file_info_ref(root);
|
||||
rootItems_.append(item);
|
||||
// add_place_holder_child_item(model, item_l, NULL, FALSE);
|
||||
endInsertRows();
|
||||
return QModelIndex();
|
||||
}
|
||||
|
||||
DirTreeModelItem* DirTreeModel::itemFromIndex(const QModelIndex& index) const {
|
||||
return reinterpret_cast<DirTreeModelItem*>(index.internalPointer());
|
||||
}
|
||||
|
||||
QModelIndex DirTreeModel::indexFromPath(FmPath* path) const {
|
||||
DirTreeModelItem* item = itemFromPath(path);
|
||||
return item ? item->index() : QModelIndex();
|
||||
}
|
||||
|
||||
DirTreeModelItem* DirTreeModel::itemFromPath(FmPath* path) const {
|
||||
Q_FOREACH(DirTreeModelItem* item, rootItems_) {
|
||||
if(item->fileInfo_ && fm_path_equal(path, fm_file_info_get_path(item->fileInfo_))) {
|
||||
return item;
|
||||
}
|
||||
else {
|
||||
DirTreeModelItem* child = item->childFromPath(path, true);
|
||||
if(child)
|
||||
return child;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void DirTreeModel::loadRow(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
Q_ASSERT(item);
|
||||
if(item && !item->isPlaceHolder())
|
||||
item->loadFolder();
|
||||
}
|
||||
|
||||
void DirTreeModel::unloadRow(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
if(item && !item->isPlaceHolder())
|
||||
item->unloadFolder();
|
||||
}
|
||||
|
||||
bool DirTreeModel::isLoaded(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
return item ? item->loaded_ : false;
|
||||
}
|
||||
|
||||
QIcon DirTreeModel::icon(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
return item ? item->icon_ : QIcon();
|
||||
}
|
||||
|
||||
FmFileInfo* DirTreeModel::fileInfo(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
return item ? item->fileInfo_ : NULL;
|
||||
}
|
||||
|
||||
FmPath* DirTreeModel::filePath(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
return item && item->fileInfo_ ? fm_file_info_get_path(item->fileInfo_) : NULL;
|
||||
}
|
||||
|
||||
QString DirTreeModel::dispName(const QModelIndex& index) {
|
||||
DirTreeModelItem* item = itemFromIndex(index);
|
||||
return item ? item->displayName_ : QString();
|
||||
}
|
||||
|
||||
void DirTreeModel::setShowHidden(bool show_hidden) {
|
||||
showHidden_ = show_hidden;
|
||||
Q_FOREACH(DirTreeModelItem* item, rootItems_) {
|
||||
item->setShowHidden(show_hidden);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
89
src/dirtreemodel.h
Normal file
89
src/dirtreemodel.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_DIRTREEMODEL_H
|
||||
#define FM_DIRTREEMODEL_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QModelIndex>
|
||||
#include <QAbstractItemModel>
|
||||
#include <QIcon>
|
||||
#include <QList>
|
||||
#include <QSharedPointer>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class DirTreeModelItem;
|
||||
class DirTreeView;
|
||||
|
||||
class LIBFM_QT_API DirTreeModel : public QAbstractItemModel {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
friend class DirTreeModelItem; // allow direct access of private members in DirTreeModelItem
|
||||
friend class DirTreeView; // allow direct access of private members in DirTreeView
|
||||
|
||||
enum Role {
|
||||
FileInfoRole = Qt::UserRole
|
||||
};
|
||||
|
||||
explicit DirTreeModel(QObject* parent);
|
||||
~DirTreeModel();
|
||||
|
||||
QModelIndex addRoot(FmFileInfo* root);
|
||||
void loadRow(const QModelIndex& index);
|
||||
void unloadRow(const QModelIndex& index);
|
||||
|
||||
bool isLoaded(const QModelIndex& index);
|
||||
QIcon icon(const QModelIndex& index);
|
||||
FmFileInfo* fileInfo(const QModelIndex& index);
|
||||
FmPath* filePath(const QModelIndex& index);
|
||||
QString dispName(const QModelIndex& index);
|
||||
|
||||
void setShowHidden(bool show_hidden);
|
||||
bool showHidden() const {
|
||||
return showHidden_;
|
||||
}
|
||||
|
||||
QModelIndex indexFromPath(FmPath* path) const;
|
||||
|
||||
virtual Qt::ItemFlags flags(const QModelIndex& index) const;
|
||||
virtual QVariant data(const QModelIndex& index, int role) const;
|
||||
virtual int columnCount(const QModelIndex& parent) const;
|
||||
virtual int rowCount(const QModelIndex& parent) const;
|
||||
virtual QModelIndex parent(const QModelIndex& child) const;
|
||||
virtual QModelIndex index(int row, int column, const QModelIndex& parent) const;
|
||||
virtual bool hasChildren(const QModelIndex& parent = QModelIndex()) const;
|
||||
|
||||
private:
|
||||
DirTreeModelItem* itemFromPath(FmPath* path) const;
|
||||
DirTreeModelItem* itemFromIndex(const QModelIndex& index) const;
|
||||
QModelIndex indexFromItem(DirTreeModelItem* item) const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void rowLoaded(const QModelIndex& index);
|
||||
|
||||
private:
|
||||
bool showHidden_;
|
||||
QList<DirTreeModelItem*> rootItems_;
|
||||
};
|
||||
}
|
||||
|
||||
#endif // FM_DIRTREEMODEL_H
|
337
src/dirtreemodelitem.cpp
Normal file
337
src/dirtreemodelitem.cpp
Normal file
@ -0,0 +1,337 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "dirtreemodelitem.h"
|
||||
#include "dirtreemodel.h"
|
||||
#include "icontheme.h"
|
||||
#include <QDebug>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
DirTreeModelItem::DirTreeModelItem():
|
||||
fileInfo_(nullptr),
|
||||
folder_(nullptr),
|
||||
expanded_(false),
|
||||
loaded_(false),
|
||||
parent_(nullptr),
|
||||
placeHolderChild_(nullptr),
|
||||
model_(nullptr) {
|
||||
}
|
||||
|
||||
DirTreeModelItem::DirTreeModelItem(FmFileInfo* info, DirTreeModel* model, DirTreeModelItem* parent):
|
||||
fileInfo_(fm_file_info_ref(info)),
|
||||
folder_(nullptr),
|
||||
displayName_(QString::fromUtf8(fm_file_info_get_disp_name(info))),
|
||||
icon_(IconTheme::icon(fm_file_info_get_icon(info))),
|
||||
expanded_(false),
|
||||
loaded_(false),
|
||||
parent_(parent),
|
||||
placeHolderChild_(nullptr),
|
||||
model_(model) {
|
||||
|
||||
if(info)
|
||||
addPlaceHolderChild();
|
||||
}
|
||||
|
||||
DirTreeModelItem::~DirTreeModelItem() {
|
||||
if(fileInfo_)
|
||||
fm_file_info_unref(fileInfo_);
|
||||
|
||||
if(folder_)
|
||||
freeFolder();
|
||||
|
||||
// delete child items if needed
|
||||
if(!children_.isEmpty()) {
|
||||
Q_FOREACH(DirTreeModelItem* item, children_) {
|
||||
delete item;
|
||||
}
|
||||
}
|
||||
if(!hiddenChildren_.isEmpty()) {
|
||||
Q_FOREACH(DirTreeModelItem* item, hiddenChildren_) {
|
||||
delete item;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeModelItem::addPlaceHolderChild() {
|
||||
placeHolderChild_ = new DirTreeModelItem();
|
||||
placeHolderChild_->parent_ = this;
|
||||
placeHolderChild_->model_ = model_;
|
||||
placeHolderChild_->displayName_ = DirTreeModel::tr("Loading...");
|
||||
children_.append(placeHolderChild_);
|
||||
}
|
||||
|
||||
void DirTreeModelItem::freeFolder() {
|
||||
if(folder_) {
|
||||
g_signal_handlers_disconnect_by_func(folder_, gpointer(onFolderFinishLoading), this);
|
||||
g_signal_handlers_disconnect_by_func(folder_, gpointer(onFolderFilesAdded), this);
|
||||
g_signal_handlers_disconnect_by_func(folder_, gpointer(onFolderFilesRemoved), this);
|
||||
g_signal_handlers_disconnect_by_func(folder_, gpointer(onFolderFilesChanged), this);
|
||||
g_object_unref(folder_);
|
||||
folder_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeModelItem::loadFolder() {
|
||||
if(!expanded_) {
|
||||
/* dynamically load content of the folder. */
|
||||
folder_ = fm_folder_from_path(fm_file_info_get_path(fileInfo_));
|
||||
/* g_debug("fm_dir_tree_model_load_row()"); */
|
||||
/* associate the data with loaded handler */
|
||||
g_signal_connect(folder_, "finish-loading", G_CALLBACK(onFolderFinishLoading), this);
|
||||
g_signal_connect(folder_, "files-added", G_CALLBACK(onFolderFilesAdded), this);
|
||||
g_signal_connect(folder_, "files-removed", G_CALLBACK(onFolderFilesRemoved), this);
|
||||
g_signal_connect(folder_, "files-changed", G_CALLBACK(onFolderFilesChanged), this);
|
||||
|
||||
/* set 'expanded' flag beforehand as callback may check it */
|
||||
expanded_ = true;
|
||||
/* if the folder is already loaded, call "loaded" handler ourselves */
|
||||
if(fm_folder_is_loaded(folder_)) { // already loaded
|
||||
GList* file_l;
|
||||
FmFileInfoList* files = fm_folder_get_files(folder_);
|
||||
for(file_l = fm_file_info_list_peek_head_link(files); file_l; file_l = file_l->next) {
|
||||
FmFileInfo* fi = FM_FILE_INFO(file_l->data);
|
||||
if(fm_file_info_is_dir(fi)) {
|
||||
insertFileInfo(fi);
|
||||
}
|
||||
}
|
||||
onFolderFinishLoading(folder_, this);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeModelItem::unloadFolder() {
|
||||
if(expanded_) { /* do some cleanup */
|
||||
/* remove all children, and replace them with a dummy child
|
||||
* item to keep expander in the tree view around. */
|
||||
|
||||
// delete all visible child items
|
||||
model_->beginRemoveRows(index(), 0, children_.count() - 1);
|
||||
if(!children_.isEmpty()) {
|
||||
Q_FOREACH(DirTreeModelItem* item, children_) {
|
||||
delete item;
|
||||
}
|
||||
children_.clear();
|
||||
}
|
||||
model_->endRemoveRows();
|
||||
|
||||
// remove hidden children
|
||||
if(!hiddenChildren_.isEmpty()) {
|
||||
Q_FOREACH(DirTreeModelItem* item, hiddenChildren_) {
|
||||
delete item;
|
||||
}
|
||||
hiddenChildren_.clear();
|
||||
}
|
||||
|
||||
/* now, we have no child since all child items are removed.
|
||||
* So we add a place holder child item to keep the expander around. */
|
||||
addPlaceHolderChild();
|
||||
/* deactivate folder since it will be reactivated on expand */
|
||||
freeFolder();
|
||||
expanded_ = false;
|
||||
loaded_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
QModelIndex DirTreeModelItem::index() {
|
||||
Q_ASSERT(model_);
|
||||
return model_->indexFromItem(this);
|
||||
}
|
||||
|
||||
/* Add file info to parent node to proper position.
|
||||
* GtkTreePath tp is the tree path of parent node. */
|
||||
DirTreeModelItem* DirTreeModelItem::insertFileInfo(FmFileInfo* fi) {
|
||||
// qDebug() << "insertFileInfo: " << fm_file_info_get_disp_name(fi);
|
||||
DirTreeModelItem* item = new DirTreeModelItem(fi, model_);
|
||||
insertItem(item);
|
||||
return item;
|
||||
}
|
||||
|
||||
// find a good position to insert the new item
|
||||
int DirTreeModelItem::insertItem(DirTreeModelItem* newItem) {
|
||||
if(model_->showHidden() || !newItem->fileInfo_ || !fm_file_info_is_hidden(newItem->fileInfo_)) {
|
||||
const char* new_key = fm_file_info_get_collate_key(newItem->fileInfo_);
|
||||
int pos = 0;
|
||||
QList<DirTreeModelItem*>::iterator it;
|
||||
for(it = children_.begin(); it != children_.end(); ++it) {
|
||||
DirTreeModelItem* child = *it;
|
||||
if(G_UNLIKELY(!child->fileInfo_))
|
||||
continue;
|
||||
const char* key = fm_file_info_get_collate_key(child->fileInfo_);
|
||||
if(strcmp(new_key, key) <= 0)
|
||||
break;
|
||||
++pos;
|
||||
}
|
||||
// inform the world that we're about to insert the item
|
||||
model_->beginInsertRows(index(), pos, pos);
|
||||
newItem->parent_ = this;
|
||||
children_.insert(it, newItem);
|
||||
model_->endInsertRows();
|
||||
return pos;
|
||||
}
|
||||
else { // hidden folder
|
||||
hiddenChildren_.append(newItem);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
// FmFolder signal handlers
|
||||
|
||||
// static
|
||||
void DirTreeModelItem::onFolderFinishLoading(FmFolder* folder, gpointer user_data) {
|
||||
DirTreeModelItem* _this = (DirTreeModelItem*)user_data;
|
||||
DirTreeModel* model = _this->model_;
|
||||
/* set 'loaded' flag beforehand as callback may check it */
|
||||
_this->loaded_ = true;
|
||||
QModelIndex index = _this->index();
|
||||
qDebug() << "folder loaded";
|
||||
// remove the placeholder child if needed
|
||||
if(_this->children_.count() == 1) { // we have no other child other than the place holder item, leave it
|
||||
_this->placeHolderChild_->displayName_ = DirTreeModel::tr("<No sub folders>");
|
||||
QModelIndex placeHolderIndex = _this->placeHolderChild_->index();
|
||||
// qDebug() << "placeHolderIndex: "<<placeHolderIndex;
|
||||
Q_EMIT model->dataChanged(placeHolderIndex, placeHolderIndex);
|
||||
}
|
||||
else {
|
||||
int pos = _this->children_.indexOf(_this->placeHolderChild_);
|
||||
model->beginRemoveRows(index, pos, pos);
|
||||
_this->children_.removeAt(pos);
|
||||
delete _this->placeHolderChild_;
|
||||
model->endRemoveRows();
|
||||
_this->placeHolderChild_ = nullptr;
|
||||
}
|
||||
|
||||
Q_EMIT model->rowLoaded(index);
|
||||
}
|
||||
|
||||
// static
|
||||
void DirTreeModelItem::onFolderFilesAdded(FmFolder* folder, GSList* files, gpointer user_data) {
|
||||
GSList* l;
|
||||
DirTreeModelItem* _this = (DirTreeModelItem*)user_data;
|
||||
for(l = files; l; l = l->next) {
|
||||
FmFileInfo* fi = FM_FILE_INFO(l->data);
|
||||
if(fm_file_info_is_dir(fi)) { /* FIXME: maybe adding files can be allowed later */
|
||||
/* Ideally FmFolder should not emit files-added signals for files that
|
||||
* already exists. So there is no need to check for duplication here. */
|
||||
_this->insertFileInfo(fi);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void DirTreeModelItem::onFolderFilesRemoved(FmFolder* folder, GSList* files, gpointer user_data) {
|
||||
DirTreeModelItem* _this = (DirTreeModelItem*)user_data;
|
||||
DirTreeModel* model = _this->model_;
|
||||
|
||||
for(GSList* l = files; l; l = l->next) {
|
||||
FmFileInfo* fi = FM_FILE_INFO(l->data);
|
||||
int pos;
|
||||
DirTreeModelItem* child = _this->childFromName(fm_file_info_get_name(fi), &pos);
|
||||
if(child) {
|
||||
model->beginRemoveRows(_this->index(), pos, pos);
|
||||
_this->children_.removeAt(pos);
|
||||
delete child;
|
||||
model->endRemoveRows();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void DirTreeModelItem::onFolderFilesChanged(FmFolder* folder, GSList* files, gpointer user_data) {
|
||||
DirTreeModelItem* _this = (DirTreeModelItem*)user_data;
|
||||
DirTreeModel* model = _this->model_;
|
||||
|
||||
for(GSList* l = files; l; l = l->next) {
|
||||
FmFileInfo* changedFile = FM_FILE_INFO(l->data);
|
||||
int pos;
|
||||
DirTreeModelItem* child = _this->childFromName(fm_file_info_get_name(changedFile), &pos);
|
||||
if(child) {
|
||||
QModelIndex childIndex = child->index();
|
||||
Q_EMIT model->dataChanged(childIndex, childIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
DirTreeModelItem* DirTreeModelItem::childFromName(const char* utf8_name, int* pos) {
|
||||
int i = 0;
|
||||
for (const auto item : children_) {
|
||||
if(item->fileInfo_ && strcmp(fm_file_info_get_name(item->fileInfo_), utf8_name) == 0) {
|
||||
if(pos)
|
||||
*pos = i;
|
||||
return item;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
DirTreeModelItem* DirTreeModelItem::childFromPath(FmPath* path, bool recursive) const {
|
||||
Q_ASSERT(path != nullptr);
|
||||
|
||||
Q_FOREACH(DirTreeModelItem* item, children_) {
|
||||
// if(item->fileInfo_)
|
||||
// qDebug() << "child: " << QString::fromUtf8(fm_file_info_get_disp_name(item->fileInfo_));
|
||||
if(item->fileInfo_ && fm_path_equal(fm_file_info_get_path(item->fileInfo_), path)) {
|
||||
return item;
|
||||
} else if(recursive) {
|
||||
DirTreeModelItem* child = item->childFromPath(path, true);
|
||||
if(child)
|
||||
return child;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void DirTreeModelItem::setShowHidden(bool show) {
|
||||
if(show) {
|
||||
// move all hidden children to visible list
|
||||
Q_FOREACH(DirTreeModelItem* item, hiddenChildren_) {
|
||||
insertItem(item);
|
||||
}
|
||||
hiddenChildren_.clear();
|
||||
}
|
||||
else { // hide hidden folders
|
||||
QModelIndex _index = index();
|
||||
QList<DirTreeModelItem*>::iterator it, next;
|
||||
int pos = 0;
|
||||
for(it = children_.begin(); it != children_.end(); ++pos) {
|
||||
DirTreeModelItem* item = *it;
|
||||
next = it + 1;
|
||||
if(item->fileInfo_) {
|
||||
if(fm_file_info_is_hidden(item->fileInfo_)) { // hidden folder
|
||||
// remove from the model and add to the hiddenChildren_ list
|
||||
model_->beginRemoveRows(_index, pos, pos);
|
||||
children_.erase(it);
|
||||
hiddenChildren_.append(item);
|
||||
model_->endRemoveRows();
|
||||
}
|
||||
else { // visible folder, recursively filter its children
|
||||
item->setShowHidden(show);
|
||||
}
|
||||
}
|
||||
it = next;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
} // namespace Fm
|
||||
|
83
src/dirtreemodelitem.h
Normal file
83
src/dirtreemodelitem.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_DIRTREEMODELITEM_H
|
||||
#define FM_DIRTREEMODELITEM_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <libfm/fm.h>
|
||||
#include <QIcon>
|
||||
#include <QList>
|
||||
#include <QModelIndex>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class DirTreeModel;
|
||||
class DirTreeView;
|
||||
|
||||
class LIBFM_QT_API DirTreeModelItem {
|
||||
public:
|
||||
friend class DirTreeModel; // allow direct access of private members in DirTreeModel
|
||||
friend class DirTreeView; // allow direct access of private members in DirTreeView
|
||||
|
||||
explicit DirTreeModelItem();
|
||||
explicit DirTreeModelItem(FmFileInfo* info, DirTreeModel* model, DirTreeModelItem* parent = nullptr);
|
||||
~DirTreeModelItem();
|
||||
|
||||
void loadFolder();
|
||||
void unloadFolder();
|
||||
|
||||
inline bool isPlaceHolder() const {
|
||||
return (fileInfo_ == nullptr);
|
||||
}
|
||||
|
||||
void setShowHidden(bool show);
|
||||
|
||||
private:
|
||||
void freeFolder();
|
||||
void addPlaceHolderChild();
|
||||
DirTreeModelItem* childFromName(const char* utf8_name, int* pos);
|
||||
DirTreeModelItem* childFromPath(FmPath* path, bool recursive) const;
|
||||
|
||||
DirTreeModelItem* insertFileInfo(FmFileInfo* fi);
|
||||
int insertItem(Fm::DirTreeModelItem* newItem);
|
||||
QModelIndex index();
|
||||
|
||||
static void onFolderFinishLoading(FmFolder* folder, gpointer user_data);
|
||||
static void onFolderFilesAdded(FmFolder* folder, GSList* files, gpointer user_data);
|
||||
static void onFolderFilesRemoved(FmFolder* folder, GSList* files, gpointer user_data);
|
||||
static void onFolderFilesChanged(FmFolder* folder, GSList* files, gpointer user_data);
|
||||
|
||||
private:
|
||||
FmFileInfo* fileInfo_;
|
||||
FmFolder* folder_;
|
||||
QString displayName_ ;
|
||||
QIcon icon_;
|
||||
bool expanded_;
|
||||
bool loaded_;
|
||||
DirTreeModelItem* parent_;
|
||||
DirTreeModelItem* placeHolderChild_;
|
||||
QList<DirTreeModelItem*> children_;
|
||||
QList<DirTreeModelItem*> hiddenChildren_;
|
||||
DirTreeModel* model_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_DIRTREEMODELITEM_H
|
298
src/dirtreeview.cpp
Normal file
298
src/dirtreeview.cpp
Normal file
@ -0,0 +1,298 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "dirtreeview.h"
|
||||
#include <QHeaderView>
|
||||
#include <QDebug>
|
||||
#include <QItemSelection>
|
||||
#include <QGuiApplication>
|
||||
#include <QMouseEvent>
|
||||
#include "dirtreemodel.h"
|
||||
#include "dirtreemodelitem.h"
|
||||
#include "filemenu.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
DirTreeView::DirTreeView(QWidget* parent):
|
||||
currentPath_(NULL),
|
||||
currentExpandingItem_(NULL) {
|
||||
|
||||
setSelectionMode(QAbstractItemView::SingleSelection);
|
||||
setHeaderHidden(true);
|
||||
setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||||
header()->setStretchLastSection(false);
|
||||
|
||||
connect(this, &DirTreeView::collapsed, this, &DirTreeView::onCollapsed);
|
||||
connect(this, &DirTreeView::expanded, this, &DirTreeView::onExpanded);
|
||||
|
||||
setContextMenuPolicy(Qt::CustomContextMenu);
|
||||
connect(this, &DirTreeView::customContextMenuRequested,
|
||||
this, &DirTreeView::onCustomContextMenuRequested);
|
||||
}
|
||||
|
||||
DirTreeView::~DirTreeView() {
|
||||
if(currentPath_)
|
||||
fm_path_unref(currentPath_);
|
||||
}
|
||||
|
||||
void DirTreeView::cancelPendingChdir() {
|
||||
if(!pathsToExpand_.isEmpty()) {
|
||||
pathsToExpand_.clear();
|
||||
if(!currentExpandingItem_)
|
||||
return;
|
||||
DirTreeModel* _model = static_cast<DirTreeModel*>(model());
|
||||
disconnect(_model, &DirTreeModel::rowLoaded, this, &DirTreeView::onRowLoaded);
|
||||
currentExpandingItem_ = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::expandPendingPath() {
|
||||
if(pathsToExpand_.isEmpty())
|
||||
return;
|
||||
|
||||
FmPath* path = pathsToExpand_.first();
|
||||
// qDebug() << "expanding: " << Path(path).displayBasename();
|
||||
DirTreeModel* _model = static_cast<DirTreeModel*>(model());
|
||||
DirTreeModelItem* item = _model->itemFromPath(path);
|
||||
// qDebug() << "findItem: " << item;
|
||||
if(item) {
|
||||
currentExpandingItem_ = item;
|
||||
connect(_model, &DirTreeModel::rowLoaded, this, &DirTreeView::onRowLoaded);
|
||||
if(item->loaded_) { // the node is already loaded
|
||||
onRowLoaded(item->index());
|
||||
}
|
||||
else {
|
||||
// _model->loadRow(item->index());
|
||||
item->loadFolder();
|
||||
}
|
||||
}
|
||||
else {
|
||||
selectionModel()->clear();
|
||||
/* since we never get it loaded we need to update cwd here */
|
||||
if(currentPath_)
|
||||
fm_path_unref(currentPath_);
|
||||
currentPath_ = fm_path_ref(path);
|
||||
|
||||
cancelPendingChdir(); // FIXME: is this correct? this is not done in the gtk+ version of libfm.
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onRowLoaded(const QModelIndex& index) {
|
||||
DirTreeModel* _model = static_cast<DirTreeModel*>(model());
|
||||
if(!currentExpandingItem_)
|
||||
return;
|
||||
if(currentExpandingItem_ != _model->itemFromIndex(index)) {
|
||||
return;
|
||||
}
|
||||
/* disconnect the handler since we only need it once */
|
||||
disconnect(_model, &DirTreeModel::rowLoaded, this, &DirTreeView::onRowLoaded);
|
||||
|
||||
// DirTreeModelItem* item = _model->itemFromIndex(index);
|
||||
// qDebug() << "row loaded: " << item->displayName_;
|
||||
/* after the folder is loaded, the files should have been added to
|
||||
* the tree model */
|
||||
expand(index);
|
||||
|
||||
/* remove the expanded path from pending list */
|
||||
pathsToExpand_.removeFirst();
|
||||
if(pathsToExpand_.isEmpty()) { /* this is the last one and we're done, select the item */
|
||||
// qDebug() << "Done!";
|
||||
selectionModel()->select(index, QItemSelectionModel::SelectCurrent|QItemSelectionModel::Clear);
|
||||
scrollTo(index, QAbstractItemView::EnsureVisible);
|
||||
}
|
||||
else { /* continue expanding next pending path */
|
||||
expandPendingPath();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void DirTreeView::setCurrentPath(FmPath* path) {
|
||||
DirTreeModel* _model = static_cast<DirTreeModel*>(model());
|
||||
if(!_model)
|
||||
return;
|
||||
int rowCount = _model->rowCount(QModelIndex());
|
||||
if(rowCount <= 0 || fm_path_equal(currentPath_, path))
|
||||
return;
|
||||
|
||||
if(currentPath_)
|
||||
fm_path_unref(currentPath_);
|
||||
currentPath_ = fm_path_ref(path);
|
||||
|
||||
// NOTE: The content of each node is loaded on demand dynamically.
|
||||
// So, when we ask for a chdir operation, some nodes do not exists yet.
|
||||
// We have to wait for the loading of child nodes and continue the
|
||||
// pending chdir operation after the child nodes become available.
|
||||
|
||||
// cancel previous pending tree expansion
|
||||
cancelPendingChdir();
|
||||
|
||||
/* find a root item containing this path */
|
||||
FmPath* root;
|
||||
for(int row = 0; row < rowCount; ++row) {
|
||||
QModelIndex index = _model->index(row, 0, QModelIndex());
|
||||
root = _model->filePath(index);
|
||||
if(fm_path_has_prefix(path, root))
|
||||
break;
|
||||
root = NULL;
|
||||
}
|
||||
|
||||
if(root) { /* root item is found */
|
||||
do { /* add path elements one by one to a list */
|
||||
pathsToExpand_.prepend(path);
|
||||
// qDebug() << "prepend path: " << Path(path).displayBasename();
|
||||
if(fm_path_equal(path, root))
|
||||
break;
|
||||
path = fm_path_get_parent(path);
|
||||
}
|
||||
while(path);
|
||||
|
||||
expandPendingPath();
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::setModel(QAbstractItemModel* model) {
|
||||
Q_ASSERT(model->inherits("Fm::DirTreeModel"));
|
||||
|
||||
if(!pathsToExpand_.isEmpty()) // if a chdir request is in progress, cancel it
|
||||
cancelPendingChdir();
|
||||
|
||||
QTreeView::setModel(model);
|
||||
header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
|
||||
connect(selectionModel(), &QItemSelectionModel::selectionChanged, this, &DirTreeView::onSelectionChanged);
|
||||
}
|
||||
|
||||
void DirTreeView::mousePressEvent(QMouseEvent* event) {
|
||||
if(event && event->button() == Qt::RightButton &&
|
||||
event->type() == QEvent::MouseButtonPress) {
|
||||
// Do not change the selection when the context menu is activated.
|
||||
return;
|
||||
}
|
||||
QTreeView::mousePressEvent(event);
|
||||
}
|
||||
|
||||
void DirTreeView::onCustomContextMenuRequested(const QPoint& pos) {
|
||||
QModelIndex index = indexAt(pos);
|
||||
if(index.isValid()) {
|
||||
QVariant data = index.data(DirTreeModel::FileInfoRole);
|
||||
FmFileInfo* fileInfo = reinterpret_cast<FmFileInfo*>(data.value<void*>());
|
||||
if(fileInfo) {
|
||||
FmPath* path = fm_file_info_get_path(fileInfo);
|
||||
FmFileInfoList* files = fm_file_info_list_new();
|
||||
fm_file_info_list_push_tail(files, fileInfo);
|
||||
Fm::FileMenu* menu = new Fm::FileMenu(files, fileInfo, path);
|
||||
// FIXME: apply some settings to the menu and set a proper file launcher to it
|
||||
Q_EMIT prepareFileMenu(menu);
|
||||
fm_file_info_list_unref(files);
|
||||
QVariant pathData = qVariantFromValue(reinterpret_cast<void*>(path));
|
||||
QAction* action = menu->openAction();
|
||||
action->disconnect();
|
||||
action->setData(index);
|
||||
connect(action, &QAction::triggered, this, &DirTreeView::onOpen);
|
||||
action = new QAction(QIcon::fromTheme("window-new"), tr("Open in New T&ab"), menu);
|
||||
action->setData(pathData);
|
||||
connect(action, &QAction::triggered, this, &DirTreeView::onNewTab);
|
||||
menu->insertAction(menu->separator1(), action);
|
||||
action = new QAction(QIcon::fromTheme("window-new"), tr("Open in New Win&dow"), menu);
|
||||
action->setData(pathData);
|
||||
connect(action, &QAction::triggered, this, &DirTreeView::onNewWindow);
|
||||
menu->insertAction(menu->separator1(), action);
|
||||
if(fm_file_info_is_native(fileInfo)) {
|
||||
action = new QAction(QIcon::fromTheme("utilities-terminal"), tr("Open in Termina&l"), menu);
|
||||
action->setData(pathData);
|
||||
connect(action, &QAction::triggered, this, &DirTreeView::onOpenInTerminal);
|
||||
menu->insertAction(menu->separator1(), action);
|
||||
}
|
||||
menu->exec(mapToGlobal(pos));
|
||||
delete menu;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onOpen() {
|
||||
if(QAction* action = qobject_cast<QAction*>(sender())) {
|
||||
setCurrentIndex(action->data().toModelIndex());
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onNewWindow() {
|
||||
if(QAction* action = qobject_cast<QAction*>(sender())) {
|
||||
FmPath* path = reinterpret_cast<FmPath*>(action->data().value<void*>());
|
||||
Q_EMIT openFolderInNewWindowRequested(path);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onNewTab() {
|
||||
if(QAction* action = qobject_cast<QAction*>(sender())) {
|
||||
FmPath* path = reinterpret_cast<FmPath*>(action->data().value<void*>());
|
||||
Q_EMIT openFolderInNewTabRequested(path);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onOpenInTerminal() {
|
||||
if(QAction* action = qobject_cast<QAction*>(sender())) {
|
||||
FmPath* path = reinterpret_cast<FmPath*>(action->data().value<void*>());
|
||||
Q_EMIT openFolderInTerminalRequested(path);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onNewFolder() {
|
||||
if(QAction* action = qobject_cast<QAction*>(sender())) {
|
||||
FmPath* path = reinterpret_cast<FmPath*>(action->data().value<void*>());
|
||||
Q_EMIT createNewFolderRequested(path);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onCollapsed(const QModelIndex& index) {
|
||||
DirTreeModel* treeModel = static_cast<DirTreeModel*>(model());
|
||||
if(treeModel) {
|
||||
treeModel->unloadRow(index);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onExpanded(const QModelIndex& index) {
|
||||
DirTreeModel* treeModel = static_cast<DirTreeModel*>(model());
|
||||
if(treeModel) {
|
||||
treeModel->loadRow(index);
|
||||
}
|
||||
}
|
||||
|
||||
void DirTreeView::onSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected) {
|
||||
if(!selected.isEmpty()) {
|
||||
QModelIndex index = selected.first().topLeft();
|
||||
DirTreeModel* _model = static_cast<DirTreeModel*>(model());
|
||||
FmPath* path = _model->filePath(index);
|
||||
if(path && currentPath_ && fm_path_equal(path, currentPath_))
|
||||
return;
|
||||
cancelPendingChdir();
|
||||
if(!path)
|
||||
return;
|
||||
if(currentPath_)
|
||||
fm_path_unref(currentPath_);
|
||||
currentPath_ = fm_path_ref(path);
|
||||
|
||||
// FIXME: use enums for type rather than hard-coded values 0 or 1
|
||||
int type = 0;
|
||||
if(QGuiApplication::mouseButtons() & Qt::MiddleButton)
|
||||
type = 1;
|
||||
Q_EMIT chdirRequested(type, path);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
94
src/dirtreeview.h
Normal file
94
src/dirtreeview.h
Normal file
@ -0,0 +1,94 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_DIRTREEVIEW_H
|
||||
#define FM_DIRTREEVIEW_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QTreeView>
|
||||
#include <libfm/fm.h>
|
||||
#include "path.h"
|
||||
|
||||
class QItemSelection;
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class FileMenu;
|
||||
class DirTreeModelItem;
|
||||
|
||||
class LIBFM_QT_API DirTreeView : public QTreeView {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
DirTreeView(QWidget* parent);
|
||||
~DirTreeView();
|
||||
|
||||
FmPath* currentPath() {
|
||||
return currentPath_;
|
||||
}
|
||||
|
||||
void setCurrentPath(FmPath* path);
|
||||
|
||||
// libfm-gtk compatible alias
|
||||
FmPath* getCwd() {
|
||||
return currentPath();
|
||||
}
|
||||
|
||||
void chdir(FmPath* path) {
|
||||
setCurrentPath(path);
|
||||
}
|
||||
|
||||
virtual void setModel(QAbstractItemModel* model);
|
||||
|
||||
protected:
|
||||
virtual void mousePressEvent(QMouseEvent* event);
|
||||
|
||||
private:
|
||||
void cancelPendingChdir();
|
||||
void expandPendingPath();
|
||||
|
||||
Q_SIGNALS:
|
||||
void chdirRequested(int type, FmPath* path);
|
||||
void openFolderInNewWindowRequested(FmPath* path);
|
||||
void openFolderInNewTabRequested(FmPath* path);
|
||||
void openFolderInTerminalRequested(FmPath* path);
|
||||
void createNewFolderRequested(FmPath* path);
|
||||
void prepareFileMenu(Fm::FileMenu* menu); // emit before showing a Fm::FileMenu
|
||||
|
||||
protected Q_SLOTS:
|
||||
void onCollapsed(const QModelIndex & index);
|
||||
void onExpanded(const QModelIndex & index);
|
||||
void onRowLoaded(const QModelIndex& index);
|
||||
void onSelectionChanged(const QItemSelection & selected, const QItemSelection & deselected);
|
||||
void onCustomContextMenuRequested(const QPoint& pos);
|
||||
void onOpen();
|
||||
void onNewWindow();
|
||||
void onNewTab();
|
||||
void onOpenInTerminal();
|
||||
void onNewFolder();
|
||||
|
||||
private:
|
||||
FmPath* currentPath_;
|
||||
QList<Path> pathsToExpand_;
|
||||
DirTreeModelItem* currentExpandingItem_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_DIRTREEVIEW_H
|
63
src/dndactionmenu.cpp
Normal file
63
src/dndactionmenu.cpp
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "dndactionmenu.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
DndActionMenu::DndActionMenu(Qt::DropActions possibleActions, QWidget* parent)
|
||||
: QMenu(parent)
|
||||
, copyAction(nullptr)
|
||||
, moveAction(nullptr)
|
||||
, linkAction(nullptr)
|
||||
, cancelAction(nullptr)
|
||||
{
|
||||
if (possibleActions.testFlag(Qt::CopyAction))
|
||||
copyAction = addAction(QIcon::fromTheme("edit-copy"), tr("Copy here"));
|
||||
if (possibleActions.testFlag(Qt::MoveAction))
|
||||
moveAction = addAction(tr("Move here"));
|
||||
if (possibleActions.testFlag(Qt::LinkAction))
|
||||
linkAction = addAction(tr("Create symlink here"));
|
||||
addSeparator();
|
||||
cancelAction = addAction(tr("Cancel"));
|
||||
}
|
||||
|
||||
DndActionMenu::~DndActionMenu() {
|
||||
|
||||
}
|
||||
|
||||
Qt::DropAction DndActionMenu::askUser(Qt::DropActions possibleActions, QPoint pos) {
|
||||
Qt::DropAction result = Qt::IgnoreAction;
|
||||
DndActionMenu menu{possibleActions};
|
||||
QAction* action = menu.exec(pos);
|
||||
if (nullptr != action)
|
||||
{
|
||||
if(action == menu.copyAction)
|
||||
result = Qt::CopyAction;
|
||||
else if(action == menu.moveAction)
|
||||
result = Qt::MoveAction;
|
||||
else if(action == menu.linkAction)
|
||||
result = Qt::LinkAction;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
47
src/dndactionmenu.h
Normal file
47
src/dndactionmenu.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_DNDACTIONMENU_H
|
||||
#define FM_DNDACTIONMENU_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QMenu>
|
||||
#include <QAction>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class DndActionMenu : public QMenu {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DndActionMenu(Qt::DropActions possibleActions, QWidget* parent = 0);
|
||||
virtual ~DndActionMenu();
|
||||
|
||||
static Qt::DropAction askUser(Qt::DropActions possibleActions, QPoint pos);
|
||||
|
||||
private:
|
||||
QAction* copyAction;
|
||||
QAction* moveAction;
|
||||
QAction* linkAction;
|
||||
QAction* cancelAction;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_DNDACTIONMENU_H
|
73
src/dnddest.cpp
Normal file
73
src/dnddest.cpp
Normal file
@ -0,0 +1,73 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "dnddest.h"
|
||||
#include "fileoperation.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
const char* supportedMimeTypes[] = {
|
||||
"text/uri-list"
|
||||
"XdndDirectSave0"/* X direct save */
|
||||
/* TODO: add more targets to support: text types, _NETSCAPE_URL, property/bgimage ... */
|
||||
};
|
||||
|
||||
DndDest::DndDest() {
|
||||
|
||||
}
|
||||
|
||||
DndDest::~DndDest() {
|
||||
|
||||
}
|
||||
|
||||
bool DndDest::dropMimeData(const QMimeData* data, Qt::DropAction action) {
|
||||
// FIXME: should we put this in dropEvent handler of FolderView instead?
|
||||
if(data->hasUrls()) {
|
||||
qDebug("drop action: %d", action);
|
||||
FmPathList* srcPaths = pathListFromQUrls(data->urls());
|
||||
switch(action) {
|
||||
case Qt::CopyAction:
|
||||
FileOperation::copyFiles(srcPaths, destPath_);
|
||||
break;
|
||||
case Qt::MoveAction:
|
||||
FileOperation::moveFiles(srcPaths, destPath_);
|
||||
break;
|
||||
case Qt::LinkAction:
|
||||
FileOperation::symlinkFiles(srcPaths, destPath_);
|
||||
default:
|
||||
fm_path_list_unref(srcPaths);
|
||||
return false;
|
||||
}
|
||||
fm_path_list_unref(srcPaths);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DndDest::isSupported(const QMimeData* data) {
|
||||
return false;
|
||||
}
|
||||
|
||||
bool DndDest::isSupported(QString mimeType) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
52
src/dnddest.h
Normal file
52
src/dnddest.h
Normal file
@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_DNDDEST_H
|
||||
#define FM_DNDDEST_H
|
||||
|
||||
#include <QMimeData>
|
||||
#include "path.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class DndDest {
|
||||
public:
|
||||
DndDest();
|
||||
~DndDest();
|
||||
|
||||
void setDestPath(FmPath* dest) {
|
||||
destPath_ = dest;
|
||||
}
|
||||
|
||||
const Path& destPath() {
|
||||
return destPath_;
|
||||
}
|
||||
|
||||
bool isSupported(const QMimeData* data);
|
||||
bool isSupported(QString mimeType);
|
||||
|
||||
bool dropMimeData(const QMimeData* data, Qt::DropAction action);
|
||||
|
||||
private:
|
||||
Path destPath_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_DNDDEST_H
|
35
src/dummymonitor.h
Normal file
35
src/dummymonitor.h
Normal file
@ -0,0 +1,35 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_DUMMY_MONITOR_H__
|
||||
#define __LIBFM_QT_FM_DUMMY_MONITOR_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_DUMMY_MONITOR_H__
|
143
src/edit-bookmarks.ui
Normal file
143
src/edit-bookmarks.ui
Normal file
@ -0,0 +1,143 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>EditBookmarksDialog</class>
|
||||
<widget class="QDialog" name="EditBookmarksDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>480</width>
|
||||
<height>320</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Edit Bookmarks</string>
|
||||
</property>
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="1" column="0">
|
||||
<widget class="QTreeWidget" name="treeWidget">
|
||||
<property name="acceptDrops">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="dragEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="dragDropMode">
|
||||
<enum>QAbstractItemView::InternalMove</enum>
|
||||
</property>
|
||||
<property name="defaultDropAction">
|
||||
<enum>Qt::MoveAction</enum>
|
||||
</property>
|
||||
<property name="rootIsDecorated">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="itemsExpandable">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>100</number>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Name</string>
|
||||
</property>
|
||||
</column>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string>Location</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" 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>
|
||||
<item row="1" column="1">
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="addItem">
|
||||
<property name="text">
|
||||
<string>&Add Item</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="list-add"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removeItem">
|
||||
<property name="text">
|
||||
<string>&Remove Item</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="list-remove"/>
|
||||
</property>
|
||||
</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>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Use drag and drop to reorder the items</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>EditBookmarksDialog</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>EditBookmarksDialog</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>
|
110
src/editbookmarksdialog.cpp
Normal file
110
src/editbookmarksdialog.cpp
Normal file
@ -0,0 +1,110 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "editbookmarksdialog.h"
|
||||
#include "ui_edit-bookmarks.h"
|
||||
#include <QByteArray>
|
||||
#include <QUrl>
|
||||
#include <QSaveFile>
|
||||
#include <QStandardPaths>
|
||||
#include <QDir>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
EditBookmarksDialog::EditBookmarksDialog(FmBookmarks* bookmarks, QWidget* parent, Qt::WindowFlags f):
|
||||
QDialog(parent, f),
|
||||
ui(new Ui::EditBookmarksDialog()),
|
||||
bookmarks_(FM_BOOKMARKS(g_object_ref(bookmarks))) {
|
||||
|
||||
ui->setupUi(this);
|
||||
setAttribute(Qt::WA_DeleteOnClose); // auto delete on close
|
||||
|
||||
// load bookmarks
|
||||
GList* allBookmarks = fm_bookmarks_get_all(bookmarks_);
|
||||
for(GList* l = allBookmarks; l; l = l->next) {
|
||||
FmBookmarkItem* bookmark = reinterpret_cast<FmBookmarkItem*>(l->data);
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
char* path_str = fm_path_display_name(bookmark->path, false);
|
||||
item->setData(0, Qt::DisplayRole, QString::fromUtf8(bookmark->name));
|
||||
item->setData(1, Qt::DisplayRole, QString::fromUtf8(path_str));
|
||||
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsEnabled);
|
||||
g_free(path_str);
|
||||
ui->treeWidget->addTopLevelItem(item);
|
||||
}
|
||||
g_list_free_full(allBookmarks, (GDestroyNotify)fm_bookmark_item_unref);
|
||||
|
||||
connect(ui->addItem, &QPushButton::clicked, this, &EditBookmarksDialog::onAddItem);
|
||||
connect(ui->removeItem, &QPushButton::clicked, this, &EditBookmarksDialog::onRemoveItem);
|
||||
}
|
||||
|
||||
EditBookmarksDialog::~EditBookmarksDialog() {
|
||||
g_object_unref(bookmarks_);
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void EditBookmarksDialog::accept() {
|
||||
// save bookmarks
|
||||
// it's easier to recreate the whole bookmark file than
|
||||
// to manipulate FmBookmarks object. So here we generate the file directly.
|
||||
// FIXME: maybe in the future we should add a libfm API to easily replace all FmBookmarks.
|
||||
// Here we use gtk+ 3.0 bookmarks rather than the gtk+ 2.0 one.
|
||||
// Since gtk+ 2.24.12, gtk+2 reads gtk+3 bookmarks file if it exists.
|
||||
// So it's safe to only save gtk+3 bookmarks file.
|
||||
QString path = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation);
|
||||
path += QLatin1String("/gtk-3.0");
|
||||
if(!QDir().mkpath(path))
|
||||
return; // fail to create ~/.config/gtk-3.0 dir
|
||||
path += QLatin1String("/bookmarks");
|
||||
QSaveFile file(path); // use QSaveFile for atomic file operation
|
||||
if(file.open(QIODevice::WriteOnly)){
|
||||
for(int row = 0; ; ++row) {
|
||||
QTreeWidgetItem* item = ui->treeWidget->topLevelItem(row);
|
||||
if(!item)
|
||||
break;
|
||||
QString name = item->data(0, Qt::DisplayRole).toString();
|
||||
QUrl url = QUrl::fromUserInput(item->data(1, Qt::DisplayRole).toString());
|
||||
file.write(url.toEncoded());
|
||||
file.write(" ");
|
||||
file.write(name.toUtf8());
|
||||
file.write("\n");
|
||||
}
|
||||
// FIXME: should we support Qt or KDE specific bookmarks in the future?
|
||||
file.commit();
|
||||
}
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void EditBookmarksDialog::onAddItem() {
|
||||
QTreeWidgetItem* item = new QTreeWidgetItem();
|
||||
item->setData(0, Qt::DisplayRole, tr("New bookmark"));
|
||||
item->setFlags(Qt::ItemIsSelectable|Qt::ItemIsEditable|Qt::ItemIsDragEnabled|Qt::ItemIsEnabled);
|
||||
ui->treeWidget->addTopLevelItem(item);
|
||||
ui->treeWidget->editItem(item);
|
||||
}
|
||||
|
||||
void EditBookmarksDialog::onRemoveItem() {
|
||||
QList<QTreeWidgetItem*> sels = ui->treeWidget->selectedItems();
|
||||
Q_FOREACH(QTreeWidgetItem* item, sels) {
|
||||
delete item;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
53
src/editbookmarksdialog.h
Normal file
53
src/editbookmarksdialog.h
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2013 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_EDITBOOKMARKSDIALOG_H
|
||||
#define FM_EDITBOOKMARKSDIALOG_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QDialog>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Ui {
|
||||
class EditBookmarksDialog;
|
||||
};
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API EditBookmarksDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit EditBookmarksDialog(FmBookmarks* bookmarks, QWidget* parent = 0, Qt::WindowFlags f = 0);
|
||||
virtual ~EditBookmarksDialog();
|
||||
|
||||
virtual void accept();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onAddItem();
|
||||
void onRemoveItem();
|
||||
|
||||
private:
|
||||
Ui::EditBookmarksDialog* ui;
|
||||
FmBookmarks* bookmarks_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_EDITBOOKMARKSDIALOG_H
|
163
src/exec-file.ui
Normal file
163
src/exec-file.ui
Normal file
@ -0,0 +1,163 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>ExecFileDialog</class>
|
||||
<widget class="QDialog" name="ExecFileDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>487</width>
|
||||
<height>58</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Execute file</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="0,1">
|
||||
<item>
|
||||
<widget class="QLabel" name="icon"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="msg">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QPushButton" name="open">
|
||||
<property name="text">
|
||||
<string>&Open</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="document-open"/>
|
||||
</property>
|
||||
<property name="default">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="exec">
|
||||
<property name="text">
|
||||
<string>E&xecute</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="system-run"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="execTerm">
|
||||
<property name="text">
|
||||
<string>Execute in &Terminal</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="utilities-terminal"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="cancel">
|
||||
<property name="text">
|
||||
<string>Cancel</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="dialog-cancel"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>cancel</sender>
|
||||
<signal>clicked()</signal>
|
||||
<receiver>ExecFileDialog</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>341</x>
|
||||
<y>39</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>196</x>
|
||||
<y>28</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>exec</sender>
|
||||
<signal>clicked()</signal>
|
||||
<receiver>ExecFileDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>56</x>
|
||||
<y>39</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>196</x>
|
||||
<y>28</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>execTerm</sender>
|
||||
<signal>clicked()</signal>
|
||||
<receiver>ExecFileDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>201</x>
|
||||
<y>39</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>196</x>
|
||||
<y>28</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>open</sender>
|
||||
<signal>clicked()</signal>
|
||||
<receiver>ExecFileDialog</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>346</x>
|
||||
<y>39</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>250</x>
|
||||
<y>28</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
69
src/execfiledialog.cpp
Normal file
69
src/execfiledialog.cpp
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "execfiledialog_p.h"
|
||||
#include "ui_exec-file.h"
|
||||
#include "icontheme.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
ExecFileDialog::ExecFileDialog(FmFileInfo* file, QWidget* parent, Qt::WindowFlags f):
|
||||
QDialog (parent, f),
|
||||
ui(new Ui::ExecFileDialog()),
|
||||
fileInfo_(fm_file_info_ref(file)),
|
||||
result_(FM_FILE_LAUNCHER_EXEC_CANCEL) {
|
||||
|
||||
ui->setupUi(this);
|
||||
// show file icon
|
||||
FmIcon* icon = fm_file_info_get_icon(fileInfo_);
|
||||
ui->icon->setPixmap(IconTheme::icon(icon).pixmap(QSize(48, 48)));
|
||||
|
||||
QString msg;
|
||||
if(fm_file_info_is_text(file)) {
|
||||
msg = tr("This text file '%1' seems to be an executable script.\nWhat do you want to do with it?")
|
||||
.arg(QString::fromUtf8(fm_file_info_get_disp_name(file)));
|
||||
ui->execTerm->setDefault(true);
|
||||
}
|
||||
else {
|
||||
msg= tr("This file '%1' is executable. Do you want to execute it?")
|
||||
.arg(QString::fromUtf8(fm_file_info_get_disp_name(file)));
|
||||
ui->exec->setDefault(true);
|
||||
ui->open->hide();
|
||||
}
|
||||
ui->msg->setText(msg);
|
||||
}
|
||||
|
||||
ExecFileDialog::~ExecFileDialog() {
|
||||
delete ui;
|
||||
if(fileInfo_)
|
||||
fm_file_info_unref(fileInfo_);
|
||||
}
|
||||
|
||||
void ExecFileDialog::accept() {
|
||||
QObject* _sender = sender();
|
||||
if(_sender == ui->exec)
|
||||
result_ = FM_FILE_LAUNCHER_EXEC;
|
||||
else if(_sender == ui->execTerm)
|
||||
result_ = FM_FILE_LAUNCHER_EXEC_IN_TERMINAL;
|
||||
else if(_sender == ui->open)
|
||||
result_ = FM_FILE_LAUNCHER_EXEC_OPEN;
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
} // namespace Fm
|
53
src/execfiledialog_p.h
Normal file
53
src/execfiledialog_p.h
Normal file
@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Copyright (C) 2014 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_EXECFILEDIALOG_H
|
||||
#define FM_EXECFILEDIALOG_H
|
||||
|
||||
#include <QDialog>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Ui {
|
||||
class ExecFileDialog;
|
||||
}
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class ExecFileDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
~ExecFileDialog();
|
||||
ExecFileDialog(FmFileInfo* fileInfo, QWidget* parent = 0, Qt::WindowFlags f = 0);
|
||||
|
||||
FmFileLauncherExecAction result() {
|
||||
return result_;
|
||||
}
|
||||
|
||||
protected:
|
||||
virtual void accept();
|
||||
|
||||
private:
|
||||
Ui::ExecFileDialog* ui;
|
||||
FmFileInfo* fileInfo_;
|
||||
FmFileLauncherExecAction result_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_EXECFILEDIALOG_H
|
171
src/file-operation-dialog.ui
Normal file
171
src/file-operation-dialog.ui
Normal file
@ -0,0 +1,171 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FileOperationDialog</class>
|
||||
<widget class="QDialog" name="FileOperationDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>450</width>
|
||||
<height>246</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string/>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QLabel" name="message">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="fieldGrowthPolicy">
|
||||
<enum>QFormLayout::AllNonFixedFieldsGrow</enum>
|
||||
</property>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="destLabel">
|
||||
<property name="text">
|
||||
<string>Destination:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="dest">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Processing:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="curFile">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Preparing...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>Progress</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QProgressBar" name="progressBar">
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Time remaining:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="timeRemaining">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0" colspan="2">
|
||||
<widget class="QListWidget" name="sourceFiles">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="2" column="0" colspan="2">
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>FileOperationDialog</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>FileOperationDialog</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>
|
736
src/file-props.ui
Normal file
736
src/file-props.ui
Normal file
@ -0,0 +1,736 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>FilePropsDialog</class>
|
||||
<widget class="QDialog" name="FilePropsDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>424</width>
|
||||
<height>456</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>File Properties</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="document-properties">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<property name="leftMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="topMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="rightMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="bottomMargin">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<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="QFormLayout" name="formLayout_2">
|
||||
<property name="horizontalSpacing">
|
||||
<number>12</number>
|
||||
</property>
|
||||
<property name="verticalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QPushButton" name="iconButton">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="unknown">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
<property name="iconSize">
|
||||
<size>
|
||||
<width>32</width>
|
||||
<height>32</height>
|
||||
</size>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QLineEdit" name="fileName"/>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="text">
|
||||
<string>Location:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLabel" name="location">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QLabel" name="label_4">
|
||||
<property name="text">
|
||||
<string>File type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QLabel" name="fileType">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="0">
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>MIME type:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="4" column="1">
|
||||
<widget class="QLabel" name="mimeType">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="0">
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="text">
|
||||
<string>File size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="6" column="1">
|
||||
<widget class="QLabel" name="fileSize">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="0">
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="text">
|
||||
<string>On-disk size:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="7" column="1">
|
||||
<widget class="QLabel" name="onDiskSize">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="0">
|
||||
<widget class="QLabel" name="label_3">
|
||||
<property name="text">
|
||||
<string>Last modified:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="8" column="1">
|
||||
<widget class="QLabel" name="lastModified">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="targetLabel">
|
||||
<property name="text">
|
||||
<string>Link target:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLabel" name="target">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="0">
|
||||
<widget class="QLabel" name="openWithLabel">
|
||||
<property name="text">
|
||||
<string>Open With:</string>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="5" column="1">
|
||||
<widget class="Fm::AppChooserComboBox" name="openWith">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="0">
|
||||
<widget class="QLabel" name="label_12">
|
||||
<property name="text">
|
||||
<string>Last accessed:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="9" column="1">
|
||||
<widget class="QLabel" name="lastAccessed">
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
<property name="textInteractionFlags">
|
||||
<set>Qt::LinksAccessibleByKeyboard|Qt::LinksAccessibleByMouse|Qt::TextBrowserInteraction|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="permissionsPage">
|
||||
<attribute name="title">
|
||||
<string>Permissions</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Ownership</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<property name="horizontalSpacing">
|
||||
<number>12</number>
|
||||
</property>
|
||||
<property name="verticalSpacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="1" column="1">
|
||||
<widget class="QLineEdit" name="owner"/>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QLineEdit" name="ownerGroup"/>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_9">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Group:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_8">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Owner:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Access Control</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QStackedWidget" name="stackedWidget">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="page">
|
||||
<layout class="QFormLayout" name="formLayout_3">
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="ownerLabel">
|
||||
<property name="text">
|
||||
<string>Owner:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QComboBox" name="ownerPerm">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="groupLabel">
|
||||
<property name="text">
|
||||
<string>Group:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QComboBox" name="groupPerm">
|
||||
<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="otherLabel">
|
||||
<property name="text">
|
||||
<string>Other:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QComboBox" name="otherPerm">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0" colspan="2">
|
||||
<widget class="QCheckBox" name="executable">
|
||||
<property name="text">
|
||||
<string>Make the file executable</string>
|
||||
</property>
|
||||
<property name="tristate">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="page_2">
|
||||
<layout class="QGridLayout" name="gridLayout_2" columnstretch="1,0,0">
|
||||
<item row="0" column="0" rowspan="3">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<property name="rightMargin">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<property name="spacing">
|
||||
<number>6</number>
|
||||
</property>
|
||||
<item row="0" column="0">
|
||||
<widget class="QLabel" name="label_5">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Owner:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1">
|
||||
<widget class="QCheckBox" name="checkBox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Read</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_5">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Write</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QCheckBox" name="checkBox_8">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Execute</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="0">
|
||||
<widget class="QLabel" name="label_10">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Group:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="1">
|
||||
<widget class="QCheckBox" name="checkBox_4">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Read</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_9">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Write</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QCheckBox" name="checkBox_3">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Execute</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="0">
|
||||
<widget class="QLabel" name="label_11">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Fixed" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Other:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QCheckBox" name="checkBox_7">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Read</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_2">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Write</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="3">
|
||||
<widget class="QCheckBox" name="checkBox_6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Execute</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_10">
|
||||
<property name="text">
|
||||
<string>Sticky</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_11">
|
||||
<property name="text">
|
||||
<string>SetUID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="2">
|
||||
<widget class="QCheckBox" name="checkBox_12">
|
||||
<property name="text">
|
||||
<string>SetGID</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="1" rowspan="3">
|
||||
<widget class="Line" name="line">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="pushButton">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Advanced Mode</string>
|
||||
</property>
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</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::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>Fm::AppChooserComboBox</class>
|
||||
<extends>QComboBox</extends>
|
||||
<header>appchoosercombobox.h</header>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>FilePropsDialog</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>FilePropsDialog</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>
|
153
src/file.h
Normal file
153
src/file.h
Normal file
@ -0,0 +1,153 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_FILE_H__
|
||||
#define __LIBFM_QT_FM_FILE_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API File {
|
||||
public:
|
||||
|
||||
|
||||
// default constructor
|
||||
File() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
File(FmFile* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
File(const File& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
File(File&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
virtual ~File() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static File wrapPtr(FmFile* dataPtr) {
|
||||
File obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmFile* takeDataPtr() {
|
||||
FmFile* data = reinterpret_cast<FmFile*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmFile* dataPtr() {
|
||||
return reinterpret_cast<FmFile*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmFile*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
File& operator=(const File& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
File& operator=(File&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
static GFile* newForCommandlineArg(const char* arg) {
|
||||
return fm_file_new_for_commandline_arg(arg);
|
||||
}
|
||||
|
||||
|
||||
static GFile* newForUri(const char* uri) {
|
||||
return fm_file_new_for_uri(uri);
|
||||
}
|
||||
|
||||
|
||||
static bool wantsIncremental(GFile* file) {
|
||||
return fm_file_wants_incremental(file);
|
||||
}
|
||||
|
||||
|
||||
static void addVfs(const char* name, FmFileInitTable* init) {
|
||||
fm_file_add_vfs(name, init);
|
||||
}
|
||||
|
||||
|
||||
// automatic type casting for GObject
|
||||
operator GObject*() {
|
||||
return reinterpret_cast<GObject*>(dataPtr_);
|
||||
}
|
||||
|
||||
|
||||
protected:
|
||||
GObject* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_FILE_H__
|
511
src/fileinfo.h
Normal file
511
src/fileinfo.h
Normal file
@ -0,0 +1,511 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_FILE_INFO_H__
|
||||
#define __LIBFM_QT_FM_FILE_INFO_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API FileInfoList {
|
||||
public:
|
||||
|
||||
|
||||
FileInfoList( ) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfoList*>(fm_file_info_list_new());
|
||||
}
|
||||
|
||||
|
||||
FileInfoList(FmFileInfoList* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<FmFileInfoList*>(fm_list_ref(FM_LIST(dataPtr))) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
FileInfoList(const FileInfoList& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<FmFileInfoList*>(fm_list_ref(FM_LIST(other.dataPtr_))) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
FileInfoList(FileInfoList&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfoList*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
~FileInfoList() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
fm_list_unref(FM_LIST(dataPtr_));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static FileInfoList wrapPtr(FmFileInfoList* dataPtr) {
|
||||
FileInfoList obj;
|
||||
obj.dataPtr_ = reinterpret_cast<FmFileInfoList*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmFileInfoList* takeDataPtr() {
|
||||
FmFileInfoList* data = reinterpret_cast<FmFileInfoList*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmFileInfoList* dataPtr() {
|
||||
return reinterpret_cast<FmFileInfoList*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmFileInfoList*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
FileInfoList& operator=(const FileInfoList& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
fm_list_unref(FM_LIST(dataPtr_));
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<FmFileInfoList*>(fm_list_ref(FM_LIST(other.dataPtr_))) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
FileInfoList& operator=(FileInfoList&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfoList*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
bool isSameFs(void) {
|
||||
return fm_file_info_list_is_same_fs(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isSameType(void) {
|
||||
return fm_file_info_list_is_same_type(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isEmpty() {
|
||||
return fm_file_info_list_is_empty(dataPtr());
|
||||
}
|
||||
|
||||
unsigned int getLength() {
|
||||
return fm_file_info_list_get_length(dataPtr());
|
||||
}
|
||||
|
||||
FmFileInfo* peekHead() {
|
||||
return fm_file_info_list_peek_head(dataPtr());
|
||||
}
|
||||
|
||||
GList* peekHeadLink() {
|
||||
return fm_file_info_list_peek_head_link(dataPtr());
|
||||
}
|
||||
|
||||
void pushTail(FmFileInfo* d) {
|
||||
fm_file_info_list_push_tail(dataPtr(), d);
|
||||
}
|
||||
|
||||
void pushTailLink(GList* d) {
|
||||
fm_file_info_list_push_tail_link(dataPtr(), d);
|
||||
}
|
||||
|
||||
FmFileInfo* popHead(){
|
||||
return fm_file_info_list_pop_head(dataPtr());
|
||||
}
|
||||
|
||||
void deleteLink(GList* _l) {
|
||||
fm_file_info_list_delete_link(dataPtr(), _l);
|
||||
}
|
||||
|
||||
void clear() {
|
||||
fm_file_info_list_clear(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
FmFileInfoList* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
|
||||
class LIBFM_QT_API FileInfo {
|
||||
public:
|
||||
|
||||
|
||||
FileInfo( ) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfo*>(fm_file_info_new());
|
||||
}
|
||||
|
||||
|
||||
FileInfo(FmFileInfo* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<FmFileInfo*>(fm_file_info_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
FileInfo(const FileInfo& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<FmFileInfo*>(fm_file_info_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
FileInfo(FileInfo&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfo*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
// destructor
|
||||
~FileInfo() {
|
||||
if(dataPtr_ != nullptr) {
|
||||
fm_file_info_unref(dataPtr_);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static FileInfo wrapPtr(FmFileInfo* dataPtr) {
|
||||
FileInfo obj;
|
||||
obj.dataPtr_ = reinterpret_cast<FmFileInfo*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmFileInfo* takeDataPtr() {
|
||||
FmFileInfo* data = reinterpret_cast<FmFileInfo*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmFileInfo* dataPtr() {
|
||||
return reinterpret_cast<FmFileInfo*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmFileInfo*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
FileInfo& operator=(const FileInfo& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
fm_file_info_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<FmFileInfo*>(fm_file_info_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
FileInfo& operator=(FileInfo&& other) {
|
||||
dataPtr_ = reinterpret_cast<FmFileInfo*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
bool canSetHidden(void) {
|
||||
return fm_file_info_can_set_hidden(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool canSetIcon(void) {
|
||||
return fm_file_info_can_set_icon(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool canSetName(void) {
|
||||
return fm_file_info_can_set_name(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool canThumbnail(void) {
|
||||
return fm_file_info_can_thumbnail(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
dev_t getDev(void) {
|
||||
return fm_file_info_get_dev(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
gid_t getGid(void) {
|
||||
return fm_file_info_get_gid(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
uid_t getUid(void) {
|
||||
return fm_file_info_get_uid(dataPtr());
|
||||
}
|
||||
|
||||
const char* getDispGroup() {
|
||||
return fm_file_info_get_disp_group(dataPtr());
|
||||
}
|
||||
|
||||
const char* getFsId() {
|
||||
return fm_file_info_get_fs_id(dataPtr());
|
||||
}
|
||||
|
||||
FmIcon* getIcon(void) {
|
||||
return fm_file_info_get_icon(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
time_t getCtime(void) {
|
||||
return fm_file_info_get_ctime(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
time_t getAtime(void) {
|
||||
return fm_file_info_get_atime(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
time_t getMtime(void) {
|
||||
return fm_file_info_get_mtime(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
const char* getTarget() {
|
||||
return fm_file_info_get_target(dataPtr());
|
||||
}
|
||||
|
||||
const char* getCollateKey() {
|
||||
return fm_file_info_get_collate_key(dataPtr());
|
||||
}
|
||||
|
||||
const char* getCollateKeyNoCaseFold() {
|
||||
return fm_file_info_get_collate_key_nocasefold(dataPtr());
|
||||
}
|
||||
|
||||
const char* getDesc() {
|
||||
return fm_file_info_get_desc(dataPtr());
|
||||
}
|
||||
|
||||
const char* getDispMtime() {
|
||||
return fm_file_info_get_disp_mtime(dataPtr());
|
||||
}
|
||||
|
||||
bool isWritableDirectory(void) {
|
||||
return fm_file_info_is_writable_directory(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isAccessible(void) {
|
||||
return fm_file_info_is_accessible(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isExecutableType(void) {
|
||||
return fm_file_info_is_executable_type(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isBackup(void) {
|
||||
return fm_file_info_is_backup(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isHidden(void) {
|
||||
return fm_file_info_is_hidden(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isUnknownType(void) {
|
||||
return fm_file_info_is_unknown_type(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isDesktopEntry(void) {
|
||||
return fm_file_info_is_desktop_entry(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isText(void) {
|
||||
return fm_file_info_is_text(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isImage(void) {
|
||||
return fm_file_info_is_image(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isMountable(void) {
|
||||
return fm_file_info_is_mountable(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isShortcut(void) {
|
||||
return fm_file_info_is_shortcut(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isSymlink(void) {
|
||||
return fm_file_info_is_symlink(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isDir(void) {
|
||||
return fm_file_info_is_dir(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
FmMimeType* getMimeType(void) {
|
||||
return fm_file_info_get_mime_type(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
bool isNative(void) {
|
||||
return fm_file_info_is_native(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
mode_t getMode(void) {
|
||||
return fm_file_info_get_mode(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
goffset getBlocks(void) {
|
||||
return fm_file_info_get_blocks(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
goffset getSize(void) {
|
||||
return fm_file_info_get_size(dataPtr());
|
||||
}
|
||||
|
||||
const char* getDispSize() {
|
||||
return fm_file_info_get_disp_size(dataPtr());
|
||||
}
|
||||
|
||||
void setIcon(GIcon* icon) {
|
||||
fm_file_info_set_icon(dataPtr(), icon);
|
||||
}
|
||||
|
||||
|
||||
void setDispName(const char* name) {
|
||||
fm_file_info_set_disp_name(dataPtr(), name);
|
||||
}
|
||||
|
||||
|
||||
void setPath(FmPath* path) {
|
||||
fm_file_info_set_path(dataPtr(), path);
|
||||
}
|
||||
|
||||
|
||||
const char* getName() {
|
||||
return fm_file_info_get_name(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
const char* getDispName() {
|
||||
return fm_file_info_get_disp_name(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
FmPath* getPath(void) {
|
||||
return fm_file_info_get_path(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void update(FmFileInfo* src) {
|
||||
fm_file_info_update(dataPtr(), src);
|
||||
}
|
||||
|
||||
|
||||
static FileInfo newFromNativeFile(FmPath* path, const char* path_str, GError** err) {
|
||||
return FileInfo::wrapPtr(fm_file_info_new_from_native_file(path, path_str, err));
|
||||
}
|
||||
|
||||
|
||||
bool setFromNativeFile(const char* path, GError** err) {
|
||||
return fm_file_info_set_from_native_file(dataPtr(), path, err);
|
||||
}
|
||||
|
||||
|
||||
void setFromMenuCacheItem(struct _MenuCacheItem* item) {
|
||||
fm_file_info_set_from_menu_cache_item(dataPtr(), item);
|
||||
}
|
||||
|
||||
|
||||
static FileInfo newFromMenuCacheItem(FmPath* path, struct _MenuCacheItem* item) {
|
||||
return FileInfo::wrapPtr(fm_file_info_new_from_menu_cache_item(path, item));
|
||||
}
|
||||
|
||||
|
||||
void setFromGFileData(GFile* gf, GFileInfo* inf) {
|
||||
fm_file_info_set_from_g_file_data(dataPtr(), gf, inf);
|
||||
}
|
||||
|
||||
|
||||
static FileInfo newFromGFileData(GFile* gf, GFileInfo* inf, FmPath* path) {
|
||||
return FileInfo::wrapPtr(fm_file_info_new_from_g_file_data(gf, inf, path));
|
||||
}
|
||||
|
||||
|
||||
void setFromGfileinfo(GFileInfo* inf) {
|
||||
fm_file_info_set_from_gfileinfo(dataPtr(), inf);
|
||||
}
|
||||
|
||||
|
||||
static FileInfo newFromGfileinfo(FmPath* path, GFileInfo* inf) {
|
||||
return FileInfo::wrapPtr(fm_file_info_new_from_gfileinfo(path, inf));
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
FmFileInfo* dataPtr_; // data pointer for the underlying C struct
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_FILE_INFO_H__
|
138
src/fileinfojob.h
Normal file
138
src/fileinfojob.h
Normal file
@ -0,0 +1,138 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_FILE_INFO_JOB_H__
|
||||
#define __LIBFM_QT_FM_FILE_INFO_JOB_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
#include "job.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API FileInfoJob: public Job {
|
||||
public:
|
||||
|
||||
|
||||
FileInfoJob(FmPathList* files_to_query, FmFileInfoJobFlags flags) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(fm_file_info_job_new(files_to_query, flags));
|
||||
}
|
||||
|
||||
|
||||
// default constructor
|
||||
FileInfoJob() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
FileInfoJob(FmFileInfoJob* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
FileInfoJob(const FileInfoJob& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
FileInfoJob(FileInfoJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static FileInfoJob wrapPtr(FmFileInfoJob* dataPtr) {
|
||||
FileInfoJob obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmFileInfoJob* takeDataPtr() {
|
||||
FmFileInfoJob* data = reinterpret_cast<FmFileInfoJob*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmFileInfoJob* dataPtr() {
|
||||
return reinterpret_cast<FmFileInfoJob*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmFileInfoJob*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
FileInfoJob& operator=(const FileInfoJob& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
FileInfoJob& operator=(FileInfoJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
FmPath* getCurrent(void) {
|
||||
return fm_file_info_job_get_current(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void addGfile(GFile* gf) {
|
||||
fm_file_info_job_add_gfile(dataPtr(), gf);
|
||||
}
|
||||
|
||||
|
||||
void add(FmPath* path) {
|
||||
fm_file_info_job_add(dataPtr(), path);
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_FILE_INFO_JOB_H__
|
123
src/filelauncher.cpp
Normal file
123
src/filelauncher.cpp
Normal file
@ -0,0 +1,123 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "filelauncher.h"
|
||||
#include "applaunchcontext.h"
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include "execfiledialog_p.h"
|
||||
#include "appchooserdialog.h"
|
||||
#include "utilities.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
FmFileLauncher FileLauncher::funcs = {
|
||||
FileLauncher::_getApp,
|
||||
/* gboolean (*before_open)(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data); */
|
||||
(FmLaunchFolderFunc)FileLauncher::_openFolder,
|
||||
FileLauncher::_execFile,
|
||||
FileLauncher::_error,
|
||||
FileLauncher::_ask
|
||||
};
|
||||
|
||||
FileLauncher::FileLauncher():
|
||||
quickExec_(false) {
|
||||
}
|
||||
|
||||
FileLauncher::~FileLauncher() {
|
||||
}
|
||||
|
||||
//static
|
||||
bool FileLauncher::launchFiles(QWidget* parent, GList* file_infos) {
|
||||
FmAppLaunchContext* context = fm_app_launch_context_new_for_widget(parent);
|
||||
bool ret = fm_launch_files(G_APP_LAUNCH_CONTEXT(context), file_infos, &funcs, this);
|
||||
g_object_unref(context);
|
||||
return ret;
|
||||
}
|
||||
|
||||
bool FileLauncher::launchPaths(QWidget* parent, GList* paths) {
|
||||
FmAppLaunchContext* context = fm_app_launch_context_new_for_widget(parent);
|
||||
bool ret = fm_launch_paths(G_APP_LAUNCH_CONTEXT(context), paths, &funcs, this);
|
||||
g_object_unref(context);
|
||||
return ret;
|
||||
}
|
||||
|
||||
GAppInfo* FileLauncher::getApp(GList* file_infos, FmMimeType* mime_type, GError** err) {
|
||||
AppChooserDialog dlg(NULL);
|
||||
if(mime_type)
|
||||
dlg.setMimeType(mime_type);
|
||||
else
|
||||
dlg.setCanSetDefault(false);
|
||||
// FIXME: show error properly?
|
||||
if(execModelessDialog(&dlg) == QDialog::Accepted) {
|
||||
return dlg.selectedApp();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bool FileLauncher::openFolder(GAppLaunchContext* ctx, GList* folder_infos, GError** err) {
|
||||
for(GList* l = folder_infos; l; l = l->next) {
|
||||
FmFileInfo* fi = FM_FILE_INFO(l->data);
|
||||
qDebug() << " folder:" << QString::fromUtf8(fm_file_info_get_disp_name(fi));
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
FmFileLauncherExecAction FileLauncher::execFile(FmFileInfo* file) {
|
||||
if (quickExec_) {
|
||||
/* SF bug#838: open terminal for each script may be just a waste.
|
||||
User should open a terminal and start the script there
|
||||
in case if user wants to see the script output anyway.
|
||||
if (fm_file_info_is_text(file))
|
||||
return FM_FILE_LAUNCHER_EXEC_IN_TERMINAL; */
|
||||
return FM_FILE_LAUNCHER_EXEC;
|
||||
}
|
||||
|
||||
FmFileLauncherExecAction res = FM_FILE_LAUNCHER_EXEC_CANCEL;
|
||||
ExecFileDialog dlg(file);
|
||||
if(execModelessDialog(&dlg) == QDialog::Accepted) {
|
||||
res = dlg.result();
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
int FileLauncher::ask(const char* msg, char* const* btn_labels, int default_btn) {
|
||||
/* FIXME: set default button properly */
|
||||
// return fm_askv(data->parent, NULL, msg, btn_labels);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bool FileLauncher::error(GAppLaunchContext* ctx, GError* err, FmPath* path) {
|
||||
/* ask for mount if trying to launch unmounted path */
|
||||
if(err->domain == G_IO_ERROR) {
|
||||
if(path && err->code == G_IO_ERROR_NOT_MOUNTED) {
|
||||
//if(fm_mount_path(data->parent, path, TRUE))
|
||||
// return FALSE; /* ask to retry */
|
||||
}
|
||||
else if(err->code == G_IO_ERROR_FAILED_HANDLED)
|
||||
return true; /* don't show error message */
|
||||
}
|
||||
QMessageBox dlg(QMessageBox::Critical, QObject::tr("Error"), QString::fromUtf8(err->message), QMessageBox::Ok);
|
||||
execModelessDialog(&dlg);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
87
src/filelauncher.h
Normal file
87
src/filelauncher.h
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILELAUNCHER_H
|
||||
#define FM_FILELAUNCHER_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QWidget>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API FileLauncher {
|
||||
public:
|
||||
FileLauncher();
|
||||
virtual ~FileLauncher();
|
||||
|
||||
bool launchFiles(QWidget* parent, FmFileInfoList* file_infos) {
|
||||
GList* fileList = fm_file_info_list_peek_head_link(file_infos);
|
||||
return launchFiles(parent, fileList);
|
||||
}
|
||||
bool launchPaths(QWidget* parent, FmPathList* paths) {
|
||||
GList* pathList = fm_path_list_peek_head_link(paths);
|
||||
return launchPaths(parent, pathList);
|
||||
}
|
||||
|
||||
bool launchFiles(QWidget* parent, GList* file_infos);
|
||||
bool launchPaths(QWidget* parent, GList* paths);
|
||||
|
||||
bool quickExec() const {
|
||||
return quickExec_;
|
||||
}
|
||||
|
||||
void setQuickExec(bool value) {
|
||||
quickExec_ = value;
|
||||
}
|
||||
|
||||
protected:
|
||||
|
||||
virtual GAppInfo* getApp(GList* file_infos, FmMimeType* mime_type, GError** err);
|
||||
virtual bool openFolder(GAppLaunchContext* ctx, GList* folder_infos, GError** err);
|
||||
virtual FmFileLauncherExecAction execFile(FmFileInfo* file);
|
||||
virtual bool error(GAppLaunchContext* ctx, GError* err, FmPath* path);
|
||||
virtual int ask(const char* msg, char* const* btn_labels, int default_btn);
|
||||
|
||||
private:
|
||||
static GAppInfo* _getApp(GList* file_infos, FmMimeType* mime_type, gpointer user_data, GError** err) {
|
||||
return reinterpret_cast<FileLauncher*>(user_data)->getApp(file_infos, mime_type, err);
|
||||
}
|
||||
static gboolean _openFolder(GAppLaunchContext* ctx, GList* folder_infos, gpointer user_data, GError** err) {
|
||||
return reinterpret_cast<FileLauncher*>(user_data)->openFolder(ctx, folder_infos, err);
|
||||
}
|
||||
static FmFileLauncherExecAction _execFile(FmFileInfo* file, gpointer user_data) {
|
||||
return reinterpret_cast<FileLauncher*>(user_data)->execFile(file);
|
||||
}
|
||||
static gboolean _error(GAppLaunchContext* ctx, GError* err, FmPath* file, gpointer user_data) {
|
||||
return reinterpret_cast<FileLauncher*>(user_data)->error(ctx, err, file);
|
||||
}
|
||||
static int _ask(const char* msg, char* const* btn_labels, int default_btn, gpointer user_data) {
|
||||
return reinterpret_cast<FileLauncher*>(user_data)->ask(msg, btn_labels, default_btn);
|
||||
}
|
||||
|
||||
private:
|
||||
static FmFileLauncher funcs;
|
||||
bool quickExec_; // Don't ask options on launch executable file
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILELAUNCHER_H
|
408
src/filemenu.cpp
Normal file
408
src/filemenu.cpp
Normal file
@ -0,0 +1,408 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "filemenu.h"
|
||||
#include "createnewmenu.h"
|
||||
#include "icontheme.h"
|
||||
#include "filepropsdialog.h"
|
||||
#include "utilities.h"
|
||||
#include "fileoperation.h"
|
||||
#include "filelauncher.h"
|
||||
#include "appchooserdialog.h"
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
#include <libfm/fm-actions.h>
|
||||
#include "customaction_p.h"
|
||||
#endif
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
#include "filemenu_p.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
FileMenu::FileMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd, QWidget* parent):
|
||||
QMenu(parent),
|
||||
fileLauncher_(NULL) {
|
||||
createMenu(files, info, cwd);
|
||||
}
|
||||
|
||||
FileMenu::FileMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd, const QString& title, QWidget* parent):
|
||||
QMenu(title, parent),
|
||||
unTrashAction_(NULL),
|
||||
fileLauncher_(NULL) {
|
||||
createMenu(files, info, cwd);
|
||||
}
|
||||
|
||||
FileMenu::~FileMenu() {
|
||||
if(files_)
|
||||
fm_file_info_list_unref(files_);
|
||||
if(info_)
|
||||
fm_file_info_unref(info_);
|
||||
if(cwd_)
|
||||
fm_path_unref(cwd_);
|
||||
}
|
||||
|
||||
void FileMenu::createMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd) {
|
||||
useTrash_ = true;
|
||||
confirmDelete_ = true;
|
||||
confirmTrash_ = false; // Confirm before moving files into "trash can"
|
||||
|
||||
openAction_ = NULL;
|
||||
openWithMenuAction_ = NULL;
|
||||
openWithAction_ = NULL;
|
||||
separator1_ = NULL;
|
||||
cutAction_ = NULL;
|
||||
copyAction_ = NULL;
|
||||
pasteAction_ = NULL;
|
||||
deleteAction_ = NULL;
|
||||
unTrashAction_ = NULL;
|
||||
renameAction_ = NULL;
|
||||
separator2_ = NULL;
|
||||
propertiesAction_ = NULL;
|
||||
|
||||
files_ = fm_file_info_list_ref(files);
|
||||
info_ = info ? fm_file_info_ref(info) : NULL;
|
||||
cwd_ = cwd ? fm_path_ref(cwd) : NULL;
|
||||
|
||||
FmFileInfo* first = fm_file_info_list_peek_head(files);
|
||||
FmMimeType* mime_type = fm_file_info_get_mime_type(first);
|
||||
FmPath* path = fm_file_info_get_path(first);
|
||||
// check if the files are of the same type
|
||||
sameType_ = fm_file_info_list_is_same_type(files);
|
||||
// check if the files are on the same filesystem
|
||||
sameFilesystem_ = fm_file_info_list_is_same_fs(files);
|
||||
// check if the files are all virtual
|
||||
allVirtual_ = sameFilesystem_ && fm_path_is_virtual(path);
|
||||
// check if the files are all in the trash can
|
||||
allTrash_ = sameFilesystem_ && fm_path_is_trash(path);
|
||||
|
||||
openAction_ = new QAction(QIcon::fromTheme("document-open"), tr("Open"), this);
|
||||
connect(openAction_ , &QAction::triggered, this, &FileMenu::onOpenTriggered);
|
||||
addAction(openAction_);
|
||||
|
||||
openWithMenuAction_ = new QAction(tr("Open With..."), this);
|
||||
addAction(openWithMenuAction_);
|
||||
// create the "Open with..." sub menu
|
||||
QMenu* menu = new QMenu(this);
|
||||
openWithMenuAction_->setMenu(menu);
|
||||
|
||||
if(sameType_) { /* add specific menu items for this mime type */
|
||||
if(mime_type && !allVirtual_) { /* the file has a valid mime-type and its not virtual */
|
||||
GList* apps = g_app_info_get_all_for_type(fm_mime_type_get_type(mime_type));
|
||||
GList* l;
|
||||
for(l=apps;l;l=l->next) {
|
||||
GAppInfo* app = G_APP_INFO(l->data);
|
||||
|
||||
// check if the command really exists
|
||||
gchar * program_path = g_find_program_in_path(g_app_info_get_executable(app));
|
||||
if (!program_path)
|
||||
continue;
|
||||
g_free(program_path);
|
||||
|
||||
// create a QAction for the application.
|
||||
AppInfoAction* action = new AppInfoAction(app, menu);
|
||||
connect(action, &QAction::triggered, this, &FileMenu::onApplicationTriggered);
|
||||
menu->addAction(action);
|
||||
}
|
||||
// unref GAppInfos here, they are still ref'ed in the AppInfoActions above
|
||||
g_list_foreach(apps, (GFunc)g_object_unref, NULL);
|
||||
g_list_free(apps);
|
||||
}
|
||||
}
|
||||
menu->addSeparator();
|
||||
openWithAction_ = new QAction(tr("Other Applications"), this);
|
||||
connect(openWithAction_ , &QAction::triggered, this, &FileMenu::onOpenWithTriggered);
|
||||
menu->addAction(openWithAction_);
|
||||
|
||||
separator1_ = addSeparator();
|
||||
|
||||
createAction_ = new QAction(tr("Create &New"), this);
|
||||
FmPath* dirPath = fm_file_info_list_get_length(files) == 1 && fm_file_info_is_dir(first)
|
||||
? path : cwd_;
|
||||
createAction_->setMenu(new CreateNewMenu(NULL, dirPath, this));
|
||||
addAction(createAction_);
|
||||
|
||||
separator2_ = addSeparator();
|
||||
|
||||
if(allTrash_) { // all selected files are in trash:///
|
||||
bool can_restore = true;
|
||||
/* only immediate children of trash:/// can be restored. */
|
||||
for(GList* l = fm_file_info_list_peek_head_link(files_); l; l=l->next) {
|
||||
FmPath *trash_path = fm_file_info_get_path(FM_FILE_INFO(l->data));
|
||||
if(!fm_path_get_parent(trash_path) ||
|
||||
!fm_path_is_trash_root(fm_path_get_parent(trash_path))) {
|
||||
can_restore = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(can_restore) {
|
||||
unTrashAction_ = new QAction(tr("&Restore"), this);
|
||||
connect(unTrashAction_, &QAction::triggered, this, &FileMenu::onUnTrashTriggered);
|
||||
addAction(unTrashAction_);
|
||||
}
|
||||
}
|
||||
else { // ordinary files
|
||||
cutAction_ = new QAction(QIcon::fromTheme("edit-cut"), tr("Cut"), this);
|
||||
connect(cutAction_, &QAction::triggered, this, &FileMenu::onCutTriggered);
|
||||
addAction(cutAction_);
|
||||
|
||||
copyAction_ = new QAction(QIcon::fromTheme("edit-copy"), tr("Copy"), this);
|
||||
connect(copyAction_, &QAction::triggered, this, &FileMenu::onCopyTriggered);
|
||||
addAction(copyAction_);
|
||||
|
||||
pasteAction_ = new QAction(QIcon::fromTheme("edit-paste"), tr("Paste"), this);
|
||||
connect(pasteAction_, &QAction::triggered, this, &FileMenu::onPasteTriggered);
|
||||
addAction(pasteAction_);
|
||||
|
||||
deleteAction_ = new QAction(QIcon::fromTheme("user-trash"), tr("&Move to Trash"), this);
|
||||
connect(deleteAction_, &QAction::triggered, this, &FileMenu::onDeleteTriggered);
|
||||
addAction(deleteAction_);
|
||||
|
||||
renameAction_ = new QAction(tr("Rename"), this);
|
||||
connect(renameAction_, &QAction::triggered, this, &FileMenu::onRenameTriggered);
|
||||
addAction(renameAction_);
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
// DES-EMA custom actions integration
|
||||
GList* files_list = fm_file_info_list_peek_head_link(files);
|
||||
GList* items = fm_get_actions_for_files(files_list);
|
||||
if(items) {
|
||||
GList* l;
|
||||
for(l=items; l; l=l->next) {
|
||||
FmFileActionItem* item = FM_FILE_ACTION_ITEM(l->data);
|
||||
if(l == items && item
|
||||
&& !(fm_file_action_item_is_action(item)
|
||||
&& !(fm_file_action_item_get_target(item) & FM_FILE_ACTION_TARGET_CONTEXT))) {
|
||||
addSeparator(); // before all custom actions
|
||||
}
|
||||
addCustomActionItem(this, item);
|
||||
}
|
||||
}
|
||||
g_list_foreach(items, (GFunc)fm_file_action_item_unref, NULL);
|
||||
g_list_free(items);
|
||||
#endif
|
||||
// archiver integration
|
||||
// FIXME: we need to modify upstream libfm to include some Qt-based archiver programs.
|
||||
if(!allVirtual_) {
|
||||
if(sameType_) {
|
||||
FmArchiver* archiver = fm_archiver_get_default();
|
||||
if(archiver) {
|
||||
if(fm_archiver_is_mime_type_supported(archiver, fm_mime_type_get_type(mime_type))) {
|
||||
if(cwd_ && archiver->extract_to_cmd) {
|
||||
QAction* action = new QAction(tr("Extract to..."), this);
|
||||
connect(action, &QAction::triggered, this, &FileMenu::onExtract);
|
||||
addAction(action);
|
||||
}
|
||||
if(archiver->extract_cmd) {
|
||||
QAction* action = new QAction(tr("Extract Here"), this);
|
||||
connect(action, &QAction::triggered, this, &FileMenu::onExtractHere);
|
||||
addAction(action);
|
||||
}
|
||||
}
|
||||
else {
|
||||
QAction* action = new QAction(tr("Compress"), this);
|
||||
connect(action, &QAction::triggered, this, &FileMenu::onCompress);
|
||||
addAction(action);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
separator3_ = addSeparator();
|
||||
|
||||
propertiesAction_ = new QAction(QIcon::fromTheme("document-properties"), tr("Properties"), this);
|
||||
connect(propertiesAction_, &QAction::triggered, this, &FileMenu::onFilePropertiesTriggered);
|
||||
addAction(propertiesAction_);
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
void FileMenu::addCustomActionItem(QMenu* menu, FmFileActionItem* item) {
|
||||
if(!item) { // separator
|
||||
addSeparator();
|
||||
return;
|
||||
}
|
||||
|
||||
// this action is not for context menu
|
||||
if(fm_file_action_item_is_action(item) && !(fm_file_action_item_get_target(item) & FM_FILE_ACTION_TARGET_CONTEXT))
|
||||
return;
|
||||
|
||||
CustomAction* action = new CustomAction(item, menu);
|
||||
menu->addAction(action);
|
||||
if(fm_file_action_item_is_menu(item)) {
|
||||
GList* subitems = fm_file_action_item_get_sub_items(item);
|
||||
if (subitems != NULL) {
|
||||
QMenu* submenu = new QMenu(menu);
|
||||
for(GList* l = subitems; l; l = l->next) {
|
||||
FmFileActionItem* subitem = FM_FILE_ACTION_ITEM(l->data);
|
||||
addCustomActionItem(submenu, subitem);
|
||||
}
|
||||
action->setMenu(submenu);
|
||||
}
|
||||
}
|
||||
else if(fm_file_action_item_is_action(item)) {
|
||||
connect(action, &QAction::triggered, this, &FileMenu::onCustomActionTrigerred);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void FileMenu::onOpenTriggered() {
|
||||
if(fileLauncher_) {
|
||||
fileLauncher_->launchFiles(NULL, files_);
|
||||
}
|
||||
else { // use the default launcher
|
||||
Fm::FileLauncher launcher;
|
||||
launcher.launchFiles(NULL, files_);
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::onOpenWithTriggered() {
|
||||
AppChooserDialog dlg(NULL);
|
||||
if(sameType_) {
|
||||
dlg.setMimeType(fm_file_info_get_mime_type(info_));
|
||||
}
|
||||
else { // we can only set the selected app as default if all files are of the same type
|
||||
dlg.setCanSetDefault(false);
|
||||
}
|
||||
|
||||
if(execModelessDialog(&dlg) == QDialog::Accepted) {
|
||||
GAppInfo* app = dlg.selectedApp();
|
||||
if(app) {
|
||||
openFilesWithApp(app);
|
||||
g_object_unref(app);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::openFilesWithApp(GAppInfo* app) {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
GList* uris = NULL;
|
||||
for(GList* l = fm_path_list_peek_head_link(paths); l; l = l->next) {
|
||||
FmPath* path = FM_PATH(l->data);
|
||||
char* uri = fm_path_to_uri(path);
|
||||
uris = g_list_prepend(uris, uri);
|
||||
}
|
||||
fm_path_list_unref(paths);
|
||||
fm_app_info_launch_uris(app, uris, NULL, NULL);
|
||||
g_list_foreach(uris, (GFunc)g_free, NULL);
|
||||
g_list_free(uris);
|
||||
}
|
||||
|
||||
void FileMenu::onApplicationTriggered() {
|
||||
AppInfoAction* action = static_cast<AppInfoAction*>(sender());
|
||||
openFilesWithApp(action->appInfo());
|
||||
}
|
||||
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
void FileMenu::onCustomActionTrigerred() {
|
||||
CustomAction* action = static_cast<CustomAction*>(sender());
|
||||
FmFileActionItem* item = action->item();
|
||||
|
||||
GList* files = fm_file_info_list_peek_head_link(files_);
|
||||
char* output = NULL;
|
||||
/* g_debug("item: %s is activated, id:%s", fm_file_action_item_get_name(item),
|
||||
fm_file_action_item_get_id(item)); */
|
||||
fm_file_action_item_launch(item, NULL, files, &output);
|
||||
if(output) {
|
||||
QMessageBox::information(this, tr("Output"), QString::fromUtf8(output));
|
||||
g_free(output);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void FileMenu::onFilePropertiesTriggered() {
|
||||
FilePropsDialog::showForFiles(files_);
|
||||
}
|
||||
|
||||
void FileMenu::onCopyTriggered() {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
Fm::copyFilesToClipboard(paths);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
|
||||
void FileMenu::onCutTriggered() {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
Fm::cutFilesToClipboard(paths);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
|
||||
void FileMenu::onDeleteTriggered() {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
if(useTrash_)
|
||||
FileOperation::trashFiles(paths, confirmTrash_);
|
||||
else
|
||||
FileOperation::deleteFiles(paths, confirmDelete_);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
|
||||
void FileMenu::onUnTrashTriggered() {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
FileOperation::unTrashFiles(paths);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
|
||||
void FileMenu::onPasteTriggered() {
|
||||
Fm::pasteFilesFromClipboard(cwd_);
|
||||
}
|
||||
|
||||
void FileMenu::onRenameTriggered() {
|
||||
for(GList* l = fm_file_info_list_peek_head_link(files_); l; l = l->next) {
|
||||
FmFileInfo* info = FM_FILE_INFO(l->data);
|
||||
Fm::renameFile(info, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::setUseTrash(bool trash) {
|
||||
if(useTrash_ != trash) {
|
||||
useTrash_ = trash;
|
||||
if(deleteAction_) {
|
||||
deleteAction_->setText(useTrash_ ? tr("&Move to Trash") : tr("&Delete"));
|
||||
deleteAction_->setIcon(useTrash_ ? QIcon::fromTheme("user-trash") : QIcon::fromTheme("edit-delete"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::onCompress() {
|
||||
FmArchiver* archiver = fm_archiver_get_default();
|
||||
if(archiver) {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
fm_archiver_create_archive(archiver, NULL, paths);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::onExtract() {
|
||||
FmArchiver* archiver = fm_archiver_get_default();
|
||||
if(archiver) {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
fm_archiver_extract_archives(archiver, NULL, paths);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
}
|
||||
|
||||
void FileMenu::onExtractHere() {
|
||||
FmArchiver* archiver = fm_archiver_get_default();
|
||||
if(archiver) {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files_);
|
||||
fm_archiver_extract_archives_to(archiver, NULL, paths, cwd_);
|
||||
fm_path_list_unref(paths);
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace Fm
|
218
src/filemenu.h
Normal file
218
src/filemenu.h
Normal file
@ -0,0 +1,218 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILEMENU_H
|
||||
#define FM_FILEMENU_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QMenu>
|
||||
#include <qabstractitemmodel.h>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
class QAction;
|
||||
|
||||
struct _FmFileActionItem;
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class FileLauncher;
|
||||
|
||||
class LIBFM_QT_API FileMenu : public QMenu {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FileMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd, QWidget* parent = 0);
|
||||
explicit FileMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd, const QString& title, QWidget* parent = 0);
|
||||
~FileMenu();
|
||||
|
||||
bool useTrash() {
|
||||
return useTrash_;
|
||||
}
|
||||
|
||||
void setUseTrash(bool trash);
|
||||
|
||||
bool confirmDelete() {
|
||||
return confirmDelete_;
|
||||
}
|
||||
|
||||
void setConfirmDelete(bool confirm) {
|
||||
confirmDelete_ = confirm;
|
||||
}
|
||||
|
||||
QAction* openAction() {
|
||||
return openAction_;
|
||||
}
|
||||
|
||||
QAction* openWithMenuAction() {
|
||||
return openWithMenuAction_;
|
||||
}
|
||||
|
||||
QAction* openWithAction() {
|
||||
return openWithAction_;
|
||||
}
|
||||
|
||||
QAction* separator1() {
|
||||
return separator1_;
|
||||
}
|
||||
|
||||
QAction* createAction() {
|
||||
return createAction_;
|
||||
}
|
||||
|
||||
QAction* separator2() {
|
||||
return separator2_;
|
||||
}
|
||||
|
||||
QAction* cutAction() {
|
||||
return cutAction_;
|
||||
}
|
||||
|
||||
QAction* copyAction() {
|
||||
return copyAction_;
|
||||
}
|
||||
|
||||
QAction* pasteAction() {
|
||||
return pasteAction_;
|
||||
}
|
||||
|
||||
QAction* deleteAction() {
|
||||
return deleteAction_;
|
||||
}
|
||||
|
||||
QAction* unTrashAction() {
|
||||
return unTrashAction_;
|
||||
}
|
||||
|
||||
QAction* renameAction() {
|
||||
return renameAction_;
|
||||
}
|
||||
|
||||
QAction* separator3() {
|
||||
return separator3_;
|
||||
}
|
||||
|
||||
QAction* propertiesAction() {
|
||||
return propertiesAction_;
|
||||
}
|
||||
|
||||
FmFileInfoList* files() {
|
||||
return files_;
|
||||
}
|
||||
|
||||
FmFileInfo* firstFile() {
|
||||
return info_;
|
||||
}
|
||||
|
||||
FmPath* cwd() {
|
||||
return cwd_;
|
||||
}
|
||||
|
||||
void setFileLauncher(FileLauncher* launcher) {
|
||||
fileLauncher_ = launcher;
|
||||
}
|
||||
|
||||
FileLauncher* fileLauncher() {
|
||||
return fileLauncher_;
|
||||
}
|
||||
|
||||
bool sameType() const {
|
||||
return sameType_;
|
||||
}
|
||||
|
||||
bool sameFilesystem() const {
|
||||
return sameFilesystem_;
|
||||
}
|
||||
|
||||
bool allVirtual() const {
|
||||
return allVirtual_;
|
||||
}
|
||||
|
||||
bool allTrash() const {
|
||||
return allTrash_;
|
||||
}
|
||||
|
||||
bool confirmTrash() const {
|
||||
return confirmTrash_;
|
||||
}
|
||||
|
||||
void setConfirmTrash(bool value) {
|
||||
confirmTrash_ = value;
|
||||
}
|
||||
|
||||
protected:
|
||||
void createMenu(FmFileInfoList* files, FmFileInfo* info, FmPath* cwd);
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
void addCustomActionItem(QMenu* menu, struct _FmFileActionItem* item);
|
||||
#endif
|
||||
void openFilesWithApp(GAppInfo* app);
|
||||
|
||||
protected Q_SLOTS:
|
||||
void onOpenTriggered();
|
||||
void onOpenWithTriggered();
|
||||
void onFilePropertiesTriggered();
|
||||
void onApplicationTriggered();
|
||||
#ifdef CUSTOM_ACTIONS
|
||||
void onCustomActionTrigerred();
|
||||
#endif
|
||||
void onCompress();
|
||||
void onExtract();
|
||||
void onExtractHere();
|
||||
|
||||
void onCutTriggered();
|
||||
void onCopyTriggered();
|
||||
void onPasteTriggered();
|
||||
void onRenameTriggered();
|
||||
void onDeleteTriggered();
|
||||
void onUnTrashTriggered();
|
||||
|
||||
private:
|
||||
FmFileInfoList* files_;
|
||||
FmFileInfo* info_;
|
||||
FmPath* cwd_;
|
||||
bool useTrash_;
|
||||
bool confirmDelete_;
|
||||
bool confirmTrash_; // Confirm before moving files into "trash can"
|
||||
|
||||
bool sameType_;
|
||||
bool sameFilesystem_;
|
||||
bool allVirtual_;
|
||||
bool allTrash_;
|
||||
|
||||
QAction* openAction_;
|
||||
QAction* openWithMenuAction_;
|
||||
QAction* openWithAction_;
|
||||
QAction* separator1_;
|
||||
QAction* createAction_;
|
||||
QAction* separator2_;
|
||||
QAction* cutAction_;
|
||||
QAction* copyAction_;
|
||||
QAction* pasteAction_;
|
||||
QAction* deleteAction_;
|
||||
QAction* unTrashAction_;
|
||||
QAction* renameAction_;
|
||||
QAction* separator3_;
|
||||
QAction* propertiesAction_;
|
||||
|
||||
FileLauncher* fileLauncher_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILEMENU_H
|
55
src/filemenu_p.h
Normal file
55
src/filemenu_p.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILEMENU_P_H
|
||||
#define FM_FILEMENU_P_H
|
||||
|
||||
#include "icontheme.h"
|
||||
#include <QDebug>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class AppInfoAction : public QAction {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit AppInfoAction(GAppInfo* app, QObject* parent = 0):
|
||||
QAction(QString::fromUtf8(g_app_info_get_name(app)), parent),
|
||||
appInfo_(G_APP_INFO(g_object_ref(app))) {
|
||||
setToolTip(QString::fromUtf8(g_app_info_get_description(app)));
|
||||
GIcon* gicon = g_app_info_get_icon(app);
|
||||
QIcon icon = IconTheme::icon(gicon);
|
||||
setIcon(icon);
|
||||
}
|
||||
|
||||
virtual ~AppInfoAction() {
|
||||
if(appInfo_)
|
||||
g_object_unref(appInfo_);
|
||||
}
|
||||
|
||||
GAppInfo* appInfo() const {
|
||||
return appInfo_;
|
||||
}
|
||||
|
||||
private:
|
||||
GAppInfo* appInfo_;
|
||||
};
|
||||
|
||||
} // namespace Fm
|
||||
|
||||
#endif
|
307
src/fileoperation.cpp
Normal file
307
src/fileoperation.cpp
Normal file
@ -0,0 +1,307 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "fileoperation.h"
|
||||
#include "fileoperationdialog.h"
|
||||
#include <QTimer>
|
||||
#include <QElapsedTimer>
|
||||
#include <QMessageBox>
|
||||
#include <QDebug>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
#define SHOW_DLG_DELAY 1000
|
||||
|
||||
FileOperation::FileOperation(Type type, FmPathList* srcFiles, QObject* parent):
|
||||
QObject(parent),
|
||||
job_(fm_file_ops_job_new((FmFileOpType)type, srcFiles)),
|
||||
dlg(NULL),
|
||||
destPath(NULL),
|
||||
srcPaths(fm_path_list_ref(srcFiles)),
|
||||
uiTimer(NULL),
|
||||
elapsedTimer_(NULL),
|
||||
lastElapsed_(0),
|
||||
updateRemainingTime_(true),
|
||||
autoDestroy_(true) {
|
||||
|
||||
g_signal_connect(job_, "ask", G_CALLBACK(onFileOpsJobAsk), this);
|
||||
g_signal_connect(job_, "ask-rename", G_CALLBACK(onFileOpsJobAskRename), this);
|
||||
g_signal_connect(job_, "error", G_CALLBACK(onFileOpsJobError), this);
|
||||
g_signal_connect(job_, "prepared", G_CALLBACK(onFileOpsJobPrepared), this);
|
||||
g_signal_connect(job_, "cur-file", G_CALLBACK(onFileOpsJobCurFile), this);
|
||||
g_signal_connect(job_, "percent", G_CALLBACK(onFileOpsJobPercent), this);
|
||||
g_signal_connect(job_, "finished", G_CALLBACK(onFileOpsJobFinished), this);
|
||||
g_signal_connect(job_, "cancelled", G_CALLBACK(onFileOpsJobCancelled), this);
|
||||
}
|
||||
|
||||
void FileOperation::disconnectJob() {
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobAsk), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobAskRename), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobError), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobPrepared), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobCurFile), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobPercent), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobFinished), this);
|
||||
g_signal_handlers_disconnect_by_func(job_, (gpointer)G_CALLBACK(onFileOpsJobCancelled), this);
|
||||
}
|
||||
|
||||
FileOperation::~FileOperation() {
|
||||
if(uiTimer) {
|
||||
uiTimer->stop();
|
||||
delete uiTimer;
|
||||
uiTimer = NULL;
|
||||
}
|
||||
if(elapsedTimer_) {
|
||||
delete elapsedTimer_;
|
||||
elapsedTimer_ = NULL;
|
||||
}
|
||||
|
||||
if(job_) {
|
||||
disconnectJob();
|
||||
g_object_unref(job_);
|
||||
}
|
||||
|
||||
if(srcPaths)
|
||||
fm_path_list_unref(srcPaths);
|
||||
|
||||
if(destPath)
|
||||
fm_path_unref(destPath);
|
||||
}
|
||||
|
||||
bool FileOperation::run() {
|
||||
delete uiTimer;
|
||||
// run the job
|
||||
uiTimer = new QTimer();
|
||||
uiTimer->start(SHOW_DLG_DELAY);
|
||||
connect(uiTimer, &QTimer::timeout, this, &FileOperation::onUiTimeout);
|
||||
|
||||
return fm_job_run_async(FM_JOB(job_));
|
||||
}
|
||||
|
||||
void FileOperation::onUiTimeout() {
|
||||
if(dlg) {
|
||||
dlg->setCurFile(curFile);
|
||||
// estimate remaining time based on past history
|
||||
// FIXME: avoid directly access data member of FmFileOpsJob
|
||||
if(Q_LIKELY(job_->percent > 0 && updateRemainingTime_)) {
|
||||
gint64 remaining = elapsedTime() * ((double(100 - job_->percent) / job_->percent) / 1000);
|
||||
dlg->setRemainingTime(remaining);
|
||||
}
|
||||
// this timeout slot is called every 0.5 second.
|
||||
// by adding this flag, we can update remaining time every 1 second.
|
||||
updateRemainingTime_ = !updateRemainingTime_;
|
||||
}
|
||||
else{
|
||||
showDialog();
|
||||
}
|
||||
}
|
||||
|
||||
void FileOperation::showDialog() {
|
||||
if(!dlg) {
|
||||
dlg = new FileOperationDialog(this);
|
||||
dlg->setSourceFiles(srcPaths);
|
||||
|
||||
if(destPath)
|
||||
dlg->setDestPath(destPath);
|
||||
|
||||
if(curFile.isEmpty()) {
|
||||
dlg->setPrepared();
|
||||
dlg->setCurFile(curFile);
|
||||
}
|
||||
uiTimer->setInterval(500); // change the interval of the timer
|
||||
// now the timer is used to update current file display
|
||||
dlg->show();
|
||||
}
|
||||
}
|
||||
|
||||
gint FileOperation::onFileOpsJobAsk(FmFileOpsJob* job, const char* question, char*const* options, FileOperation* pThis) {
|
||||
pThis->pauseElapsedTimer();
|
||||
pThis->showDialog();
|
||||
int ret = pThis->dlg->ask(QString::fromUtf8(question), options);
|
||||
pThis->resumeElapsedTimer();
|
||||
return ret;
|
||||
}
|
||||
|
||||
gint FileOperation::onFileOpsJobAskRename(FmFileOpsJob* job, FmFileInfo* src, FmFileInfo* dest, char** new_name, FileOperation* pThis) {
|
||||
pThis->pauseElapsedTimer();
|
||||
pThis->showDialog();
|
||||
QString newName;
|
||||
int ret = pThis->dlg->askRename(src, dest, newName);
|
||||
if(!newName.isEmpty()) {
|
||||
*new_name = g_strdup(newName.toUtf8().constData());
|
||||
}
|
||||
pThis->resumeElapsedTimer();
|
||||
return ret;
|
||||
}
|
||||
|
||||
void FileOperation::onFileOpsJobCancelled(FmFileOpsJob* job, FileOperation* pThis) {
|
||||
qDebug("file operation is cancelled!");
|
||||
}
|
||||
|
||||
void FileOperation::onFileOpsJobCurFile(FmFileOpsJob* job, const char* cur_file, FileOperation* pThis) {
|
||||
pThis->curFile = QString::fromUtf8(cur_file);
|
||||
|
||||
// We update the current file name in a timeout slot because drawing a string
|
||||
// in the UI is expansive. Updating the label text too often cause
|
||||
// significant impact on performance.
|
||||
// if(pThis->dlg)
|
||||
// pThis->dlg->setCurFile(pThis->curFile);
|
||||
}
|
||||
|
||||
FmJobErrorAction FileOperation::onFileOpsJobError(FmFileOpsJob* job, GError* err, FmJobErrorSeverity severity, FileOperation* pThis) {
|
||||
pThis->pauseElapsedTimer();
|
||||
pThis->showDialog();
|
||||
FmJobErrorAction act = pThis->dlg->error(err, severity);
|
||||
pThis->resumeElapsedTimer();
|
||||
return act;
|
||||
}
|
||||
|
||||
void FileOperation::onFileOpsJobFinished(FmFileOpsJob* job, FileOperation* pThis) {
|
||||
pThis->handleFinish();
|
||||
}
|
||||
|
||||
void FileOperation::onFileOpsJobPercent(FmFileOpsJob* job, guint percent, FileOperation* pThis) {
|
||||
if(pThis->dlg) {
|
||||
pThis->dlg->setPercent(percent);
|
||||
}
|
||||
}
|
||||
|
||||
void FileOperation::onFileOpsJobPrepared(FmFileOpsJob* job, FileOperation* pThis) {
|
||||
if(!pThis->elapsedTimer_) {
|
||||
pThis->elapsedTimer_ = new QElapsedTimer();
|
||||
pThis->elapsedTimer_->start();
|
||||
}
|
||||
if(pThis->dlg) {
|
||||
pThis->dlg->setPrepared();
|
||||
}
|
||||
}
|
||||
|
||||
void FileOperation::handleFinish() {
|
||||
disconnectJob();
|
||||
|
||||
if(uiTimer) {
|
||||
uiTimer->stop();
|
||||
delete uiTimer;
|
||||
uiTimer = NULL;
|
||||
}
|
||||
|
||||
if(dlg) {
|
||||
dlg->done(QDialog::Accepted);
|
||||
delete dlg;
|
||||
dlg = NULL;
|
||||
}
|
||||
Q_EMIT finished();
|
||||
|
||||
/* sepcial handling for trash
|
||||
* FIXME: need to refactor this to use a more elegant way later. */
|
||||
if(job_->type == FM_FILE_OP_TRASH) { /* FIXME: direct access to job struct! */
|
||||
FmPathList* unable_to_trash = static_cast<FmPathList*>(g_object_get_data(G_OBJECT(job_), "trash-unsupported"));
|
||||
/* some files cannot be trashed because underlying filesystems don't support it. */
|
||||
if(unable_to_trash) { /* delete them instead */
|
||||
/* FIXME: parent window might be already destroyed! */
|
||||
QWidget* parent = NULL; // FIXME: currently, parent window is not set
|
||||
if(QMessageBox::question(parent, tr("Error"),
|
||||
tr("Some files cannot be moved to trash can because "
|
||||
"the underlying file systems don't support this operation.\n"
|
||||
"Do you want to delete them instead?")) == QMessageBox::Yes) {
|
||||
deleteFiles(unable_to_trash, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
g_object_unref(job_);
|
||||
job_ = NULL;
|
||||
|
||||
if(autoDestroy_)
|
||||
delete this;
|
||||
}
|
||||
|
||||
// static
|
||||
FileOperation* FileOperation::copyFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent) {
|
||||
FileOperation* op = new FileOperation(FileOperation::Copy, srcFiles);
|
||||
op->setDestination(dest);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
// static
|
||||
FileOperation* FileOperation::moveFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent) {
|
||||
FileOperation* op = new FileOperation(FileOperation::Move, srcFiles);
|
||||
op->setDestination(dest);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
//static
|
||||
FileOperation* FileOperation::symlinkFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent) {
|
||||
FileOperation* op = new FileOperation(FileOperation::Link, srcFiles);
|
||||
op->setDestination(dest);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
//static
|
||||
FileOperation* FileOperation::deleteFiles(FmPathList* srcFiles, bool prompt, QWidget* parent) {
|
||||
if(prompt) {
|
||||
int result = QMessageBox::warning(parent, tr("Confirm"),
|
||||
tr("Do you want to delete the selected files?"),
|
||||
QMessageBox::Yes|QMessageBox::No,
|
||||
QMessageBox::No);
|
||||
if(result != QMessageBox::Yes)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FileOperation* op = new FileOperation(FileOperation::Delete, srcFiles);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
//static
|
||||
FileOperation* FileOperation::trashFiles(FmPathList* srcFiles, bool prompt, QWidget* parent) {
|
||||
if(prompt) {
|
||||
int result = QMessageBox::warning(parent, tr("Confirm"),
|
||||
tr("Do you want to move the selected files to trash can?"),
|
||||
QMessageBox::Yes|QMessageBox::No,
|
||||
QMessageBox::No);
|
||||
if(result != QMessageBox::Yes)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FileOperation* op = new FileOperation(FileOperation::Trash, srcFiles);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
//static
|
||||
FileOperation* FileOperation::unTrashFiles(FmPathList* srcFiles, QWidget* parent) {
|
||||
FileOperation* op = new FileOperation(FileOperation::UnTrash, srcFiles);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
// static
|
||||
FileOperation* FileOperation::changeAttrFiles(FmPathList* srcFiles, QWidget* parent) {
|
||||
//TODO
|
||||
FileOperation* op = new FileOperation(FileOperation::ChangeAttr, srcFiles);
|
||||
op->run();
|
||||
return op;
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
164
src/fileoperation.h
Normal file
164
src/fileoperation.h
Normal file
@ -0,0 +1,164 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILEOPERATION_H
|
||||
#define FM_FILEOPERATION_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QObject>
|
||||
#include <QElapsedTimer>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
class QTimer;
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class FileOperationDialog;
|
||||
|
||||
class LIBFM_QT_API FileOperation : public QObject {
|
||||
Q_OBJECT
|
||||
public:
|
||||
enum Type {
|
||||
Copy = FM_FILE_OP_COPY,
|
||||
Move = FM_FILE_OP_MOVE,
|
||||
Link = FM_FILE_OP_LINK,
|
||||
Delete = FM_FILE_OP_DELETE,
|
||||
Trash = FM_FILE_OP_TRASH,
|
||||
UnTrash = FM_FILE_OP_UNTRASH,
|
||||
ChangeAttr = FM_FILE_OP_CHANGE_ATTR
|
||||
};
|
||||
|
||||
public:
|
||||
explicit FileOperation(Type type, FmPathList* srcFiles, QObject* parent = 0);
|
||||
virtual ~FileOperation();
|
||||
|
||||
void setDestination(FmPath* dest) {
|
||||
destPath = fm_path_ref(dest);
|
||||
fm_file_ops_job_set_dest(job_, dest);
|
||||
}
|
||||
|
||||
void setChmod(mode_t newMode, mode_t newModeMask) {
|
||||
fm_file_ops_job_set_chmod(job_, newMode, newModeMask);
|
||||
}
|
||||
|
||||
void setChown(gint uid, gint gid) {
|
||||
fm_file_ops_job_set_chown(job_, uid, gid);
|
||||
}
|
||||
|
||||
// This only work for change attr jobs.
|
||||
void setRecursiveChattr(bool recursive) {
|
||||
fm_file_ops_job_set_recursive(job_, (gboolean)recursive);
|
||||
}
|
||||
|
||||
bool run();
|
||||
|
||||
void cancel() {
|
||||
if(job_)
|
||||
fm_job_cancel(FM_JOB(job_));
|
||||
}
|
||||
|
||||
bool isRunning() const {
|
||||
return job_ ? fm_job_is_running(FM_JOB(job_)) : false;
|
||||
}
|
||||
|
||||
bool isCancelled() const {
|
||||
return job_ ? fm_job_is_cancelled(FM_JOB(job_)) : false;
|
||||
}
|
||||
|
||||
FmFileOpsJob* job() {
|
||||
return job_;
|
||||
}
|
||||
|
||||
bool autoDestroy() {
|
||||
return autoDestroy_;
|
||||
}
|
||||
void setAutoDestroy(bool destroy = true) {
|
||||
autoDestroy_ = destroy;
|
||||
}
|
||||
|
||||
Type type() {
|
||||
return (Type)job_->type;
|
||||
}
|
||||
|
||||
// convinient static functions
|
||||
static FileOperation* copyFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent = 0);
|
||||
static FileOperation* moveFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent = 0);
|
||||
static FileOperation* symlinkFiles(FmPathList* srcFiles, FmPath* dest, QWidget* parent = 0);
|
||||
static FileOperation* deleteFiles(FmPathList* srcFiles, bool promp = true, QWidget* parent = 0);
|
||||
static FileOperation* trashFiles(FmPathList* srcFiles, bool promp = true, QWidget* parent = 0);
|
||||
static FileOperation* unTrashFiles(FmPathList* srcFiles, QWidget* parent = 0);
|
||||
static FileOperation* changeAttrFiles(FmPathList* srcFiles, QWidget* parent = 0);
|
||||
|
||||
Q_SIGNALS:
|
||||
void finished();
|
||||
|
||||
private:
|
||||
static gint onFileOpsJobAsk(FmFileOpsJob* job, const char* question, char* const* options, FileOperation* pThis);
|
||||
static gint onFileOpsJobAskRename(FmFileOpsJob* job, FmFileInfo* src, FmFileInfo* dest, char** new_name, FileOperation* pThis);
|
||||
static FmJobErrorAction onFileOpsJobError(FmFileOpsJob* job, GError* err, FmJobErrorSeverity severity, FileOperation* pThis);
|
||||
static void onFileOpsJobPrepared(FmFileOpsJob* job, FileOperation* pThis);
|
||||
static void onFileOpsJobCurFile(FmFileOpsJob* job, const char* cur_file, FileOperation* pThis);
|
||||
static void onFileOpsJobPercent(FmFileOpsJob* job, guint percent, FileOperation* pThis);
|
||||
static void onFileOpsJobFinished(FmFileOpsJob* job, FileOperation* pThis);
|
||||
static void onFileOpsJobCancelled(FmFileOpsJob* job, FileOperation* pThis);
|
||||
|
||||
void handleFinish();
|
||||
void disconnectJob();
|
||||
void showDialog();
|
||||
|
||||
void pauseElapsedTimer() {
|
||||
if(Q_LIKELY(elapsedTimer_ != NULL)) {
|
||||
lastElapsed_ += elapsedTimer_->elapsed();
|
||||
elapsedTimer_->invalidate();
|
||||
}
|
||||
}
|
||||
|
||||
void resumeElapsedTimer() {
|
||||
if(Q_LIKELY(elapsedTimer_ != NULL)) {
|
||||
elapsedTimer_->start();
|
||||
}
|
||||
}
|
||||
|
||||
qint64 elapsedTime() {
|
||||
if(Q_LIKELY(elapsedTimer_ != NULL)) {
|
||||
return lastElapsed_ + elapsedTimer_->elapsed();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
private Q_SLOTS:
|
||||
void onUiTimeout();
|
||||
|
||||
private:
|
||||
FmFileOpsJob* job_;
|
||||
FileOperationDialog* dlg;
|
||||
FmPath* destPath;
|
||||
FmPathList* srcPaths;
|
||||
QTimer* uiTimer;
|
||||
QElapsedTimer* elapsedTimer_;
|
||||
qint64 lastElapsed_;
|
||||
bool updateRemainingTime_;
|
||||
QString curFile;
|
||||
bool autoDestroy_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILEOPERATION_H
|
178
src/fileoperationdialog.cpp
Normal file
178
src/fileoperationdialog.cpp
Normal file
@ -0,0 +1,178 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "fileoperationdialog.h"
|
||||
#include "fileoperation.h"
|
||||
#include "renamedialog.h"
|
||||
#include <QMessageBox>
|
||||
#include "ui_file-operation-dialog.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
FileOperationDialog::FileOperationDialog(FileOperation* _operation):
|
||||
QDialog(NULL),
|
||||
operation(_operation),
|
||||
defaultOption(-1) {
|
||||
|
||||
ui = new Ui::FileOperationDialog();
|
||||
ui->setupUi(this);
|
||||
|
||||
QString title;
|
||||
QString message;
|
||||
switch(_operation->type()) {
|
||||
case FM_FILE_OP_MOVE:
|
||||
title = tr("Move files");
|
||||
message = tr("Moving the following files to destination folder:");
|
||||
break;
|
||||
case FM_FILE_OP_COPY:
|
||||
title = tr("Copy Files");
|
||||
message = tr("Copying the following files to destination folder:");
|
||||
break;
|
||||
case FM_FILE_OP_TRASH:
|
||||
title = tr("Trash Files");
|
||||
message = tr("Moving the following files to trash can:");
|
||||
break;
|
||||
case FM_FILE_OP_DELETE:
|
||||
title = tr("Delete Files");
|
||||
message = tr("Deleting the following files:");
|
||||
ui->dest->hide();
|
||||
ui->destLabel->hide();
|
||||
break;
|
||||
case FM_FILE_OP_LINK:
|
||||
title = tr("Create Symlinks");
|
||||
message = tr("Creating symlinks for the following files:");
|
||||
break;
|
||||
case FM_FILE_OP_CHANGE_ATTR:
|
||||
title = tr("Change Attributes");
|
||||
message = tr("Changing attributes of the following files:");
|
||||
ui->dest->hide();
|
||||
ui->destLabel->hide();
|
||||
break;
|
||||
case FM_FILE_OP_UNTRASH:
|
||||
title = tr("Restore Trashed Files");
|
||||
message = tr("Restoring the following files from trash can:");
|
||||
ui->dest->hide();
|
||||
ui->destLabel->hide();
|
||||
break;
|
||||
}
|
||||
ui->message->setText(message);
|
||||
setWindowTitle(title);
|
||||
}
|
||||
|
||||
|
||||
FileOperationDialog::~FileOperationDialog() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void FileOperationDialog::setDestPath(FmPath* dest) {
|
||||
char* pathStr = fm_path_display_name(dest, false);
|
||||
ui->dest->setText(QString::fromUtf8(pathStr));
|
||||
g_free(pathStr);
|
||||
}
|
||||
|
||||
void FileOperationDialog::setSourceFiles(FmPathList* srcFiles) {
|
||||
GList* l;
|
||||
for(l = fm_path_list_peek_head_link(srcFiles); l; l = l->next) {
|
||||
FmPath* path = FM_PATH(l->data);
|
||||
char* pathStr = fm_path_display_name(path, false);
|
||||
ui->sourceFiles->addItem(QString::fromUtf8(pathStr));
|
||||
g_free(pathStr);
|
||||
}
|
||||
}
|
||||
|
||||
int FileOperationDialog::ask(QString question, char*const* options) {
|
||||
// TODO: implement FileOperationDialog::ask()
|
||||
return 0;
|
||||
}
|
||||
|
||||
int FileOperationDialog::askRename(FmFileInfo* src, FmFileInfo* dest, QString& new_name) {
|
||||
int ret;
|
||||
if(defaultOption == -1) { // default action is not set, ask the user
|
||||
RenameDialog dlg(src, dest, this);
|
||||
dlg.exec();
|
||||
switch(dlg.action()) {
|
||||
case RenameDialog::ActionOverwrite:
|
||||
ret = FM_FILE_OP_OVERWRITE;
|
||||
if(dlg.applyToAll())
|
||||
defaultOption = ret;
|
||||
break;
|
||||
case RenameDialog::ActionRename:
|
||||
ret = FM_FILE_OP_RENAME;
|
||||
new_name = dlg.newName();
|
||||
break;
|
||||
case RenameDialog::ActionIgnore:
|
||||
ret = FM_FILE_OP_SKIP;
|
||||
if(dlg.applyToAll())
|
||||
defaultOption = ret;
|
||||
break;
|
||||
default:
|
||||
ret = FM_FILE_OP_CANCEL;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
ret = defaultOption;
|
||||
return ret;
|
||||
}
|
||||
|
||||
FmJobErrorAction FileOperationDialog::error(GError* err, FmJobErrorSeverity severity) {
|
||||
if(severity >= FM_JOB_ERROR_MODERATE) {
|
||||
QMessageBox::critical(this, tr("Error"), QString::fromUtf8(err->message));
|
||||
if(severity == FM_JOB_ERROR_CRITICAL)
|
||||
return FM_JOB_ABORT;
|
||||
}
|
||||
return FM_JOB_CONTINUE;
|
||||
}
|
||||
|
||||
void FileOperationDialog::setCurFile(QString cur_file) {
|
||||
ui->curFile->setText(cur_file);
|
||||
}
|
||||
|
||||
void FileOperationDialog::setPercent(unsigned int percent) {
|
||||
ui->progressBar->setValue(percent);
|
||||
}
|
||||
|
||||
void FileOperationDialog::setRemainingTime(unsigned int sec) {
|
||||
unsigned int min = 0;
|
||||
unsigned int hr = 0;
|
||||
if(sec > 60) {
|
||||
min = sec / 60;
|
||||
sec %= 60;
|
||||
if(min > 60) {
|
||||
hr = min / 60;
|
||||
min %= 60;
|
||||
}
|
||||
}
|
||||
ui->timeRemaining->setText(QString("%1:%2:%3")
|
||||
.arg(hr, 2, 10, QChar('0'))
|
||||
.arg(min, 2, 10, QChar('0'))
|
||||
.arg(sec, 2, 10, QChar('0')));
|
||||
}
|
||||
|
||||
void FileOperationDialog::setPrepared() {
|
||||
}
|
||||
|
||||
void FileOperationDialog::reject() {
|
||||
operation->cancel();
|
||||
QDialog::reject();
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
63
src/fileoperationdialog.h
Normal file
63
src/fileoperationdialog.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILEOPERATIONDIALOG_H
|
||||
#define FM_FILEOPERATIONDIALOG_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QDialog>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Ui {
|
||||
class FileOperationDialog;
|
||||
};
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class FileOperation;
|
||||
|
||||
class LIBFM_QT_API FileOperationDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit FileOperationDialog(FileOperation* _operation);
|
||||
virtual ~FileOperationDialog();
|
||||
|
||||
void setSourceFiles(FmPathList* srcFiles);
|
||||
void setDestPath(FmPath* dest);
|
||||
|
||||
int ask(QString question, char* const* options);
|
||||
int askRename(FmFileInfo* src, FmFileInfo* dest, QString& new_name);
|
||||
FmJobErrorAction error(GError* err, FmJobErrorSeverity severity);
|
||||
void setPrepared();
|
||||
void setCurFile(QString cur_file);
|
||||
void setPercent(unsigned int percent);
|
||||
void setRemainingTime(unsigned int sec);
|
||||
|
||||
virtual void reject();
|
||||
|
||||
private:
|
||||
Ui::FileOperationDialog* ui;
|
||||
FileOperation* operation;
|
||||
int defaultOption;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILEOPERATIONDIALOG_H
|
193
src/fileopsjob.h
Normal file
193
src/fileopsjob.h
Normal file
@ -0,0 +1,193 @@
|
||||
/*
|
||||
* Copyright (C) 2016 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 __LIBFM_QT_FM_FILE_OPS_JOB_H__
|
||||
#define __LIBFM_QT_FM_FILE_OPS_JOB_H__
|
||||
|
||||
#include <libfm/fm.h>
|
||||
#include <QObject>
|
||||
#include <QtGlobal>
|
||||
#include "libfmqtglobals.h"
|
||||
#include "job.h"
|
||||
|
||||
namespace Fm {
|
||||
|
||||
|
||||
class LIBFM_QT_API FileOpsJob: public Job {
|
||||
public:
|
||||
|
||||
|
||||
FileOpsJob(FmFileOpType type, FmPathList* files) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(fm_file_ops_job_new(type, files));
|
||||
}
|
||||
|
||||
|
||||
// default constructor
|
||||
FileOpsJob() {
|
||||
dataPtr_ = nullptr;
|
||||
}
|
||||
|
||||
|
||||
FileOpsJob(FmFileOpsJob* dataPtr){
|
||||
dataPtr_ = dataPtr != nullptr ? reinterpret_cast<GObject*>(g_object_ref(dataPtr)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// copy constructor
|
||||
FileOpsJob(const FileOpsJob& other) {
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
}
|
||||
|
||||
|
||||
// move constructor
|
||||
FileOpsJob(FileOpsJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
}
|
||||
|
||||
|
||||
|
||||
// create a wrapper for the data pointer without increasing the reference count
|
||||
static FileOpsJob wrapPtr(FmFileOpsJob* dataPtr) {
|
||||
FileOpsJob obj;
|
||||
obj.dataPtr_ = reinterpret_cast<GObject*>(dataPtr);
|
||||
return obj;
|
||||
}
|
||||
|
||||
// disown the managed data pointer
|
||||
FmFileOpsJob* takeDataPtr() {
|
||||
FmFileOpsJob* data = reinterpret_cast<FmFileOpsJob*>(dataPtr_);
|
||||
dataPtr_ = nullptr;
|
||||
return data;
|
||||
}
|
||||
|
||||
// get the raw pointer wrapped
|
||||
FmFileOpsJob* dataPtr() {
|
||||
return reinterpret_cast<FmFileOpsJob*>(dataPtr_);
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator FmFileOpsJob*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
// automatic type casting
|
||||
operator void*() {
|
||||
return dataPtr();
|
||||
}
|
||||
|
||||
|
||||
// copy assignment
|
||||
FileOpsJob& operator=(const FileOpsJob& other) {
|
||||
if(dataPtr_ != nullptr) {
|
||||
g_object_unref(dataPtr_);
|
||||
}
|
||||
dataPtr_ = other.dataPtr_ != nullptr ? reinterpret_cast<GObject*>(g_object_ref(other.dataPtr_)) : nullptr;
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
// move assignment
|
||||
FileOpsJob& operator=(FileOpsJob&& other) {
|
||||
dataPtr_ = reinterpret_cast<GObject*>(other.takeDataPtr());
|
||||
return *this;
|
||||
}
|
||||
|
||||
bool isNull() {
|
||||
return (dataPtr_ == nullptr);
|
||||
}
|
||||
|
||||
// methods
|
||||
|
||||
FmFileOpOption getOptions(void) {
|
||||
return fm_file_ops_job_get_options(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
FmFileOpOption askRename(GFile* src, GFileInfo* src_inf, GFile* dest, GFile** new_dest) {
|
||||
return fm_file_ops_job_ask_rename(dataPtr(), src, src_inf, dest, new_dest);
|
||||
}
|
||||
|
||||
|
||||
void emitPercent(void) {
|
||||
fm_file_ops_job_emit_percent(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void emitCurFile(const char* cur_file) {
|
||||
fm_file_ops_job_emit_cur_file(dataPtr(), cur_file);
|
||||
}
|
||||
|
||||
|
||||
void emitPrepared(void) {
|
||||
fm_file_ops_job_emit_prepared(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void setTarget(const char* url) {
|
||||
fm_file_ops_job_set_target(dataPtr(), url);
|
||||
}
|
||||
|
||||
|
||||
void setHidden(gboolean hidden) {
|
||||
fm_file_ops_job_set_hidden(dataPtr(), hidden);
|
||||
}
|
||||
|
||||
|
||||
void setIcon(GIcon* icon) {
|
||||
fm_file_ops_job_set_icon(dataPtr(), icon);
|
||||
}
|
||||
|
||||
|
||||
void setDisplayName(const char* name) {
|
||||
fm_file_ops_job_set_display_name(dataPtr(), name);
|
||||
}
|
||||
|
||||
|
||||
void setChown(gint uid, gint gid) {
|
||||
fm_file_ops_job_set_chown(dataPtr(), uid, gid);
|
||||
}
|
||||
|
||||
|
||||
void setChmod(mode_t new_mode, mode_t new_mode_mask) {
|
||||
fm_file_ops_job_set_chmod(dataPtr(), new_mode, new_mode_mask);
|
||||
}
|
||||
|
||||
|
||||
void setRecursive(gboolean recursive) {
|
||||
fm_file_ops_job_set_recursive(dataPtr(), recursive);
|
||||
}
|
||||
|
||||
|
||||
FmPath* getDest(void) {
|
||||
return fm_file_ops_job_get_dest(dataPtr());
|
||||
}
|
||||
|
||||
|
||||
void setDest(FmPath* dest) {
|
||||
fm_file_ops_job_set_dest(dataPtr(), dest);
|
||||
}
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
#endif // __LIBFM_QT_FM_FILE_OPS_JOB_H__
|
0
src/fileopsjobchangeattr.h
Normal file
0
src/fileopsjobchangeattr.h
Normal file
0
src/fileopsjobdelete.h
Normal file
0
src/fileopsjobdelete.h
Normal file
0
src/fileopsjobxfer.h
Normal file
0
src/fileopsjobxfer.h
Normal file
476
src/filepropsdialog.cpp
Normal file
476
src/filepropsdialog.cpp
Normal file
@ -0,0 +1,476 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "filepropsdialog.h"
|
||||
#include "ui_file-props.h"
|
||||
#include "icontheme.h"
|
||||
#include "utilities.h"
|
||||
#include "fileoperation.h"
|
||||
#include <QStringBuilder>
|
||||
#include <QStringListModel>
|
||||
#include <QMessageBox>
|
||||
#include <qdial.h>
|
||||
#include <sys/types.h>
|
||||
#include <time.h>
|
||||
|
||||
#define DIFFERENT_UIDS ((uid)-1)
|
||||
#define DIFFERENT_GIDS ((gid)-1)
|
||||
#define DIFFERENT_PERMS ((mode_t)-1)
|
||||
|
||||
namespace Fm {
|
||||
|
||||
enum {
|
||||
ACCESS_NO_CHANGE = 0,
|
||||
ACCESS_READ_ONLY,
|
||||
ACCESS_READ_WRITE,
|
||||
ACCESS_FORBID
|
||||
};
|
||||
|
||||
FilePropsDialog::FilePropsDialog(FmFileInfoList* files, QWidget* parent, Qt::WindowFlags f):
|
||||
QDialog(parent, f),
|
||||
fileInfos_(fm_file_info_list_ref(files)),
|
||||
fileInfo(fm_file_info_list_peek_head(files)),
|
||||
singleType(fm_file_info_list_is_same_type(files)),
|
||||
singleFile(fm_file_info_list_get_length(files) == 1 ? true:false),
|
||||
mimeType(NULL) {
|
||||
|
||||
setAttribute(Qt::WA_DeleteOnClose);
|
||||
|
||||
ui = new Ui::FilePropsDialog();
|
||||
ui->setupUi(this);
|
||||
|
||||
if(singleType) {
|
||||
mimeType = fm_mime_type_ref(fm_file_info_get_mime_type(fileInfo));
|
||||
}
|
||||
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(files);
|
||||
deepCountJob = fm_deep_count_job_new(paths, FM_DC_JOB_DEFAULT);
|
||||
fm_path_list_unref(paths);
|
||||
|
||||
initGeneralPage();
|
||||
initPermissionsPage();
|
||||
}
|
||||
|
||||
FilePropsDialog::~FilePropsDialog() {
|
||||
if(fileInfos_)
|
||||
fm_file_info_list_unref(fileInfos_);
|
||||
|
||||
// Stop the timer if it's still running
|
||||
if(fileSizeTimer) {
|
||||
fileSizeTimer->stop();
|
||||
delete fileSizeTimer;
|
||||
fileSizeTimer = NULL;
|
||||
}
|
||||
|
||||
// Cancel the indexing job if it hasn't finished
|
||||
if(deepCountJob) {
|
||||
g_signal_handlers_disconnect_by_func(deepCountJob, (gpointer)G_CALLBACK(onDeepCountJobFinished), this);
|
||||
fm_job_cancel(FM_JOB(deepCountJob));
|
||||
g_object_unref(deepCountJob);
|
||||
deepCountJob = NULL;
|
||||
}
|
||||
|
||||
// And finally delete the dialog's UI
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void FilePropsDialog::initApplications() {
|
||||
if(singleType && mimeType && !fm_file_info_is_dir(fileInfo)) {
|
||||
ui->openWith->setMimeType(mimeType);
|
||||
}
|
||||
else {
|
||||
ui->openWith->hide();
|
||||
ui->openWithLabel->hide();
|
||||
}
|
||||
}
|
||||
|
||||
void FilePropsDialog::initPermissionsPage() {
|
||||
// ownership handling
|
||||
// get owner/group and mode of the first file in the list
|
||||
uid = fm_file_info_get_uid(fileInfo);
|
||||
gid = fm_file_info_get_gid(fileInfo);
|
||||
mode_t mode = fm_file_info_get_mode(fileInfo);
|
||||
ownerPerm = (mode & (S_IRUSR|S_IWUSR|S_IXUSR));
|
||||
groupPerm = (mode & (S_IRGRP|S_IWGRP|S_IXGRP));
|
||||
otherPerm = (mode & (S_IROTH|S_IWOTH|S_IXOTH));
|
||||
execPerm = (mode & (S_IXUSR|S_IXGRP|S_IXOTH));
|
||||
allNative = fm_file_info_is_native(fileInfo);
|
||||
hasDir = S_ISDIR(mode);
|
||||
|
||||
// check if all selected files belongs to the same owner/group or have the same mode
|
||||
// at the same time, check if all files are on native unix filesystems
|
||||
GList* l;
|
||||
for(l = fm_file_info_list_peek_head_link(fileInfos_)->next; l; l = l->next) {
|
||||
FmFileInfo* fi = FM_FILE_INFO(l->data);
|
||||
if(allNative && !fm_file_info_is_native(fi))
|
||||
allNative = false; // not all of the files are native
|
||||
|
||||
mode_t fi_mode = fm_file_info_get_mode(fi);
|
||||
if(S_ISDIR(fi_mode))
|
||||
hasDir = true; // the files list contains dir(s)
|
||||
|
||||
if(uid != DIFFERENT_UIDS && uid != fm_file_info_get_uid(fi))
|
||||
uid = DIFFERENT_UIDS; // not all files have the same owner
|
||||
if(gid != DIFFERENT_GIDS && gid != fm_file_info_get_gid(fi))
|
||||
gid = DIFFERENT_GIDS; // not all files have the same owner group
|
||||
|
||||
if(ownerPerm != DIFFERENT_PERMS && ownerPerm != (fi_mode & (S_IRUSR|S_IWUSR|S_IXUSR)))
|
||||
ownerPerm = DIFFERENT_PERMS; // not all files have the same permission for owner
|
||||
if(groupPerm != DIFFERENT_PERMS && groupPerm != (fi_mode & (S_IRGRP|S_IWGRP|S_IXGRP)))
|
||||
groupPerm = DIFFERENT_PERMS; // not all files have the same permission for grop
|
||||
if(otherPerm != DIFFERENT_PERMS && otherPerm != (fi_mode & (S_IROTH|S_IWOTH|S_IXOTH)))
|
||||
otherPerm = DIFFERENT_PERMS; // not all files have the same permission for other
|
||||
if(execPerm != DIFFERENT_PERMS && execPerm != (fi_mode & (S_IXUSR|S_IXGRP|S_IXOTH)))
|
||||
execPerm = DIFFERENT_PERMS; // not all files have the same executable permission
|
||||
}
|
||||
|
||||
// init owner/group
|
||||
initOwner();
|
||||
|
||||
// if all files are of the same type, and some of them are dirs => all of the items are dirs
|
||||
// rwx values have different meanings for dirs
|
||||
// Let's make it clear for the users
|
||||
// init combo boxes for file permissions here
|
||||
QStringList comboItems;
|
||||
comboItems.append("---"); // no change
|
||||
if(singleType && hasDir) { // all files are dirs
|
||||
comboItems.append(tr("View folder content"));
|
||||
comboItems.append(tr("View and modify folder content"));
|
||||
ui->executable->hide();
|
||||
}
|
||||
else { //not all of the files are dirs
|
||||
comboItems.append(tr("Read"));
|
||||
comboItems.append(tr("Read and write"));
|
||||
}
|
||||
comboItems.append(tr("Forbidden"));
|
||||
QStringListModel* comboModel = new QStringListModel(comboItems, this);
|
||||
ui->ownerPerm->setModel(comboModel);
|
||||
ui->groupPerm->setModel(comboModel);
|
||||
ui->otherPerm->setModel(comboModel);
|
||||
|
||||
// owner
|
||||
ownerPermSel = ACCESS_NO_CHANGE;
|
||||
if(ownerPerm != DIFFERENT_PERMS) { // permissions for owner are the same among all files
|
||||
if(ownerPerm & S_IRUSR) { // can read
|
||||
if(ownerPerm & S_IWUSR) // can write
|
||||
ownerPermSel = ACCESS_READ_WRITE;
|
||||
else
|
||||
ownerPermSel = ACCESS_READ_ONLY;
|
||||
}
|
||||
else {
|
||||
if((ownerPerm & S_IWUSR) == 0) // cannot read or write
|
||||
ownerPermSel = ACCESS_FORBID;
|
||||
}
|
||||
}
|
||||
ui->ownerPerm->setCurrentIndex(ownerPermSel);
|
||||
|
||||
// owner and group
|
||||
groupPermSel = ACCESS_NO_CHANGE;
|
||||
if(groupPerm != DIFFERENT_PERMS) { // permissions for owner are the same among all files
|
||||
if(groupPerm & S_IRGRP) { // can read
|
||||
if(groupPerm & S_IWGRP) // can write
|
||||
groupPermSel = ACCESS_READ_WRITE;
|
||||
else
|
||||
groupPermSel = ACCESS_READ_ONLY;
|
||||
}
|
||||
else {
|
||||
if((groupPerm & S_IWGRP) == 0) // cannot read or write
|
||||
groupPermSel = ACCESS_FORBID;
|
||||
}
|
||||
}
|
||||
ui->groupPerm->setCurrentIndex(groupPermSel);
|
||||
|
||||
// other
|
||||
otherPermSel = ACCESS_NO_CHANGE;
|
||||
if(otherPerm != DIFFERENT_PERMS) { // permissions for owner are the same among all files
|
||||
if(otherPerm & S_IROTH) { // can read
|
||||
if(otherPerm & S_IWOTH) // can write
|
||||
otherPermSel = ACCESS_READ_WRITE;
|
||||
else
|
||||
otherPermSel = ACCESS_READ_ONLY;
|
||||
}
|
||||
else {
|
||||
if((otherPerm & S_IWOTH) == 0) // cannot read or write
|
||||
otherPermSel = ACCESS_FORBID;
|
||||
}
|
||||
|
||||
}
|
||||
ui->otherPerm->setCurrentIndex(otherPermSel);
|
||||
|
||||
// set the checkbox to partially checked state
|
||||
// when owner, group, and other have different executable flags set.
|
||||
// some of them have exec, and others do not have.
|
||||
execCheckState = Qt::PartiallyChecked;
|
||||
if(execPerm != DIFFERENT_PERMS) { // if all files have the same executable permission
|
||||
// check if the files are all executable
|
||||
if((mode & (S_IXUSR|S_IXGRP|S_IXOTH)) == (S_IXUSR|S_IXGRP|S_IXOTH)) {
|
||||
// owner, group, and other all have exec permission.
|
||||
ui->executable->setTristate(false);
|
||||
execCheckState = Qt::Checked;
|
||||
}
|
||||
else if((mode & (S_IXUSR|S_IXGRP|S_IXOTH)) == 0) {
|
||||
// owner, group, and other all have no exec permission
|
||||
ui->executable->setTristate(false);
|
||||
execCheckState = Qt::Unchecked;
|
||||
}
|
||||
}
|
||||
ui->executable->setCheckState(execCheckState);
|
||||
}
|
||||
|
||||
void FilePropsDialog::initGeneralPage() {
|
||||
// update UI
|
||||
if(singleType) { // all files are of the same mime-type
|
||||
FmIcon* icon = NULL;
|
||||
// FIXME: handle custom icons for some files
|
||||
// FIXME: display special property pages for special files or
|
||||
// some specified mime-types.
|
||||
if(singleFile) { // only one file is selected.
|
||||
icon = fm_file_info_get_icon(fileInfo);
|
||||
}
|
||||
if(mimeType) {
|
||||
if(!icon) // get an icon from mime type if needed
|
||||
icon = fm_mime_type_get_icon(mimeType);
|
||||
ui->fileType->setText(QString::fromUtf8(fm_mime_type_get_desc(mimeType)));
|
||||
ui->mimeType->setText(QString::fromUtf8(fm_mime_type_get_type(mimeType)));
|
||||
}
|
||||
if(icon) {
|
||||
ui->iconButton->setIcon(IconTheme::icon(icon));
|
||||
}
|
||||
|
||||
if(singleFile && fm_file_info_is_symlink(fileInfo)) {
|
||||
ui->target->setText(QString::fromUtf8(fm_file_info_get_target(fileInfo)));
|
||||
}
|
||||
else {
|
||||
ui->target->hide();
|
||||
ui->targetLabel->hide();
|
||||
}
|
||||
} // end if(singleType)
|
||||
else { // not singleType, multiple files are selected at the same time
|
||||
ui->fileType->setText(tr("Files of different types"));
|
||||
ui->target->hide();
|
||||
ui->targetLabel->hide();
|
||||
}
|
||||
|
||||
// FIXME: check if all files has the same parent dir, mtime, or atime
|
||||
if(singleFile) { // only one file is selected
|
||||
FmPath* parent_path = fm_path_get_parent(fm_file_info_get_path(fileInfo));
|
||||
char* parent_str = parent_path ? fm_path_display_name(parent_path, true) : NULL;
|
||||
|
||||
ui->fileName->setText(QString::fromUtf8(fm_file_info_get_disp_name(fileInfo)));
|
||||
if(parent_str) {
|
||||
ui->location->setText(QString::fromUtf8(parent_str));
|
||||
g_free(parent_str);
|
||||
}
|
||||
else
|
||||
ui->location->clear();
|
||||
|
||||
ui->lastModified->setText(QString::fromUtf8(fm_file_info_get_disp_mtime(fileInfo)));
|
||||
|
||||
// FIXME: need to encapsulate this in an libfm API.
|
||||
time_t atime;
|
||||
struct tm tm;
|
||||
atime = fm_file_info_get_atime(fileInfo);
|
||||
localtime_r(&atime, &tm);
|
||||
char buf[128];
|
||||
strftime(buf, sizeof(buf), "%x %R", &tm);
|
||||
ui->lastAccessed->setText(QString::fromUtf8(buf));
|
||||
}
|
||||
else {
|
||||
ui->fileName->setText(tr("Multiple Files"));
|
||||
ui->fileName->setEnabled(false);
|
||||
}
|
||||
|
||||
initApplications(); // init applications combo box
|
||||
|
||||
// calculate total file sizes
|
||||
fileSizeTimer = new QTimer(this);
|
||||
connect(fileSizeTimer, &QTimer::timeout, this, &FilePropsDialog::onFileSizeTimerTimeout);
|
||||
fileSizeTimer->start(600);
|
||||
g_signal_connect(deepCountJob, "finished", G_CALLBACK(onDeepCountJobFinished), this);
|
||||
fm_job_run_async(FM_JOB(deepCountJob));
|
||||
}
|
||||
|
||||
/*static */ void FilePropsDialog::onDeepCountJobFinished(FmDeepCountJob* job, FilePropsDialog* pThis) {
|
||||
|
||||
pThis->onFileSizeTimerTimeout(); // update file size display
|
||||
|
||||
// free the job
|
||||
g_object_unref(pThis->deepCountJob);
|
||||
pThis->deepCountJob = NULL;
|
||||
|
||||
// stop the timer
|
||||
if(pThis->fileSizeTimer) {
|
||||
pThis->fileSizeTimer->stop();
|
||||
delete pThis->fileSizeTimer;
|
||||
pThis->fileSizeTimer = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void FilePropsDialog::onFileSizeTimerTimeout() {
|
||||
if(deepCountJob && !fm_job_is_cancelled(FM_JOB(deepCountJob))) {
|
||||
char size_str[128];
|
||||
fm_file_size_to_str(size_str, sizeof(size_str), deepCountJob->total_size,
|
||||
fm_config->si_unit);
|
||||
// FIXME:
|
||||
// OMG! It's really unbelievable that Qt developers only implement
|
||||
// QObject::tr(... int n). GNU gettext developers are smarter and
|
||||
// they use unsigned long instead of int.
|
||||
// We cannot use Qt here to handle plural forms. So sad. :-(
|
||||
QString str = QString::fromUtf8(size_str) %
|
||||
QString(" (%1 B)").arg(deepCountJob->total_size);
|
||||
// tr(" (%n) byte(s)", "", deepCountJob->total_size);
|
||||
ui->fileSize->setText(str);
|
||||
|
||||
fm_file_size_to_str(size_str, sizeof(size_str), deepCountJob->total_ondisk_size,
|
||||
fm_config->si_unit);
|
||||
str = QString::fromUtf8(size_str) %
|
||||
QString(" (%1 B)").arg(deepCountJob->total_ondisk_size);
|
||||
// tr(" (%n) byte(s)", "", deepCountJob->total_ondisk_size);
|
||||
ui->onDiskSize->setText(str);
|
||||
}
|
||||
}
|
||||
|
||||
void FilePropsDialog::accept() {
|
||||
|
||||
// applications
|
||||
if(mimeType && ui->openWith->isChanged()) {
|
||||
GAppInfo* currentApp = ui->openWith->selectedApp();
|
||||
g_app_info_set_as_default_for_type(currentApp, fm_mime_type_get_type(mimeType), NULL);
|
||||
}
|
||||
|
||||
// check if chown or chmod is needed
|
||||
guint32 newUid = uidFromName(ui->owner->text());
|
||||
guint32 newGid = gidFromName(ui->ownerGroup->text());
|
||||
bool needChown = (newUid != -1 && newUid != uid) || (newGid != -1 && newGid != gid);
|
||||
|
||||
int newOwnerPermSel = ui->ownerPerm->currentIndex();
|
||||
int newGroupPermSel = ui->groupPerm->currentIndex();
|
||||
int newOtherPermSel = ui->otherPerm->currentIndex();
|
||||
Qt::CheckState newExecCheckState = ui->executable->checkState();
|
||||
bool needChmod = ((newOwnerPermSel != ownerPermSel) ||
|
||||
(newGroupPermSel != groupPermSel) ||
|
||||
(newOtherPermSel != otherPermSel) ||
|
||||
(newExecCheckState != execCheckState));
|
||||
|
||||
if(needChmod || needChown) {
|
||||
FmPathList* paths = fm_path_list_new_from_file_info_list(fileInfos_);
|
||||
FileOperation* op = new FileOperation(FileOperation::ChangeAttr, paths);
|
||||
fm_path_list_unref(paths);
|
||||
if(needChown) {
|
||||
// don't do chown if new uid/gid and the original ones are actually the same.
|
||||
if(newUid == uid)
|
||||
newUid = -1;
|
||||
if(newGid == gid)
|
||||
newGid = -1;
|
||||
op->setChown(newUid, newGid);
|
||||
}
|
||||
if(needChmod) {
|
||||
mode_t newMode = 0;
|
||||
mode_t newModeMask = 0;
|
||||
// FIXME: we need to make sure that folders with "r" permission also have "x"
|
||||
// at the same time. Otherwise, it's not able to browse the folder later.
|
||||
if(newOwnerPermSel != ownerPermSel && newOwnerPermSel != ACCESS_NO_CHANGE) {
|
||||
// owner permission changed
|
||||
newModeMask |= (S_IRUSR|S_IWUSR); // affect user bits
|
||||
if(newOwnerPermSel == ACCESS_READ_ONLY)
|
||||
newMode |= S_IRUSR;
|
||||
else if(newOwnerPermSel == ACCESS_READ_WRITE)
|
||||
newMode |= (S_IRUSR|S_IWUSR);
|
||||
}
|
||||
if(newGroupPermSel != groupPermSel && newGroupPermSel != ACCESS_NO_CHANGE) {
|
||||
qDebug("newGroupPermSel: %d", newGroupPermSel);
|
||||
// group permission changed
|
||||
newModeMask |= (S_IRGRP|S_IWGRP); // affect group bits
|
||||
if(newGroupPermSel == ACCESS_READ_ONLY)
|
||||
newMode |= S_IRGRP;
|
||||
else if(newGroupPermSel == ACCESS_READ_WRITE)
|
||||
newMode |= (S_IRGRP|S_IWGRP);
|
||||
}
|
||||
if(newOtherPermSel != otherPermSel && newOtherPermSel != ACCESS_NO_CHANGE) {
|
||||
// other permission changed
|
||||
newModeMask |= (S_IROTH|S_IWOTH); // affect other bits
|
||||
if(newOtherPermSel == ACCESS_READ_ONLY)
|
||||
newMode |= S_IROTH;
|
||||
else if(newOtherPermSel == ACCESS_READ_WRITE)
|
||||
newMode |= (S_IROTH|S_IWOTH);
|
||||
}
|
||||
if(newExecCheckState != execCheckState && newExecCheckState != Qt::PartiallyChecked) {
|
||||
// executable state changed
|
||||
newModeMask |= (S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
if(newExecCheckState == Qt::Checked)
|
||||
newMode |= (S_IXUSR|S_IXGRP|S_IXOTH);
|
||||
}
|
||||
op->setChmod(newMode, newModeMask);
|
||||
|
||||
if(hasDir) { // if there are some dirs in our selected files
|
||||
QMessageBox::StandardButton r = QMessageBox::question(this,
|
||||
tr("Apply changes"),
|
||||
tr("Do you want to recursively apply these changes to all files and sub-folders?"),
|
||||
QMessageBox::Yes|QMessageBox::No);
|
||||
if(r == QMessageBox::Yes)
|
||||
op->setRecursiveChattr(true);
|
||||
}
|
||||
}
|
||||
op->setAutoDestroy(true);
|
||||
op->run();
|
||||
}
|
||||
|
||||
// Renaming
|
||||
if(singleFile) {
|
||||
QString new_name = ui->fileName->text();
|
||||
if(QString::fromUtf8(fm_file_info_get_disp_name(fileInfo)) != new_name) {
|
||||
FmPath* path = fm_file_info_get_path(fileInfo);
|
||||
GFile* gf = fm_path_to_gfile(path);
|
||||
GFile* parent_gf = g_file_get_parent(gf);
|
||||
GFile* dest = g_file_get_child(G_FILE(parent_gf), new_name.toLocal8Bit().data());
|
||||
g_object_unref(parent_gf);
|
||||
GError* err = NULL;
|
||||
if(!g_file_move(gf, dest,
|
||||
GFileCopyFlags(G_FILE_COPY_ALL_METADATA |
|
||||
G_FILE_COPY_NO_FALLBACK_FOR_MOVE |
|
||||
G_FILE_COPY_NOFOLLOW_SYMLINKS),
|
||||
NULL, NULL, NULL, &err)) {
|
||||
QMessageBox::critical(this, QObject::tr("Error"), err->message);
|
||||
g_error_free(err);
|
||||
}
|
||||
g_object_unref(dest);
|
||||
g_object_unref(gf);
|
||||
}
|
||||
}
|
||||
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void FilePropsDialog::initOwner() {
|
||||
if(allNative) {
|
||||
if(uid != DIFFERENT_UIDS)
|
||||
ui->owner->setText(uidToName(uid));
|
||||
if(gid != DIFFERENT_GIDS)
|
||||
ui->ownerGroup->setText(gidToName(gid));
|
||||
|
||||
if(geteuid() != 0) { // on local filesystems, only root can do chown.
|
||||
ui->owner->setEnabled(false);
|
||||
ui->ownerGroup->setEnabled(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} // namespace Fm
|
97
src/filepropsdialog.h
Normal file
97
src/filepropsdialog.h
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (C) 2012 - 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILEPROPSDIALOG_H
|
||||
#define FM_FILEPROPSDIALOG_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QDialog>
|
||||
#include <QTimer>
|
||||
#include <libfm/fm.h>
|
||||
|
||||
namespace Ui {
|
||||
class FilePropsDialog;
|
||||
};
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API FilePropsDialog : public QDialog {
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit FilePropsDialog(FmFileInfoList* files, QWidget* parent = 0, Qt::WindowFlags f = 0);
|
||||
virtual ~FilePropsDialog();
|
||||
|
||||
virtual void accept();
|
||||
|
||||
static FilePropsDialog* showForFile(FmFileInfo* file, QWidget* parent = 0) {
|
||||
FmFileInfoList* files = fm_file_info_list_new();
|
||||
fm_file_info_list_push_tail(files, file);
|
||||
FilePropsDialog* dlg = showForFiles(files, parent);
|
||||
fm_file_info_list_unref(files);
|
||||
return dlg;
|
||||
}
|
||||
|
||||
static FilePropsDialog* showForFiles(FmFileInfoList* files, QWidget* parent = 0) {
|
||||
FilePropsDialog* dlg = new FilePropsDialog(files, parent);
|
||||
dlg->show();
|
||||
return dlg;
|
||||
}
|
||||
|
||||
private:
|
||||
void initGeneralPage();
|
||||
void initApplications();
|
||||
void initPermissionsPage();
|
||||
void initOwner();
|
||||
|
||||
static void onDeepCountJobFinished(FmDeepCountJob* job, FilePropsDialog* pThis);
|
||||
|
||||
private Q_SLOTS:
|
||||
void onFileSizeTimerTimeout();
|
||||
|
||||
private:
|
||||
Ui::FilePropsDialog* ui;
|
||||
FmFileInfoList* fileInfos_; // list of all file infos
|
||||
FmFileInfo* fileInfo; // file info of the first file in the list
|
||||
bool singleType; // all files are of the same type?
|
||||
bool singleFile; // only one file is selected?
|
||||
bool hasDir; // is there any dir in the files?
|
||||
bool allNative; // all files are on native UNIX filesystems (not virtual or remote)
|
||||
|
||||
FmMimeType* mimeType; // mime type of the files
|
||||
|
||||
gint32 uid; // owner uid of the files, -1 means all files do not have the same uid
|
||||
gint32 gid; // owner gid of the files, -1 means all files do not have the same uid
|
||||
mode_t ownerPerm; // read permission of the files, -1 means not all files have the same value
|
||||
int ownerPermSel;
|
||||
mode_t groupPerm; // read permission of the files, -1 means not all files have the same value
|
||||
int groupPermSel;
|
||||
mode_t otherPerm; // read permission of the files, -1 means not all files have the same value
|
||||
int otherPermSel;
|
||||
mode_t execPerm; // exec permission of the files
|
||||
Qt::CheckState execCheckState;
|
||||
|
||||
FmDeepCountJob* deepCountJob; // job used to count total size
|
||||
QTimer* fileSizeTimer;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILEPROPSDIALOG_H
|
568
src/filesearch.ui
Normal file
568
src/filesearch.ui
Normal file
@ -0,0 +1,568 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>SearchDialog</class>
|
||||
<widget class="QDialog" name="SearchDialog">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>512</width>
|
||||
<height>420</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Search Files</string>
|
||||
</property>
|
||||
<property name="windowIcon">
|
||||
<iconset theme="system-search">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTabWidget" name="tabWidget">
|
||||
<property name="currentIndex">
|
||||
<number>0</number>
|
||||
</property>
|
||||
<widget class="QWidget" name="tab">
|
||||
<attribute name="title">
|
||||
<string>Name/Location</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2" stretch="0,1">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox">
|
||||
<property name="title">
|
||||
<string>File Name Patterns:</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_3">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="namePatterns">
|
||||
<property name="text">
|
||||
<string>*</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="nameCaseInsensitive">
|
||||
<property name="text">
|
||||
<string>Case insensitive</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="nameRegExp">
|
||||
<property name="text">
|
||||
<string>Use regular expression</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_2">
|
||||
<property name="title">
|
||||
<string>Places to Search:</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_5">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="horizontalLayout">
|
||||
<item>
|
||||
<widget class="QListWidget" name="listView"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QPushButton" name="addPath">
|
||||
<property name="text">
|
||||
<string>&Add</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="list-add">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="removePath">
|
||||
<property name="text">
|
||||
<string>&Remove</string>
|
||||
</property>
|
||||
<property name="icon">
|
||||
<iconset theme="list-remove">
|
||||
<normaloff/>
|
||||
</iconset>
|
||||
</property>
|
||||
</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>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="recursiveSearch">
|
||||
<property name="text">
|
||||
<string>Search in sub directories</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchHidden">
|
||||
<property name="text">
|
||||
<string>Search for hidden files</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_2">
|
||||
<attribute name="title">
|
||||
<string>File Type</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_3">
|
||||
<property name="title">
|
||||
<string>Only search for files of following types:</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_6">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchTextFiles">
|
||||
<property name="text">
|
||||
<string>Text files</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchImages">
|
||||
<property name="text">
|
||||
<string>Image files</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchAudio">
|
||||
<property name="text">
|
||||
<string>Audio files</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchVideo">
|
||||
<property name="text">
|
||||
<string>Video files</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchDocuments">
|
||||
<property name="text">
|
||||
<string>Documents</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="searchFolders">
|
||||
<property name="text">
|
||||
<string>Folders</string>
|
||||
</property>
|
||||
</widget>
|
||||
</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>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_3">
|
||||
<attribute name="title">
|
||||
<string>Content</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_9">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_4">
|
||||
<property name="title">
|
||||
<string>File contains:</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="contentPattern"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="contentCaseInsensitive">
|
||||
<property name="text">
|
||||
<string>Case insensiti&ve</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="contentRegExp">
|
||||
<property name="text">
|
||||
<string>&Use regular expression</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>186</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<widget class="QWidget" name="tab_4">
|
||||
<attribute name="title">
|
||||
<string>Properties</string>
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_10">
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_5">
|
||||
<property name="title">
|
||||
<string>File Size:</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout">
|
||||
<item row="0" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout_2">
|
||||
<item row="1" column="0">
|
||||
<widget class="QCheckBox" name="smallerThan">
|
||||
<property name="text">
|
||||
<string>Smaller than:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="2">
|
||||
<widget class="QSpinBox" name="maxSize">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="2">
|
||||
<widget class="QSpinBox" name="minSize">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="0">
|
||||
<widget class="QCheckBox" name="largerThan">
|
||||
<property name="text">
|
||||
<string>Larger than:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="0" column="3">
|
||||
<widget class="QComboBox" name="minSizeUnit">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Bytes</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>KiB</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>MiB</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>GiB</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="1" column="3">
|
||||
<widget class="QComboBox" name="maxSizeUnit">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="currentIndex">
|
||||
<number>2</number>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>Bytes</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>KiB</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>MiB</string>
|
||||
</property>
|
||||
</item>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>GiB</string>
|
||||
</property>
|
||||
</item>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QGroupBox" name="groupBox_6">
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="title">
|
||||
<string>Last Modified Time:</string>
|
||||
</property>
|
||||
<layout class="QFormLayout" name="formLayout_2">
|
||||
<item row="1" column="0">
|
||||
<layout class="QGridLayout" name="gridLayout">
|
||||
<item row="2" column="0">
|
||||
<widget class="QCheckBox" name="earlierThan">
|
||||
<property name="text">
|
||||
<string>Earlier than:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="0">
|
||||
<widget class="QCheckBox" name="laterThan">
|
||||
<property name="text">
|
||||
<string>Later than:</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="3" column="1">
|
||||
<widget class="QDateEdit" name="minTime">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="calendarPopup">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item row="2" column="1">
|
||||
<widget class="QDateEdit" name="maxTime">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="calendarPopup">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_4">
|
||||
<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::Cancel|QDialogButtonBox::Ok</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>SearchDialog</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>SearchDialog</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>
|
||||
<connection>
|
||||
<sender>largerThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>minSizeUnit</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>93</x>
|
||||
<y>84</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>403</x>
|
||||
<y>88</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>smallerThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>maxSize</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>96</x>
|
||||
<y>119</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>241</x>
|
||||
<y>123</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>largerThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>minSize</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>93</x>
|
||||
<y>84</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>241</x>
|
||||
<y>88</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>smallerThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>maxSizeUnit</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>96</x>
|
||||
<y>119</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>403</x>
|
||||
<y>123</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>laterThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>minTime</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>88</x>
|
||||
<y>223</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>319</x>
|
||||
<y>226</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>earlierThan</sender>
|
||||
<signal>toggled(bool)</signal>
|
||||
<receiver>maxTime</receiver>
|
||||
<slot>setEnabled(bool)</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>93</x>
|
||||
<y>190</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>319</x>
|
||||
<y>193</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
145
src/filesearchdialog.cpp
Normal file
145
src/filesearchdialog.cpp
Normal file
@ -0,0 +1,145 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 "filesearchdialog.h"
|
||||
#include <QMessageBox>
|
||||
#include "fm-search.h"
|
||||
#include "ui_filesearch.h"
|
||||
#include <limits>
|
||||
#include <QFileDialog>
|
||||
#include <utility>
|
||||
|
||||
namespace Fm {
|
||||
|
||||
FileSearchDialog::FileSearchDialog(QStringList paths, QWidget* parent, Qt::WindowFlags f):
|
||||
QDialog(parent, f),
|
||||
ui(new Ui::SearchDialog()) {
|
||||
ui->setupUi(this);
|
||||
ui->minSize->setMaximum(std::numeric_limits<int>().max());
|
||||
ui->maxSize->setMaximum(std::numeric_limits<int>().max());
|
||||
Q_FOREACH(const QString& path, paths) {
|
||||
ui->listView->addItem(path);
|
||||
}
|
||||
|
||||
ui->maxTime->setDate(QDate::currentDate());
|
||||
ui->minTime->setDate(QDate::currentDate());
|
||||
|
||||
connect(ui->addPath, &QPushButton::clicked, this, &FileSearchDialog::onAddPath);
|
||||
connect(ui->removePath, &QPushButton::clicked, this, &FileSearchDialog::onRemovePath);
|
||||
|
||||
ui->namePatterns->setFocus();
|
||||
}
|
||||
|
||||
FileSearchDialog::~FileSearchDialog() {
|
||||
delete ui;
|
||||
}
|
||||
|
||||
void FileSearchDialog::accept() {
|
||||
// build the search:/// uri
|
||||
int n = ui->listView->count();
|
||||
if(n > 0) {
|
||||
FmSearch* search = fm_search_new();
|
||||
for(int i = 0; i < n; ++i) { // add directories
|
||||
QListWidgetItem* item = ui->listView->item(i);
|
||||
fm_search_add_dir(search, item->text().toLocal8Bit().constData());
|
||||
}
|
||||
|
||||
fm_search_set_recursive(search, ui->recursiveSearch->isChecked());
|
||||
fm_search_set_show_hidden(search, ui->searchHidden->isChecked());
|
||||
fm_search_set_name_patterns(search, ui->namePatterns->text().toUtf8().constData());
|
||||
fm_search_set_name_ci(search, ui->nameCaseInsensitive->isChecked());
|
||||
fm_search_set_name_regex(search, ui->nameRegExp->isChecked());
|
||||
|
||||
fm_search_set_content_pattern(search, ui->contentPattern->text().toUtf8().constData());
|
||||
fm_search_set_content_ci(search, ui->contentCaseInsensitive->isChecked());
|
||||
fm_search_set_content_regex(search, ui->contentRegExp->isChecked());
|
||||
|
||||
// search for the files of specific mime-types
|
||||
if(ui->searchTextFiles->isChecked())
|
||||
fm_search_add_mime_type(search, "text/plain");
|
||||
if(ui->searchImages->isChecked())
|
||||
fm_search_add_mime_type(search, "image/*");
|
||||
if(ui->searchAudio->isChecked())
|
||||
fm_search_add_mime_type(search, "audio/*");
|
||||
if(ui->searchVideo->isChecked())
|
||||
fm_search_add_mime_type(search, "video/*");
|
||||
if(ui->searchFolders->isChecked())
|
||||
fm_search_add_mime_type(search, "inode/directory");
|
||||
if(ui->searchDocuments->isChecked()) {
|
||||
const char* doc_types[] = {
|
||||
"application/pdf",
|
||||
/* "text/html;" */
|
||||
"application/vnd.oasis.opendocument.*",
|
||||
"application/vnd.openxmlformats-officedocument.*",
|
||||
"application/msword;application/vnd.ms-word",
|
||||
"application/msexcel;application/vnd.ms-excel"
|
||||
};
|
||||
for(unsigned int i = 0; i < sizeof(doc_types)/sizeof(char*); ++i)
|
||||
fm_search_add_mime_type(search, doc_types[i]);
|
||||
}
|
||||
|
||||
// search based on file size
|
||||
const unsigned int unit_bytes[] = {1, (1024), (1024*1024), (1024*1024*1024)};
|
||||
if(ui->largerThan->isChecked()) {
|
||||
guint64 size = ui->minSize->value() * unit_bytes[ui->minSizeUnit->currentIndex()];
|
||||
fm_search_set_min_size(search, size);
|
||||
}
|
||||
|
||||
if(ui->smallerThan->isChecked()) {
|
||||
guint64 size = ui->maxSize->value() * unit_bytes[ui->maxSizeUnit->currentIndex()];
|
||||
fm_search_set_max_size(search, size);
|
||||
}
|
||||
|
||||
// search based on file mtime (we only support date in YYYY-MM-DD format)
|
||||
if(ui->earlierThan->isChecked()) {
|
||||
fm_search_set_max_mtime(search, ui->maxTime->date().toString(QStringLiteral("yyyy-MM-dd")).toUtf8().constData());
|
||||
}
|
||||
if(ui->laterThan->isChecked()) {
|
||||
fm_search_set_min_mtime(search, ui->minTime->date().toString(QStringLiteral("yyyy-MM-dd")).toUtf8().constData());
|
||||
}
|
||||
|
||||
searchUri_ = std::move(Path::wrapPtr(fm_search_dup_path(search)));
|
||||
|
||||
fm_search_free(search);
|
||||
}
|
||||
else {
|
||||
QMessageBox::critical(this, tr("Error"), tr("You should add at least one directory to search."));
|
||||
return;
|
||||
}
|
||||
QDialog::accept();
|
||||
}
|
||||
|
||||
void FileSearchDialog::onAddPath() {
|
||||
QString dir = QFileDialog::getExistingDirectory(this, tr("Select a folder"));
|
||||
if(dir.isEmpty())
|
||||
return;
|
||||
// avoid adding duplicated items
|
||||
if(ui->listView->findItems(dir, Qt::MatchFixedString|Qt::MatchCaseSensitive).isEmpty()) {
|
||||
ui->listView->addItem(dir);
|
||||
}
|
||||
}
|
||||
|
||||
void FileSearchDialog::onRemovePath() {
|
||||
// remove selected items
|
||||
Q_FOREACH(QListWidgetItem* item, ui->listView->selectedItems()) {
|
||||
delete item;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
56
src/filesearchdialog.h
Normal file
56
src/filesearchdialog.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Copyright (C) 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
*
|
||||
* 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 FM_FILESEARCHDIALOG_H
|
||||
#define FM_FILESEARCHDIALOG_H
|
||||
|
||||
#include "libfmqtglobals.h"
|
||||
#include <QDialog>
|
||||
#include "path.h"
|
||||
|
||||
namespace Ui {
|
||||
class SearchDialog;
|
||||
}
|
||||
|
||||
namespace Fm {
|
||||
|
||||
class LIBFM_QT_API FileSearchDialog : public QDialog
|
||||
{
|
||||
public:
|
||||
FileSearchDialog(QStringList paths = QStringList(), QWidget * parent = 0, Qt::WindowFlags f = 0);
|
||||
~FileSearchDialog();
|
||||
|
||||
Path searchUri() const {
|
||||
return searchUri_;
|
||||
}
|
||||
|
||||
virtual void accept();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onAddPath();
|
||||
void onRemovePath();
|
||||
|
||||
private:
|
||||
Ui::SearchDialog* ui;
|
||||
Path searchUri_;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // FM_FILESEARCHDIALOG_H
|
317
src/fm-search.c
Normal file
317
src/fm-search.c
Normal file
@ -0,0 +1,317 @@
|
||||
/*
|
||||
* fm-search-uri.c
|
||||
*
|
||||
* Copyright 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
* Copyright 2012-2014 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
*
|
||||
* 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 "fm-search.h"
|
||||
#include <string.h>
|
||||
|
||||
struct _FmSearch
|
||||
{
|
||||
gboolean recursive;
|
||||
gboolean show_hidden;
|
||||
char* name_patterns;
|
||||
gboolean name_ci;
|
||||
gboolean name_regex;
|
||||
char* content_pattern;
|
||||
gboolean content_ci;
|
||||
gboolean content_regex;
|
||||
GList* mime_types;
|
||||
GList* search_path_list;
|
||||
guint64 max_size;
|
||||
guint64 min_size;
|
||||
char* max_mtime;
|
||||
char* min_mtime;
|
||||
};
|
||||
|
||||
FmSearch* fm_search_new (void)
|
||||
{
|
||||
FmSearch* search = (FmSearch*)g_slice_new0(FmSearch);
|
||||
return search;
|
||||
}
|
||||
|
||||
void fm_search_free(FmSearch* search)
|
||||
{
|
||||
g_list_free_full(search->mime_types, (GDestroyNotify)g_free);
|
||||
g_list_free_full(search->search_path_list, (GDestroyNotify)g_free);
|
||||
g_free(search->name_patterns);
|
||||
g_free(search->content_pattern);
|
||||
g_free(search->max_mtime);
|
||||
g_free(search->min_mtime);
|
||||
g_slice_free(FmSearch, search);
|
||||
}
|
||||
|
||||
gboolean fm_search_get_recursive(FmSearch* search)
|
||||
{
|
||||
return search->recursive;
|
||||
}
|
||||
|
||||
void fm_search_set_recursive(FmSearch* search, gboolean recursive)
|
||||
{
|
||||
search->recursive = recursive;
|
||||
}
|
||||
|
||||
gboolean fm_search_get_show_hidden(FmSearch* search)
|
||||
{
|
||||
return search->show_hidden;
|
||||
}
|
||||
|
||||
void fm_search_set_show_hidden(FmSearch* search, gboolean show_hidden)
|
||||
{
|
||||
search->show_hidden = show_hidden;
|
||||
}
|
||||
|
||||
const char* fm_search_get_name_patterns(FmSearch* search)
|
||||
{
|
||||
return search->name_patterns;
|
||||
}
|
||||
|
||||
void fm_search_set_name_patterns(FmSearch* search, const char* name_patterns)
|
||||
{
|
||||
g_free(search->name_patterns);
|
||||
search->name_patterns = g_strdup(name_patterns);
|
||||
}
|
||||
|
||||
gboolean fm_search_get_name_ci(FmSearch* search)
|
||||
{
|
||||
return search->name_ci;
|
||||
}
|
||||
|
||||
void fm_search_set_name_ci(FmSearch* search, gboolean name_ci)
|
||||
{
|
||||
search->name_ci = name_ci;
|
||||
}
|
||||
|
||||
gboolean fm_search_get_name_regex(FmSearch* search)
|
||||
{
|
||||
return search->name_regex;
|
||||
}
|
||||
|
||||
void fm_search_set_name_regex(FmSearch* search, gboolean name_regex)
|
||||
{
|
||||
search->name_regex = name_regex;
|
||||
}
|
||||
|
||||
const char* fm_search_get_content_pattern(FmSearch* search)
|
||||
{
|
||||
return search->content_pattern;
|
||||
}
|
||||
|
||||
void fm_search_set_content_pattern(FmSearch* search, const char* content_pattern)
|
||||
{
|
||||
g_free(search->content_pattern);
|
||||
search->content_pattern = g_strdup(content_pattern);
|
||||
}
|
||||
|
||||
gboolean fm_search_get_content_ci(FmSearch* search)
|
||||
{
|
||||
return search->content_ci;
|
||||
}
|
||||
|
||||
void fm_search_set_content_ci(FmSearch* search, gboolean content_ci)
|
||||
{
|
||||
search->content_ci = content_ci;
|
||||
}
|
||||
|
||||
gboolean fm_search_get_content_regex(FmSearch* search)
|
||||
{
|
||||
return search->content_regex;
|
||||
}
|
||||
|
||||
void fm_search_set_content_regex(FmSearch* search, gboolean content_regex)
|
||||
{
|
||||
search->content_regex = content_regex;
|
||||
}
|
||||
|
||||
void fm_search_add_dir(FmSearch* search, const char* dir)
|
||||
{
|
||||
GList* l = g_list_find_custom(search->search_path_list, dir, (GCompareFunc)strcmp);
|
||||
if(!l)
|
||||
search->search_path_list = g_list_prepend(search->search_path_list, g_strdup(dir));
|
||||
}
|
||||
|
||||
void fm_search_remove_dir(FmSearch* search, const char* dir)
|
||||
{
|
||||
GList* l = g_list_find_custom(search->search_path_list, dir, (GCompareFunc)strcmp);
|
||||
if(G_LIKELY(l))
|
||||
{
|
||||
g_free(l->data);
|
||||
search->search_path_list = g_list_delete_link(search->search_path_list, l);
|
||||
}
|
||||
}
|
||||
|
||||
GList* fm_search_get_dirs(FmSearch* search)
|
||||
{
|
||||
return search->search_path_list;
|
||||
}
|
||||
|
||||
void fm_search_add_mime_type(FmSearch* search, const char* mime_type)
|
||||
{
|
||||
GList* l = g_list_find_custom(search->mime_types, mime_type, (GCompareFunc)strcmp);
|
||||
if(!l)
|
||||
search->mime_types = g_list_prepend(search->mime_types, g_strdup(mime_type));
|
||||
}
|
||||
|
||||
void fm_search_remove_mime_type(FmSearch* search, const char* mime_type)
|
||||
{
|
||||
GList* l = g_list_find_custom(search->mime_types, mime_type, (GCompareFunc)strcmp);
|
||||
if(G_LIKELY(l))
|
||||
{
|
||||
g_free(l->data);
|
||||
search->mime_types = g_list_delete_link(search->mime_types, l);
|
||||
}
|
||||
}
|
||||
|
||||
GList* fm_search_get_mime_types(FmSearch* search)
|
||||
{
|
||||
return search->mime_types;
|
||||
}
|
||||
|
||||
guint64 fm_search_get_max_size(FmSearch* search)
|
||||
{
|
||||
return search->max_size;
|
||||
}
|
||||
|
||||
void fm_search_set_max_size(FmSearch* search, guint64 size)
|
||||
{
|
||||
search->max_size = size;
|
||||
}
|
||||
|
||||
guint64 fm_search_get_min_size(FmSearch* search)
|
||||
{
|
||||
return search->min_size;
|
||||
}
|
||||
|
||||
void fm_search_set_min_size(FmSearch* search, guint64 size)
|
||||
{
|
||||
search->min_size = size;
|
||||
}
|
||||
|
||||
/* format of mtime: YYYY-MM-DD */
|
||||
const char* fm_search_get_max_mtime(FmSearch* search)
|
||||
{
|
||||
return search->max_mtime;
|
||||
}
|
||||
|
||||
void fm_search_set_max_mtime(FmSearch* search, const char* mtime)
|
||||
{
|
||||
g_free(search->max_mtime);
|
||||
search->max_mtime = g_strdup(mtime);
|
||||
}
|
||||
|
||||
/* format of mtime: YYYY-MM-DD */
|
||||
const char* fm_search_get_min_mtime(FmSearch* search)
|
||||
{
|
||||
return search->min_mtime;
|
||||
}
|
||||
|
||||
void fm_search_set_min_mtime(FmSearch* search, const char* mtime)
|
||||
{
|
||||
g_free(search->min_mtime);
|
||||
search->min_mtime = g_strdup(mtime);
|
||||
}
|
||||
|
||||
/* really build the path */
|
||||
FmPath* fm_search_dup_path(FmSearch* search)
|
||||
{
|
||||
FmPath* search_path = NULL;
|
||||
GString* search_str = g_string_sized_new(1024);
|
||||
/* build the search:// URI to perform the search */
|
||||
g_string_append(search_str, "search://");
|
||||
|
||||
if(search->search_path_list) /* we need to have at least one dir path */
|
||||
{
|
||||
char *escaped;
|
||||
/* add paths */
|
||||
GList* l;
|
||||
for(l = search->search_path_list; ; )
|
||||
{
|
||||
char *path_str = (char*)l->data;
|
||||
/* escape possible '?' and ',' */
|
||||
escaped = g_uri_escape_string(path_str, "!$&'()*+:;=/@", TRUE);
|
||||
g_string_append(search_str, escaped);
|
||||
g_free(escaped);
|
||||
|
||||
l = l->next;
|
||||
if(!l) /* no more items */
|
||||
break;
|
||||
g_string_append_c(search_str, ','); /* separator for paths */
|
||||
}
|
||||
|
||||
g_string_append_c(search_str, '?');
|
||||
g_string_append_printf(search_str, "recursive=%c", search->recursive ? '1' : '0');
|
||||
g_string_append_printf(search_str, "&show_hidden=%c", search->show_hidden ? '1' : '0');
|
||||
if(search->name_patterns && *search->name_patterns)
|
||||
{
|
||||
/* escape ampersands in pattern */
|
||||
escaped = g_uri_escape_string(search->name_patterns, ":/?#[]@!$'()*+,;", TRUE);
|
||||
if(search->name_regex)
|
||||
g_string_append_printf(search_str, "&name_regex=%s", escaped);
|
||||
else
|
||||
g_string_append_printf(search_str, "&name=%s", escaped);
|
||||
if(search->name_ci)
|
||||
g_string_append_printf(search_str, "&name_ci=%c", search->name_ci ? '1' : '0');
|
||||
g_free(escaped);
|
||||
}
|
||||
|
||||
if(search->content_pattern && *search->content_pattern)
|
||||
{
|
||||
/* escape ampersands in pattern */
|
||||
escaped = g_uri_escape_string(search->content_pattern, ":/?#[]@!$'()*+,;^<>{}", TRUE);
|
||||
if(search->content_regex)
|
||||
g_string_append_printf(search_str, "&content_regex=%s", escaped);
|
||||
else
|
||||
g_string_append_printf(search_str, "&content=%s", escaped);
|
||||
g_free(escaped);
|
||||
if(search->content_ci)
|
||||
g_string_append_printf(search_str, "&content_ci=%c", search->content_ci ? '1' : '0');
|
||||
}
|
||||
|
||||
/* search for the files of specific mime-types */
|
||||
if(search->mime_types)
|
||||
{
|
||||
GList* l;
|
||||
g_string_append(search_str, "&mime_types=");
|
||||
for(l = search->mime_types; l; l=l->next)
|
||||
{
|
||||
const char* mime_type = (const char*)l->data;
|
||||
g_string_append(search_str, mime_type);
|
||||
if(l->next)
|
||||
g_string_append_c(search_str, ';');
|
||||
}
|
||||
}
|
||||
|
||||
if(search->min_size)
|
||||
g_string_append_printf(search_str, "&min_size=%llu", (unsigned long long)search->min_size);
|
||||
|
||||
if(search->max_size)
|
||||
g_string_append_printf(search_str, "&max_size=%llu", (unsigned long long)search->max_size);
|
||||
|
||||
if(search->min_mtime)
|
||||
g_string_append_printf(search_str, "&min_mtime=%s", search->min_mtime);
|
||||
|
||||
if(search->max_mtime)
|
||||
g_string_append_printf(search_str, "&max_mtime=%s", search->max_mtime);
|
||||
|
||||
search_path = fm_path_new_for_uri(search_str->str);
|
||||
g_string_free(search_str, TRUE);
|
||||
}
|
||||
return search_path;
|
||||
}
|
89
src/fm-search.h
Normal file
89
src/fm-search.h
Normal file
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* fm-search-uri.h
|
||||
*
|
||||
* Copyright 2015 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
|
||||
* Copyright 2012-2014 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
|
||||
*
|
||||
* 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
|
||||
*
|
||||
*/
|
||||
|
||||
/* FmSearch implements a tool used to generate a search:// URI used by libfm to search for files.
|
||||
* This API might become part of libfm in the future.
|
||||
*/
|
||||
|
||||
#ifndef _FM_SEARCH_H_
|
||||
#define _FM_SEARCH_H_
|
||||
|
||||
#include <libfm/fm.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _FmSearch FmSearch;
|
||||
|
||||
FmSearch* fm_search_new(void);
|
||||
void fm_search_free(FmSearch* search);
|
||||
|
||||
FmPath* fm_search_dup_path(FmSearch* search);
|
||||
|
||||
gboolean fm_search_get_recursive(FmSearch* search);
|
||||
void fm_search_set_recursive(FmSearch* search, gboolean recursive);
|
||||
|
||||
gboolean fm_search_get_show_hidden(FmSearch* search);
|
||||
void fm_search_set_show_hidden(FmSearch* search, gboolean show_hidden);
|
||||
|
||||
const char* fm_search_get_name_patterns(FmSearch* search);
|
||||
void fm_search_set_name_patterns(FmSearch* search, const char* name_patterns);
|
||||
|
||||
gboolean fm_search_get_name_ci(FmSearch* search);
|
||||
void fm_search_set_name_ci(FmSearch* search, gboolean name_ci);
|
||||
|
||||
gboolean fm_search_get_name_regex(FmSearch* search);
|
||||
void fm_search_set_name_regex(FmSearch* search, gboolean name_regex);
|
||||
|
||||
const char* fm_search_get_content_pattern(FmSearch* search);
|
||||
void fm_search_set_content_pattern(FmSearch* search, const char* content_pattern);
|
||||
|
||||
gboolean fm_search_get_content_ci(FmSearch* search);
|
||||
void fm_search_set_content_ci(FmSearch* search, gboolean content_ci);
|
||||
|
||||
gboolean fm_search_get_content_regex(FmSearch* search);
|
||||
void fm_search_set_content_regex(FmSearch* search, gboolean content_regex);
|
||||
|
||||
void fm_search_add_dir(FmSearch* search, const char* dir);
|
||||
void fm_search_remove_dir(FmSearch* search, const char* dir);
|
||||
GList* fm_search_get_dirs(FmSearch* search);
|
||||
|
||||
void fm_search_add_mime_type(FmSearch* search, const char* mime_type);
|
||||
void fm_search_remove_mime_type(FmSearch* search, const char* mime_type);
|
||||
GList* fm_search_get_mime_types(FmSearch* search);
|
||||
|
||||
guint64 fm_search_get_max_size(FmSearch* search);
|
||||
void fm_search_set_max_size(FmSearch* search, guint64 size);
|
||||
|
||||
guint64 fm_search_get_min_size(FmSearch* search);
|
||||
void fm_search_set_min_size(FmSearch* search, guint64 size);
|
||||
|
||||
/* format of mtime: YYYY-MM-DD */
|
||||
const char* fm_search_get_max_mtime(FmSearch* search);
|
||||
void fm_search_set_max_mtime(FmSearch* search, const char* mtime);
|
||||
|
||||
/* format of mtime: YYYY-MM-DD */
|
||||
const char* fm_search_get_min_mtime(FmSearch* search);
|
||||
void fm_search_set_min_mtime(FmSearch* search, const char* mtime);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* _FM_SEARCH_H_ */
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user