Merge branch 'master' of git.kde.org:dolphin

This commit is contained in:
arnav dhamija 2017-02-13 22:23:41 +05:30
commit 41253c0c81
84 changed files with 429 additions and 396 deletions

3
.arcconfig Normal file
View file

@ -0,0 +1,3 @@
{
"phabricator.uri" : "https://phabricator.kde.org/"
}

View file

@ -3,13 +3,13 @@ cmake_minimum_required(VERSION 2.8.12)
project(Dolphin)
# KDE Application Version, managed by release script
set (KDE_APPLICATIONS_VERSION_MAJOR "16")
set (KDE_APPLICATIONS_VERSION_MINOR "11")
set (KDE_APPLICATIONS_VERSION_MAJOR "17")
set (KDE_APPLICATIONS_VERSION_MINOR "03")
set (KDE_APPLICATIONS_VERSION_MICRO "70")
set (KDE_APPLICATIONS_VERSION "${KDE_APPLICATIONS_VERSION_MAJOR}.${KDE_APPLICATIONS_VERSION_MINOR}.${KDE_APPLICATIONS_VERSION_MICRO}")
set(QT_MIN_VERSION "5.4.0")
set(KF5_MIN_VERSION "5.21.0")
set(QT_MIN_VERSION "5.5.0")
set(KF5_MIN_VERSION "5.30.0")
set(ECM_MIN_VERSION "1.6.0")
# ECM setup
@ -63,7 +63,6 @@ find_package(KF5 ${KF5_MIN_VERSION} REQUIRED COMPONENTS
IconThemes
Completion
TextWidgets
WindowSystem
Notifications
Crash
)

View file

@ -239,8 +239,8 @@ can be accessed or manipulated in different ways:
<listitem><para>
A file or folder can be opened by clicking it with the &LMB; (or
double-clicking, if <guilabel>Double-click to open files and folders</guilabel>
is enabled in the <link linkend="preferences-dialog-navigation"><quote>Navigation</quote>
section of the settings</link>).
is enabled in the &systemsettings; in the <menuchoice><guimenu>Input Devices</guimenu>
<guimenuitem>Mouse</guimenuitem></menuchoice> module.
</para></listitem>
<listitem><para>
@ -803,7 +803,10 @@ a KIOSlave is launched to provide the search results.</para>
<para>The option from <guilabel>Everywhere</guilabel> with activated Baloo
services searches in all indexed folders, without Baloo this option
starts the search from the user's <replaceable>Home</replaceable> folder.</para>
<!--FIXME 16.12
https://git.reviewboard.kde.org/r/123883/
Add prototype of a "More search tools..." button
-->
<screenshot>
<screeninfo>Search with More Options</screeninfo>
<mediaobject>

View file

@ -1,3 +1,4 @@
include(ECMAddAppIcon)
configure_file(config-baloo.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config-baloo.h)
@ -101,7 +102,7 @@ set(dolphinprivate_LIB_SRCS
views/dolphinviewactionhandler.cpp
views/draganddrophelper.cpp
views/renamedialog.cpp
views/tooltips/filemetadatatooltip.cpp
views/tooltips/dolphinfilemetadatawidget.cpp
views/tooltips/tooltipmanager.cpp
views/versioncontrol/updateitemstatesthread.cpp
views/versioncontrol/versioncontrolobserver.cpp
@ -144,7 +145,6 @@ target_link_libraries(
KF5::KIOFileWidgets
KF5::Completion
KF5::TextWidgets
KF5::WindowSystem
KF5::ConfigCore
KF5::NewStuff
KF5::Parts
@ -268,8 +268,9 @@ if(NOT WIN32)
set(dolphin_SRCS ${dolphin_SRCS} panels/terminal/terminalpanel.cpp)
endif()
# TODO Does anything replace kde4_add_app_icon ?
#kde4_add_app_icon(dolphin_SRCS "${KDE4_ICON_INSTALL_DIR}/oxygen/*/apps/system-file-manager.png")
# Sets the icon on Windows and OSX
file(GLOB ICONS_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/icons/*system-file-manager.png")
ecm_add_app_icon(dolphin_SRCS ICONS ${ICONS_SRCS})
kf5_add_kdeinit_executable(dolphin ${dolphin_SRCS})

View file

@ -159,7 +159,7 @@ void DolphinContextMenu::openTrashContextMenu()
if (uiDelegate.askDeleteConfirmation(QList<QUrl>(), KIO::JobUiDelegate::EmptyTrash, KIO::JobUiDelegate::DefaultConfirmation)) {
KIO::Job* job = KIO::emptyTrash();
KJobWidgets::setWindow(job, m_mainWindow);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
}
}
@ -283,7 +283,7 @@ void DolphinContextMenu::openItemContextMenu()
fileItemActions.setItemListProperties(selectedItemsProps);
addServiceActions(fileItemActions);
addFileItemPluginActions();
addFileItemPluginActions(fileItemActions);
addVersionControlPluginActions();
@ -306,7 +306,7 @@ void DolphinContextMenu::openItemContextMenu()
if (selectedUrl.isValid()) {
PlacesItemModel model;
const QString text = selectedUrl.fileName();
PlacesItem* item = model.createPlacesItem(text, selectedUrl);
PlacesItem* item = model.createPlacesItem(text, selectedUrl, KIO::iconNameForUrl(selectedUrl));
model.appendItemToGroup(item);
model.saveBookmarks();
}
@ -355,7 +355,7 @@ void DolphinContextMenu::openViewportContextMenu()
fileItemActions.setItemListProperties(baseUrlProperties);
addServiceActions(fileItemActions);
addFileItemPluginActions();
addFileItemPluginActions(fileItemActions);
addVersionControlPluginActions();
@ -372,7 +372,8 @@ void DolphinContextMenu::openViewportContextMenu()
if (container->url().isValid()) {
PlacesItemModel model;
PlacesItem* item = model.createPlacesItem(container->placesText(),
container->url());
container->url(),
KIO::iconNameForUrl(container->url()));
model.appendItemToGroup(item);
model.saveBookmarks();
}
@ -483,73 +484,9 @@ void DolphinContextMenu::addServiceActions(KFileItemActions& fileItemActions)
fileItemActions.addServiceActionsTo(this);
}
void DolphinContextMenu::addFileItemPluginActions()
void DolphinContextMenu::addFileItemPluginActions(KFileItemActions& fileItemActions)
{
KFileItemListProperties props;
if (m_selectedItems.isEmpty()) {
props.setItems(KFileItemList() << baseFileItem());
} else {
props = selectedItemsProperties();
}
QString commonMimeType = props.mimeType();
if (commonMimeType.isEmpty()) {
commonMimeType = QStringLiteral("application/octet-stream");
}
const KService::List pluginServices = KMimeTypeTrader::self()->query(commonMimeType, QStringLiteral("KFileItemAction/Plugin"), QStringLiteral("exist Library"));
const KConfig config(QStringLiteral("kservicemenurc"), KConfig::NoGlobals);
const KConfigGroup showGroup = config.group("Show");
QSet<QString> addedPlugins;
foreach (const KService::Ptr& service, pluginServices) {
if (!showGroup.readEntry(service->desktopEntryName(), true)) {
// The plugin has been disabled
continue;
}
KAbstractFileItemActionPlugin* abstractPlugin = service->createInstance<KAbstractFileItemActionPlugin>();
if (abstractPlugin) {
abstractPlugin->setParent(this);
addActions(abstractPlugin->actions(props, m_mainWindow));
addedPlugins << service->desktopEntryName();
}
}
const auto jsonPlugins = KPluginLoader::findPlugins(QStringLiteral("kf5/kfileitemaction"), [=](const KPluginMetaData& metaData) {
if (!metaData.serviceTypes().contains(QStringLiteral("KFileItemAction/Plugin"))) {
return false;
}
auto mimeType = QMimeDatabase().mimeTypeForName(commonMimeType);
foreach (const auto& supportedMimeType, metaData.mimeTypes()) {
if (mimeType.inherits(supportedMimeType)) {
return true;
}
}
return false;
});
foreach (const auto& jsonMetadata, jsonPlugins) {
// The plugin has been disabled
if (!showGroup.readEntry(jsonMetadata.pluginId(), true)) {
continue;
}
// The plugin also has a .desktop file and has already been added.
if (addedPlugins.contains(jsonMetadata.pluginId())) {
continue;
}
KPluginFactory *factory = KPluginLoader(jsonMetadata.fileName()).factory();
KAbstractFileItemActionPlugin* abstractPlugin = factory->create<KAbstractFileItemActionPlugin>();
if (abstractPlugin) {
abstractPlugin->setParent(this);
addActions(abstractPlugin->actions(props, m_mainWindow));
addedPlugins << jsonMetadata.pluginId();
}
}
fileItemActions.addPluginActionsTo(this);
}
void DolphinContextMenu::addVersionControlPluginActions()

View file

@ -126,7 +126,7 @@ private:
/**
* Adds actions that are provided by a KFileItemActionPlugin.
*/
void addFileItemPluginActions();
void addFileItemPluginActions(KFileItemActions& fileItemActions);
/**
* Adds actions that are provided by a KVersionControlPlugin.

View file

@ -38,13 +38,13 @@ public:
DolphinDockTitleBar(QWidget* parent = 0) : QWidget(parent) {}
virtual ~DolphinDockTitleBar() {}
virtual QSize minimumSizeHint() const
QSize minimumSizeHint() const Q_DECL_OVERRIDE
{
const int border = style()->pixelMetric(QStyle::PM_DockWidgetTitleBarButtonMargin);
return QSize(border, border);
}
virtual QSize sizeHint() const
QSize sizeHint() const Q_DECL_OVERRIDE
{
return minimumSizeHint();
}

View file

@ -50,7 +50,6 @@
#include <KActionMenu>
#include <KAuthorized>
#include <KConfig>
#include <kconfigwidgets_version.h>
#include <kdualaction.h>
#include <KJobWidgets>
#include <QLineEdit>
@ -527,7 +526,7 @@ void DolphinMainWindow::toggleSplitView()
void DolphinMainWindow::reloadView()
{
clearStatusBar();
m_activeViewContainer->view()->reload();
m_activeViewContainer->reload();
}
void DolphinMainWindow::stopLoading()
@ -723,7 +722,7 @@ void DolphinMainWindow::handleUrl(const QUrl& url)
} else if (KProtocolManager::supportsListing(url)) {
// stat the URL to see if it is a dir or not
m_lastHandleUrlStatJob = KIO::stat(url, KIO::HideProgressInfo);
if (m_lastHandleUrlStatJob->ui()) {
if (m_lastHandleUrlStatJob->uiDelegate()) {
KJobWidgets::setWindow(m_lastHandleUrlStatJob, this);
}
connect(m_lastHandleUrlStatJob, &KIO::Job::result,
@ -869,10 +868,8 @@ void DolphinMainWindow::updateControlMenu()
helpMenu->addSeparator();
helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::ReportBug)));
helpMenu->addSeparator();
#if KCONFIGWIDGETS_VERSION >= QT_VERSION_CHECK(5, 26, 0)
helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::Donate)));
helpMenu->addSeparator();
#endif
helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::SwitchApplicationLanguage)));
helpMenu->addSeparator();
helpMenu->addAction(ac->action(KStandardAction::name(KStandardAction::AboutApp)));
@ -961,13 +958,17 @@ void DolphinMainWindow::setUrlAsCaption(const QUrl& url)
}
}
QString fileName = url.adjusted(QUrl::StripTrailingSlash).fileName();
if (fileName.isEmpty()) {
fileName = '/';
if (GeneralSettings::showFullPathInTitlebar()) {
const QString path = url.adjusted(QUrl::StripTrailingSlash).path();
caption.append(path);
} else {
QString fileName = url.adjusted(QUrl::StripTrailingSlash).fileName();
if (fileName.isEmpty()) {
fileName = '/';
}
caption.append(fileName);
}
caption.append(fileName);
setWindowTitle(caption);
}
@ -1130,14 +1131,14 @@ void DolphinMainWindow::setupActions()
activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
activateNextTab->setEnabled(false);
connect(activateNextTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activateNextTab);
actionCollection()->setDefaultShortcuts(activateNextTab, QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
actionCollection()->setDefaultShortcuts(activateNextTab, nextTabKeys);
QAction* activatePrevTab = actionCollection()->addAction(QStringLiteral("activate_prev_tab"));
activatePrevTab->setIconText(i18nc("@action:inmenu", "Previous Tab"));
activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
activatePrevTab->setEnabled(false);
connect(activatePrevTab, &QAction::triggered, m_tabWidget, &DolphinTabWidget::activatePrevTab);
actionCollection()->setDefaultShortcuts(activatePrevTab, QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
actionCollection()->setDefaultShortcuts(activatePrevTab, prevTabKeys);
// for context menu
QAction* openInNewTab = actionCollection()->addAction(QStringLiteral("open_in_new_tab"));
@ -1404,6 +1405,7 @@ void DolphinMainWindow::refreshViews()
const bool splitView = GeneralSettings::splitView();
m_tabWidget->currentTabPage()->setSplitViewEnabled(splitView);
updateSplitAction();
setUrlAsCaption(activeViewContainer()->url());
}
emit settingsChanged();

View file

@ -78,6 +78,7 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QVariantL
this, &DolphinPart::slotErrorMessage);
connect(m_view, &DolphinView::directoryLoadingCompleted, this, static_cast<void(DolphinPart::*)()>(&DolphinPart::completed));
connect(m_view, &DolphinView::directoryLoadingCompleted, this, &DolphinPart::updatePasteAction);
connect(m_view, &DolphinView::directoryLoadingProgress, this, &DolphinPart::updateProgress);
connect(m_view, &DolphinView::errorMessage, this, &DolphinPart::slotErrorMessage);
@ -397,7 +398,6 @@ void DolphinPart::slotOpenContextMenu(const QPoint& pos,
KFileItem item(_item);
if (item.isNull()) { // viewport context menu
popupFlags |= KParts::BrowserExtension::ShowNavigationItems | KParts::BrowserExtension::ShowUp;
item = m_view->rootItem();
if (item.isNull())
item = KFileItem(url());

View file

@ -2,7 +2,6 @@
Type=Service
Name=Dolphin View
Name[ar]=منظور دولفين
Name[ast]=Vista de Dolphin
Name[ca]=Vista del Dolphin
Name[ca@valencia]=Vista del Dolphin
Name[cs]=Pohled Dolphin
@ -107,7 +106,6 @@ Exec=dolphin
[Desktop Action compact]
Name=Compact
Name[ar]=متراصّ
Name[ast]=Compautu
Name[ca]=Compacta
Name[ca@valencia]=Compacta
Name[cs]=Kompaktní
@ -124,6 +122,7 @@ Name[hu]=Kompakt
Name[ia]=Compacte
Name[id]=Sederhana
Name[it]=Compatta
Name[ja]=
Name[ko]=
Name[lt]=Kompaktiškas
Name[nb]=Kompakt

View file

@ -29,7 +29,8 @@
DolphinTabBar::DolphinTabBar(QWidget* parent) :
QTabBar(parent),
m_autoActivationIndex(-1)
m_autoActivationIndex(-1),
m_tabToBeClosedOnMiddleMouseButtonRelease(-1)
{
setAcceptDrops(true);
setSelectionBehaviorOnRemove(QTabBar::SelectPreviousTab);
@ -95,12 +96,25 @@ void DolphinTabBar::mousePressEvent(QMouseEvent* event)
const int index = tabAt(event->pos());
if (index >= 0 && event->button() == Qt::MiddleButton) {
m_tabToBeClosedOnMiddleMouseButtonRelease = index;
return;
}
QTabBar::mousePressEvent(event);
}
void DolphinTabBar::mouseReleaseEvent(QMouseEvent *event)
{
const int index = tabAt(event->pos());
if (index >= 0 && index == m_tabToBeClosedOnMiddleMouseButtonRelease
&& event->button() == Qt::MiddleButton) {
// Mouse middle click on a tab closes this tab.
emit tabCloseRequested(index);
return;
}
QTabBar::mousePressEvent(event);
QTabBar::mouseReleaseEvent(event);
}
void DolphinTabBar::mouseDoubleClickEvent(QMouseEvent* event)

View file

@ -40,6 +40,7 @@ protected:
virtual void dragMoveEvent(QDragMoveEvent* event) Q_DECL_OVERRIDE;
virtual void dropEvent(QDropEvent* event) Q_DECL_OVERRIDE;
virtual void mousePressEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mouseReleaseEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
virtual void mouseDoubleClickEvent(QMouseEvent* event) Q_DECL_OVERRIDE;
/**
@ -60,6 +61,7 @@ private:
private:
QTimer* m_autoActivationTimer;
int m_autoActivationIndex;
int m_tabToBeClosedOnMiddleMouseButtonRelease;
};
#endif // DOLPHIN_TAB_BAR_H

View file

@ -32,7 +32,8 @@
DolphinTabWidget::DolphinTabWidget(QWidget* parent) :
QTabWidget(parent),
m_placesSelectorVisible(true)
m_placesSelectorVisible(true),
m_previousTab(-1)
{
connect(this, &DolphinTabWidget::tabCloseRequested,
this, static_cast<void (DolphinTabWidget::*)(int)>(&DolphinTabWidget::closeTab));
@ -304,9 +305,15 @@ void DolphinTabWidget::tabUrlChanged(const QUrl& url)
void DolphinTabWidget::currentTabChanged(int index)
{
DolphinViewContainer* viewContainer = tabPageAt(index)->activeViewContainer();
viewContainer->setActive(true);
emit activeViewChanged(viewContainer);
emit currentUrlChanged(viewContainer->url());
viewContainer->view()->setFocus();
if (tabPageAt(m_previousTab)) {
tabPageAt(m_previousTab)->activeViewContainer()->setActive(false);
}
m_previousTab = index;
}
void DolphinTabWidget::tabInserted(int index)

View file

@ -186,6 +186,8 @@ private:
private:
/** Caches the (negated) places panel visibility */
bool m_placesSelectorVisible;
int m_previousTab;
};
#endif

View file

@ -98,8 +98,6 @@ DolphinViewContainer::DolphinViewContainer(const QUrl& url, QWidget* parent) :
m_urlNavigator, &KUrlNavigator::setLocationUrl);
connect(m_view, &DolphinView::urlChanged,
m_messageWidget, &KMessageWidget::hide);
connect(m_view, &DolphinView::directoryLoadingCompleted,
m_messageWidget, &KMessageWidget::hide);
connect(m_view, &DolphinView::writeStateChanged,
this, &DolphinViewContainer::writeStateChanged);
connect(m_view, &DolphinView::requestItemInfo,
@ -363,11 +361,20 @@ QString DolphinViewContainer::placesText() const
if (text.isEmpty()) {
text = url().host();
}
if (text.isEmpty()) {
text = url().scheme();
}
}
return text;
}
void DolphinViewContainer::reload()
{
view()->reload();
m_messageWidget->hide();
}
void DolphinViewContainer::setUrl(const QUrl& newUrl)
{
if (newUrl != m_urlNavigator->locationUrl()) {

View file

@ -129,6 +129,11 @@ public:
*/
QString placesText() const;
/**
* Reload the view of this container. This will also hide messages in a messagewidget.
*/
void reload();
public slots:
/**
* Sets the current active URL, where all actions are applied. The

View file

@ -24,9 +24,10 @@
QList<QUrl> Dolphin::validateUris(const QStringList& uriList)
{
const QString currentDir = QDir::currentPath();
QList<QUrl> urls;
foreach (const QString& str, uriList) {
const QUrl url = QUrl::fromUserInput(str, QString(), QUrl::AssumeLocalFile);
const QUrl url = QUrl::fromUserInput(str, currentDir, QUrl::AssumeLocalFile);
if (url.isValid()) {
urls.append(url);
} else {

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 566 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 802 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -80,7 +80,7 @@ QString KFileItemListWidgetInformant::roleText(const QByteArray& role,
const KIO::filesize_t size = roleValue.value<KIO::filesize_t>();
text = KFormat().formatByteSize(size);
}
} else if (role == "date") {
} else if (role == "modificationtime" || role == "accesstime") {
const QDateTime dateTime = roleValue.toDateTime();
text = QLocale().toString(dateTime, QLocale::ShortFormat);
} else {

View file

@ -80,6 +80,7 @@ KFileItemModel::KFileItemModel(QObject* parent) :
connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)()>(&KFileItemModelDirLister::clear), this, &KFileItemModel::slotClear);
connect(m_dirLister, &KFileItemModelDirLister::infoMessage, this, &KFileItemModel::infoMessage);
connect(m_dirLister, &KFileItemModelDirLister::errorMessage, this, &KFileItemModel::errorMessage);
connect(m_dirLister, &KFileItemModelDirLister::percent, this, &KFileItemModel::directoryLoadingProgress);
connect(m_dirLister, static_cast<void(KFileItemModelDirLister::*)(const QUrl&, const QUrl&)>(&KFileItemModelDirLister::redirection), this, &KFileItemModel::directoryRedirection);
connect(m_dirLister, &KFileItemModelDirLister::urlIsFileError, this, &KFileItemModel::urlIsFileError);
@ -327,7 +328,8 @@ QList<QPair<int, QVariant> > KFileItemModel::groups() const
switch (typeForRole(sortRole())) {
case NameRole: m_groups = nameRoleGroups(); break;
case SizeRole: m_groups = sizeRoleGroups(); break;
case DateRole: m_groups = dateRoleGroups(); break;
case ModificationTimeRole: m_groups = timeRoleGroups(KFileItem::ModificationTime); break;
case AccessTimeRole: m_groups = timeRoleGroups(KFileItem::AccessTime); break;
case PermissionsRole: m_groups = permissionRoleGroups(); break;
case RatingRole: m_groups = ratingRoleGroups(); break;
default: m_groups = genericStringRoleGroups(sortRole()); break;
@ -416,12 +418,15 @@ int KFileItemModel::index(const QUrl& url) const
foreach (const QUrl& url, indexesForUrl.uniqueKeys()) {
if (indexesForUrl.count(url) > 1) {
qCWarning(DolphinDebug) << "Multiple items found with the URL" << url;
foreach (int index, indexesForUrl.values(url)) {
const ItemData* data = m_itemData.at(index);
qCWarning(DolphinDebug) << "index" << index << ":" << data->item;
auto it = indexesForUrl.find(url);
while (it != indexesForUrl.end() && it.key() == url) {
const ItemData* data = m_itemData.at(it.value());
qCWarning(DolphinDebug) << "index" << it.value() << ":" << data->item;
if (data->parent) {
qCWarning(DolphinDebug) << "parent" << data->parent->item;
}
++it;
}
}
}
@ -590,7 +595,12 @@ int KFileItemModel::expandedParentsCount(int index) const
QSet<QUrl> KFileItemModel::expandedDirectories() const
{
return m_expandedDirs.values().toSet();
QSet<QUrl> result;
const auto dirs = m_expandedDirs;
for (const auto &dir : dirs) {
result.insert(dir);
}
return result;
}
void KFileItemModel::restoreExpandedDirectories(const QSet<QUrl> &urls)
@ -1523,12 +1533,20 @@ QHash<QByteArray, QVariant> KFileItemModel::retrieveData(const KFileItem& item,
data.insert(sharedValue("size"), item.size());
}
if (m_requestRole[DateRole]) {
if (m_requestRole[ModificationTimeRole]) {
// Don't use KFileItem::timeString() as this is too expensive when
// having several thousands of items. Instead the formatting of the
// date-time will be done on-demand by the view when the date will be shown.
const QDateTime dateTime = item.time(KFileItem::ModificationTime);
data.insert(sharedValue("date"), dateTime);
data.insert(sharedValue("modificationtime"), dateTime);
}
if (m_requestRole[AccessTimeRole]) {
// Don't use KFileItem::timeString() as this is too expensive when
// having several thousands of items. Instead the formatting of the
// date-time will be done on-demand by the view when the date will be shown.
const QDateTime dateTime = item.time(KFileItem::AccessTime);
data.insert(sharedValue("accesstime"), dateTime);
}
if (m_requestRole[PermissionsRole]) {
@ -1753,7 +1771,7 @@ int KFileItemModel::sortRoleCompare(const ItemData* a, const ItemData* b, const
break;
}
case DateRole: {
case ModificationTimeRole: {
const QDateTime dateTimeA = itemA.time(KFileItem::ModificationTime);
const QDateTime dateTimeB = itemB.time(KFileItem::ModificationTime);
if (dateTimeA < dateTimeB) {
@ -1933,7 +1951,7 @@ QList<QPair<int, QVariant> > KFileItemModel::sizeRoleGroups() const
return groups;
}
QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
QList<QPair<int, QVariant> > KFileItemModel::timeRoleGroups(KFileItem::FileTimes which) const
{
Q_ASSERT(!m_itemData.isEmpty());
@ -1942,26 +1960,26 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
const QDate currentDate = QDate::currentDate();
QDate previousModifiedDate;
QDate previousFileDate;
QString groupValue;
for (int i = 0; i <= maxIndex; ++i) {
if (isChildItem(i)) {
continue;
}
const QDateTime modifiedTime = m_itemData.at(i)->item.time(KFileItem::ModificationTime);
const QDate modifiedDate = modifiedTime.date();
if (modifiedDate == previousModifiedDate) {
const QDateTime fileTime = m_itemData.at(i)->item.time(which);
const QDate fileDate = fileTime.date();
if (fileDate == previousFileDate) {
// The current item is in the same group as the previous item
continue;
}
previousModifiedDate = modifiedDate;
previousFileDate = fileDate;
const int daysDistance = modifiedDate.daysTo(currentDate);
const int daysDistance = fileDate.daysTo(currentDate);
QString newGroupValue;
if (currentDate.year() == modifiedDate.year() &&
currentDate.month() == modifiedDate.month()) {
if (currentDate.year() == fileDate.year() &&
currentDate.month() == fileDate.month()) {
switch (daysDistance / 7) {
case 0:
@ -1969,7 +1987,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
case 0: newGroupValue = i18nc("@title:group Date", "Today"); break;
case 1: newGroupValue = i18nc("@title:group Date", "Yesterday"); break;
default:
newGroupValue = modifiedTime.toString(
newGroupValue = fileTime.toString(
i18nc("@title:group Date: The week day name: dddd", "dddd"));
newGroupValue = i18nc("Can be used to script translation of \"dddd\""
"with context @title:group Date", "%1", newGroupValue);
@ -1993,18 +2011,18 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
}
} else {
const QDate lastMonthDate = currentDate.addMonths(-1);
if (lastMonthDate.year() == modifiedDate.year() &&
lastMonthDate.month() == modifiedDate.month()) {
if (lastMonthDate.year() == fileDate.year() &&
lastMonthDate.month() == fileDate.month()) {
if (daysDistance == 1) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Yesterday' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Yesterday' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"The week day name: dddd, MMMM is full month name "
"in current locale, and yyyy is full year number",
"dddd (MMMM, yyyy)"));
@ -2012,28 +2030,28 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
"\"dddd (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 2) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'One Week Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'One Week Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 3) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Two Weeks Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Two Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else if (daysDistance <= 7 * 4) {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Three Weeks Ago' (MMMM, yyyy)"));
newGroupValue = i18nc("Can be used to script translation of "
"\"'Three Weeks Ago' (MMMM, yyyy)\" with context @title:group Date",
"%1", newGroupValue);
} else {
newGroupValue = modifiedTime.toString(i18nc("@title:group Date: "
newGroupValue = fileTime.toString(i18nc("@title:group Date: "
"MMMM is full month name in current locale, and yyyy is "
"full year number", "'Earlier on' MMMM, yyyy"));
newGroupValue = i18nc("Can be used to script translation of "
@ -2041,7 +2059,7 @@ QList<QPair<int, QVariant> > KFileItemModel::dateRoleGroups() const
"%1", newGroupValue);
}
} else {
newGroupValue = modifiedTime.toString(i18nc("@title:group "
newGroupValue = fileTime.toString(i18nc("@title:group "
"The month and year: MMMM is full month name in current locale, "
"and yyyy is full year number", "MMMM, yyyy"));
newGroupValue = i18nc("Can be used to script translation of "
@ -2212,11 +2230,13 @@ const KFileItemModel::RoleInfoMap* KFileItemModel::rolesInfoMap(int& count)
{ 0, NoRole, 0, 0, 0, 0, false, false },
{ "text", NameRole, I18N_NOOP2_NOSTRIP("@label", "Name"), 0, 0, false, false },
{ "size", SizeRole, I18N_NOOP2_NOSTRIP("@label", "Size"), 0, 0, false, false },
{ "date", DateRole, I18N_NOOP2_NOSTRIP("@label", "Date"), 0, 0, false, false },
{ "modificationtime", ModificationTimeRole, I18N_NOOP2_NOSTRIP("@label", "Modified"), 0, 0, false, false },
{ "accesstime", AccessTimeRole, I18N_NOOP2_NOSTRIP("@label", "Accessed"), 0, 0, false, false },
{ "type", TypeRole, I18N_NOOP2_NOSTRIP("@label", "Type"), 0, 0, false, false },
{ "rating", RatingRole, I18N_NOOP2_NOSTRIP("@label", "Rating"), 0, 0, true, false },
{ "tags", TagsRole, I18N_NOOP2_NOSTRIP("@label", "Tags"), 0, 0, true, false },
{ "comment", CommentRole, I18N_NOOP2_NOSTRIP("@label", "Comment"), 0, 0, true, false },
{ "title", TitleRole, I18N_NOOP2_NOSTRIP("@label", "Title"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true },
{ "wordCount", WordCountRole, I18N_NOOP2_NOSTRIP("@label", "Word Count"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true },
{ "lineCount", LineCountRole, I18N_NOOP2_NOSTRIP("@label", "Line Count"), I18N_NOOP2_NOSTRIP("@label", "Document"), true, true },
{ "imageSize", ImageSizeRole, I18N_NOOP2_NOSTRIP("@label", "Image Size"), I18N_NOOP2_NOSTRIP("@label", "Image"), true, true },

View file

@ -280,11 +280,11 @@ private slots:
private:
enum RoleType {
// User visible roles:
NoRole, NameRole, SizeRole, DateRole, PermissionsRole, OwnerRole,
NoRole, NameRole, SizeRole, ModificationTimeRole, AccessTimeRole, PermissionsRole, OwnerRole,
GroupRole, TypeRole, DestinationRole, PathRole,
// User visible roles available with Baloo:
CommentRole, TagsRole, RatingRole, ImageSizeRole, OrientationRole,
WordCountRole, LineCountRole, ArtistRole, AlbumRole, DurationRole, TrackRole,
WordCountRole, TitleRole, LineCountRole, ArtistRole, AlbumRole, DurationRole, TrackRole,
OriginUrlRole,
// Non-visible roles:
IsDirRole, IsLinkRole, IsExpandedRole, IsExpandableRole, ExpandedParentsCountRole,
@ -383,7 +383,7 @@ private:
QList<QPair<int, QVariant> > nameRoleGroups() const;
QList<QPair<int, QVariant> > sizeRoleGroups() const;
QList<QPair<int, QVariant> > dateRoleGroups() const;
QList<QPair<int, QVariant> > timeRoleGroups(KFileItem::FileTimes which) const;
QList<QPair<int, QVariant> > permissionRoleGroups() const;
QList<QPair<int, QVariant> > ratingRoleGroups() const;
QList<QPair<int, QVariant> > genericStringRoleGroups(const QByteArray& typeForRole) const;

View file

@ -907,7 +907,7 @@ void KFileItemModelRolesUpdater::startPreviewJob()
KIO::PreviewJob* job = new KIO::PreviewJob(itemSubSet, cacheSize, &m_enabledPlugins);
job->setIgnoreMaximumSize(itemSubSet.first().isLocalFile());
if (job->ui()) {
if (job->uiDelegate()) {
KJobWidgets::setWindow(job, qApp->activeWindow());
}

View file

@ -48,7 +48,7 @@ class KItemListContainerViewport : public QGraphicsView
public:
KItemListContainerViewport(QGraphicsScene* scene, QWidget* parent);
protected:
virtual void wheelEvent(QWheelEvent* event);
void wheelEvent(QWheelEvent* event) Q_DECL_OVERRIDE;
};
KItemListContainerViewport::KItemListContainerViewport(QGraphicsScene* scene, QWidget* parent) :
@ -265,7 +265,7 @@ void KItemListContainer::updateScrollOffsetScrollBar()
if (view->scrollOrientation() == Qt::Vertical) {
smoothScroller = m_verticalSmoothScroller;
scrollOffsetScrollBar = verticalScrollBar();
singleStep = view->itemSize().height();
singleStep = view->itemSizeHint().height();
// We cannot use view->size().height() because this height might
// include the header widget, which is not part of the scrolled area.
pageStep = view->verticalPageStep();

View file

@ -59,7 +59,6 @@ class QTransform;
class DOLPHIN_EXPORT KItemListController : public QObject
{
Q_OBJECT
Q_ENUMS(SelectionBehavior)
Q_PROPERTY(KItemModelBase* model READ model WRITE setModel)
Q_PROPERTY(KItemListView *view READ view WRITE setView)
Q_PROPERTY(SelectionBehavior selectionBehavior READ selectionBehavior WRITE setSelectionBehavior)
@ -72,6 +71,7 @@ public:
SingleSelection,
MultiSelection
};
Q_ENUM(SelectionBehavior)
enum AutoActivationBehavior {
ActivationAndExpansion,

View file

@ -344,6 +344,11 @@ QSizeF KItemListView::itemSize() const
return m_itemSize;
}
QSizeF KItemListView::itemSizeHint() const
{
return m_sizeHintResolver->maxSizeHint();
}
const KItemListStyleOption& KItemListView::styleOption() const
{
return m_styleOption;

View file

@ -154,10 +154,15 @@ public:
/**
* @return The basic size of all items. The size of an item may be larger than
* the basic size (see KItemListView::itemSizeHint() and KItemListView::itemRect()).
* the basic size (see KItemListView::itemRect()).
*/
QSizeF itemSize() const;
/**
* @return The size hint of all items. It is provided by the KItemListSizeHintResolver.
*/
QSizeF itemSizeHint() const;
const KItemListStyleOption& styleOption() const;
virtual void setGeometry(const QRectF& rect) Q_DECL_OVERRIDE;

View file

@ -179,8 +179,8 @@ QList<QByteArray> KItemListWidget::visibleRoles() const
void KItemListWidget::setColumnWidth(const QByteArray& role, qreal width)
{
if (m_columnWidths.value(role) != width) {
const qreal previousWidth = width;
const qreal previousWidth = m_columnWidths.value(role);
if (previousWidth != width) {
m_columnWidths.insert(role, width);
columnWidthChanged(role, width, previousWidth);
update();

View file

@ -852,7 +852,8 @@ void KStandardItemListWidget::hideEvent(QHideEvent* event)
bool KStandardItemListWidget::event(QEvent *event)
{
if (event->type() == QEvent::WindowDeactivate || event->type() == QEvent::WindowActivate) {
if (event->type() == QEvent::WindowDeactivate || event->type() == QEvent::WindowActivate
|| event->type() == QEvent::PaletteChange) {
m_dirtyContent = true;
}

View file

@ -138,6 +138,7 @@ KBalooRolesProvider::KBalooRolesProvider() :
{ "rating", "rating" },
{ "tag", "tags" },
{ "comment", "comment" },
{ "title", "title" },
{ "wordCount", "wordCount" },
{ "lineCount", "lineCount" },
{ "width", "imageSize" },
@ -181,7 +182,7 @@ QString KBalooRolesProvider::orientationFromValue(int value) const
QString KBalooRolesProvider::durationFromValue(int value) const
{
QTime duration;
QTime duration(0, 0, 0);
duration = duration.addSecs(value);
return duration.toString(QStringLiteral("hh:mm:ss"));
}

View file

@ -48,7 +48,7 @@ signals:
void urlIsFileError(const QUrl& url);
protected:
virtual void handleError(KIO::Job* job);
void handleError(KIO::Job* job) Q_DECL_OVERRIDE;
};
#endif

View file

@ -64,7 +64,7 @@ public:
qreal minimumColumnWidth() const;
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE;
signals:
/**
@ -104,13 +104,13 @@ signals:
void sortRoleChanged(const QByteArray& current, const QByteArray& previous);
protected:
virtual void mousePressEvent(QGraphicsSceneMouseEvent* event);
virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent* event);
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent* event);
virtual void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event);
virtual void hoverEnterEvent(QGraphicsSceneHoverEvent* event);
virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent* event);
virtual void hoverMoveEvent(QGraphicsSceneHoverEvent* event);
void mousePressEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE;
void mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) Q_DECL_OVERRIDE;
void hoverEnterEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE;
void hoverLeaveEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE;
void hoverMoveEvent(QGraphicsSceneHoverEvent* event) Q_DECL_OVERRIDE;
private slots:
void slotSortRoleChanged(const QByteArray& current, const QByteArray& previous);

View file

@ -44,15 +44,15 @@ public:
void setRole(const QByteArray& role);
QByteArray role() const;
virtual bool eventFilter(QObject* watched, QEvent* event);
bool eventFilter(QObject* watched, QEvent* event) Q_DECL_OVERRIDE;
signals:
void roleEditingFinished(const QByteArray& role, const QVariant& value);
void roleEditingCanceled(const QByteArray& role, const QVariant& value);
protected:
virtual bool event(QEvent* event);
virtual void keyPressEvent(QKeyEvent* event);
bool event(QEvent* event) Q_DECL_OVERRIDE;
void keyPressEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
private slots:
/**

View file

@ -42,10 +42,10 @@ public:
void setHovered(bool hovered);
virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0) Q_DECL_OVERRIDE;
protected:
virtual void resizeEvent(QGraphicsSceneResizeEvent* event);
void resizeEvent(QGraphicsSceneResizeEvent* event) Q_DECL_OVERRIDE;
private:
void updatePixmap();

View file

@ -25,6 +25,7 @@ KItemListSizeHintResolver::KItemListSizeHintResolver(const KItemListView* itemLi
m_itemListView(itemListView),
m_logicalHeightHintCache(),
m_logicalWidthHint(0.0),
m_logicalHeightHint(0.0),
m_needsResolving(false)
{
}
@ -33,6 +34,12 @@ KItemListSizeHintResolver::~KItemListSizeHintResolver()
{
}
QSizeF KItemListSizeHintResolver::maxSizeHint()
{
updateCache();
return QSizeF(m_logicalWidthHint, m_logicalHeightHint);
}
QSizeF KItemListSizeHintResolver::sizeHint(int index)
{
updateCache();
@ -149,6 +156,12 @@ void KItemListSizeHintResolver::updateCache()
{
if (m_needsResolving) {
m_itemListView->calculateItemSizeHints(m_logicalHeightHintCache, m_logicalWidthHint);
// Set logical height as the max cached height (if the cache is not empty).
if (m_logicalHeightHintCache.isEmpty()) {
m_logicalHeightHint = 0.0;
} else {
m_logicalHeightHint = *std::max_element(m_logicalHeightHintCache.begin(), m_logicalHeightHintCache.end());
}
m_needsResolving = false;
}
}

View file

@ -36,6 +36,7 @@ class DOLPHIN_EXPORT KItemListSizeHintResolver
public:
KItemListSizeHintResolver(const KItemListView* itemListView);
virtual ~KItemListSizeHintResolver();
QSizeF maxSizeHint();
QSizeF sizeHint(int index);
void itemsInserted(const KItemRangeList& itemRanges);
@ -50,6 +51,7 @@ private:
const KItemListView* m_itemListView;
mutable QVector<qreal> m_logicalHeightHintCache;
mutable qreal m_logicalWidthHint;
mutable qreal m_logicalHeightHint;
bool m_needsResolving;
};

View file

@ -83,7 +83,7 @@ public:
void handleWheelEvent(QWheelEvent* event);
protected:
virtual bool eventFilter(QObject* obj, QEvent* event);
bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE;
private slots:
void slotAnimationStateChanged(QAbstractAnimation::State newState,

View file

@ -39,7 +39,7 @@ extern "C" Q_DECL_EXPORT int kdemain(int argc, char **argv)
{
QApplication app(argc, argv);
app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
app.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager")));
app.setWindowIcon(QIcon::fromTheme(QStringLiteral("system-file-manager"), app.windowIcon()));
KCrash::initialize();

View file

@ -93,7 +93,7 @@
<description>
<p>Dolphin is a lightweight file manager. It has been designed with ease of use and simplicity in mind, while still allowing flexibility and customisation. This means that you can do your file management exactly the way you want to do it.</p>
<p xml:lang="ar">دولفين هو مدير ملفات خفيف. صُمِّم دولفين مع أخذ سهولة الاستخدام والبساطة بعين الاعتبار، مع السماح بالمرونة والتخصيص. يعني هذا أنه يمكنك إدارة ملفاتك كما تريد تمامًا.</p>
<p xml:lang="ast">Dolphin ye un xestor de ficheros llixeru. Diseñóse cola facilidá d'usu y cenciellez na miente entrín entá permite la flexibilidá y personalización. Esto quier dicir que pues facer la to xestión de ficheros exautamente como tu quies facela.</p>
<p xml:lang="ast">Dolphin ye un xestor de ficheros llixeru. Diseñóse cola facilidá y cenciellez d'usu en mente, el mesmu tiempu qu'entá permite la flixibilidá y personalización. Quier dicir que pues facer la to xestión de ficheros exautamente como quieras facelo.</p>
<p xml:lang="bs">Dolphinje lagan file manager. On je bio dizajniran sa lakoćom korišćenja i jednostavnosti u vidu, još omogućavajući fleksibilnost i prilagođavanje. To znači da možete da radite svoje upravljanje datotekama onako kako želite da to uradi.</p>
<p xml:lang="ca">El Dolphin és un gestor de fitxers lleuger. S'ha dissenyat pensant a facilitar el seu ús i que sigui simple, permetent la flexibilitat i la personalització. Això vol dir que podeu fer la gestió dels vostres fitxers de la manera exacta com ho vulgueu fer.</p>
<p xml:lang="ca-valencia">El Dolphin és un gestor de fitxers lleuger. S'ha dissenyat pensant a facilitar el seu ús i que siga simple, permetent la flexibilitat i la personalització. Això vol dir que podeu fer la gestió dels vostres fitxers de la manera exacta com ho vulgueu fer.</p>
@ -105,7 +105,7 @@
<p xml:lang="et">Dolphin on vähest koormust tekitav failihaldur. Selle loomisel on peetud silmas kasutamise hõlpsust ja lihtsust, ometi pakub see suurt paindlikkust ja oma käe järgi kohandamise võimalusi. Sel moel saab faile hallata just, nagu ise soovid.</p>
<p xml:lang="fi">Dolphin on kevyt tiedostonhallinta. Se on suunniteltu helppokäyttöiseksi ja yksinkertaiseksi, mutta silti joustavaksi ja mukautettavaksi. Voit siis hallita tiedostojasi juuri niin kuin haluat.</p>
<p xml:lang="fr">Dolphin est un gestionnaire de fichier léger. Il a été conçu en gardant à l'esprit la simplicité et l'aisance à l'usage, tout en permettant flexibilité et personnalisation. Cela signifie que vous pouvez gérer vos fichiers de la manière exacte que vous voulez.</p>
<p xml:lang="gl">Dolphin é un xestor de ficheiros lixeiro. Deseñouse pensando na facilidade de uso e maila simplicidade, pero permitindo flexibilidade e personalización. Noutras palabras, permítelle xestionar os seus ficheiros do xeito que máis lle agrade.</p>
<p xml:lang="gl">Dolphin é un xestor de ficheiros lixeiro. Deseñouse pensando na facilidade de uso e a simplicidade, pero permitindo flexibilidade e personalización. Noutras palabras, permítelle xestionar os seus ficheiros do xeito que máis lle agrade.</p>
<p xml:lang="he">Dolphin הוא מנהל קבצים קל־משקל. הוא עוצב לקלות שימוש ופשטות, תוך כדי אפשור גמישות והתאמה אישית. זה אומר שתוכל לנהל את קבציך איך שאתה רוצה לעשות זאת.</p>
<p xml:lang="hu">A Dolphin egy pehelysúlyú fájlkezelő. Az egyszerű használatot és az egyszerűséget szem előtt tartva tervezték, miközben továbbra is lehetővé teszi a rugalmasságot és a testre szabhatóságot. Ez azt jelenti, hogy pontosan oly módon végezheti a fájlkezelést, ahogy csak akarja.</p>
<p xml:lang="ia">Dolphin es un gerente de file legier. Il ha essite designate con facilitate de uso e simplicitate in le mente, mentre il permitte ancora flexibilitate e personalisation. Isto significa que tu pote facer le gerente de file exactemente como tu lo vole.</p>
@ -133,7 +133,7 @@
<p xml:lang="zh-TW">Dolphin 是一套輕量級的檔案管理員。它設計的理念是易用與簡單,但仍然保持足夠的彈性。這表示您可以用您想要使用的方式來管理您的檔案。</p>
<p>Features:</p>
<p xml:lang="ar">المزايا:</p>
<p xml:lang="ast">Carauterístiques</p>
<p xml:lang="ast">Carauterístiques:</p>
<p xml:lang="bs">Svojstva:</p>
<p xml:lang="ca">Característiques:</p>
<p xml:lang="ca-valencia">Característiques:</p>
@ -177,7 +177,6 @@
<p xml:lang="zh-TW">功能:</p>
<ul>
<li>Navigation (or breadcrumb) bar for URLs, allowing you to quickly navigate through the hierarchy of files and folders.</li>
<li xml:lang="ast">Barra de navegación </li>
<li xml:lang="bs">Navigacijska (ili mrvična) traka za URL, dopušta vam da se brzo krećete kroz hijerarhiju datoteka i direktorija.</li>
<li xml:lang="ca">Barra de navegació (o fil d'Ariadna) pels URL, permetent una navegació ràpida per la jerarquia dels fitxers i carpetes.</li>
<li xml:lang="ca-valencia">Barra de navegació (o fil d'Ariadna) pels URL, permetent una navegació ràpida per la jerarquia dels fitxers i carpetes.</li>
@ -215,7 +214,6 @@
<li xml:lang="zh-TW">網址導覽列讓您可以快速瀏覽檔案與資料夾。</li>
<li>Supports several different kinds of view styles and properties and allows you to configure the view exactly how you want it.</li>
<li xml:lang="ar">يدعم العديد من الأنواع المختلفة من الخصائص وأنماط العرض ويسمح لك بضبط العرض كما تريد تمامًا.</li>
<li xml:lang="ast">Sofitalla delles tribes de vista y propiedaes diferentes y permítete configurar la vista exautamente como tu quies.</li>
<li xml:lang="bs">Dopušta vište vrsta stilova pogleda i svojstava i dopšta vam da konfigurišete pogled baš kako želite.</li>
<li xml:lang="ca">Accepta diferents classes diverses d'estils de visualització i propietats i us permet configurar la visualització exactament com la vulgueu.</li>
<li xml:lang="ca-valencia">Accepta diferents classes diverses d'estils de visualització i propietats i vos permet configurar la visualització exactament com la vulgueu.</li>
@ -254,7 +252,6 @@
<li xml:lang="zh-TW">網址導覽列讓您可以快速瀏覽檔案與資料夾。</li>
<li>Split view, allowing you to easily copy or move files between locations.</li>
<li xml:lang="ar">العرض المقسوم، يسمح لك بنسخ ونقل الملفات بين مكانين بسهولة.</li>
<li xml:lang="ast">Vista dixebrada, permítete copiar y mover ficheros d'un mou cenciellu ente allugamientos.</li>
<li xml:lang="bs">Razdvaja pogled, dopuštajući lako kopiranje ili pomijeranje datoteka između lokacija</li>
<li xml:lang="ca">Divisió de visualització, permetent copiar o moure fitxers fàcilment entre les ubicacions.</li>
<li xml:lang="ca-valencia">Divisió de visualització, permetent copiar o moure fitxers fàcilment entre les ubicacions.</li>
@ -293,7 +290,6 @@
<li xml:lang="zh-TW">支援數個檢視模式,您也可以調整檢視模式的屬性。</li>
<li>Additional information and shortcuts are available as dock-able panels, allowing you to move them around freely and display exactly what you want.</li>
<li xml:lang="ar">تتوفر معلومات واختصارات إضافية كلوحات قابلة للرصف، مما يسمح لك بنقلها بحريّة وعرضها بالضبط كما تريد.</li>
<li xml:lang="ast">Tán disponibles atayos ya información adicional como paneles anclables, permitiéndote movelos pehí d'un mou llibre y amosar exautamente lo tu quies.</li>
<li xml:lang="bs">Dodatne informacije i kratice su dostupne kao usidreni paneli, dopuštajući vam da se krećete slobodno i prikažete šta želite.</li>
<li xml:lang="ca">Hi ha informació addicional i dreceres disponibles com a plafons que es poden acoblar, permetent moure'ls lliurement i mostrar exactament el què vulgueu.</li>
<li xml:lang="ca-valencia">Hi ha informació addicional i dreceres disponibles com a plafons que es poden acoblar, permetent moure'ls lliurement i mostrar exactament el què vulgueu.</li>
@ -331,7 +327,6 @@
<li xml:lang="zh-TW">分割檢視讓您可以輕鬆複製或移動檔案。</li>
<li>Multiple tab support</li>
<li xml:lang="ar">دعم تعدّد الألسنة</li>
<li xml:lang="ast">Sofitu de múltiples llingüetes</li>
<li xml:lang="bs">Podrška za više kartica</li>
<li xml:lang="ca">Admet pestanyes múltiples</li>
<li xml:lang="ca-valencia">Admet pestanyes múltiples</li>
@ -374,7 +369,6 @@
<li xml:lang="zh-TW">額外資訊與嵌入式面板捷徑讓您可以輕易顯示您常用的項目。</li>
<li>Informational dialogues are displayed in an unobtrusive way.</li>
<li xml:lang="ar">حواريات المعلومات تُعرَض بطريقة غير مُزعجة.</li>
<li xml:lang="ast">Los diálogos d'información amuésense d'un mou discretu.</li>
<li xml:lang="bs">Informativni dijalozi su prikazani na nenametljiv način.</li>
<li xml:lang="ca">Els diàlegs informatius es mostren d'una manera no molesta.</li>
<li xml:lang="ca-valencia">Els diàlegs informatius es mostren d'una manera no molesta.</li>
@ -412,7 +406,6 @@
<li xml:lang="zh-TW">支援多分頁</li>
<li>Undo/redo support</li>
<li xml:lang="ar">دعم التراجع والإعادة</li>
<li xml:lang="ast">Sofitu de desfechura/refechura</li>
<li xml:lang="bs">Podrška za poništavanje/ponavljanje akcija</li>
<li xml:lang="ca">Admet desfer/refer</li>
<li xml:lang="ca-valencia">Admet desfer/refer</li>
@ -450,11 +443,10 @@
<li xml:lang="tr">Geri alma/tekrarlama desteği</li>
<li xml:lang="uk">Підтримка скасовування та повторення дій.</li>
<li xml:lang="x-test">xxUndo/redo supportxx</li>
<li xml:lang="zh-CN">/重做支持</li>
<li xml:lang="zh-CN">/重做支持</li>
<li xml:lang="zh-TW">以不唐突的方式顯示資訊對話框。</li>
<li>Transparent network access through the KIO system.</li>
<li xml:lang="ar">اتصال شبكيّ مباشر باستخدام نظام KIO.</li>
<li xml:lang="ast">Accesu tresparente a la rede pente'l sistema KIO.</li>
<li xml:lang="bs">Transparentni mrežni pristup kroz KIO sistem.</li>
<li xml:lang="ca">Accés transparent a la xarxa a través del sistema KIO.</li>
<li xml:lang="ca-valencia">Accés transparent a la xarxa a través del sistema KIO.</li>

View file

@ -260,7 +260,7 @@ void FoldersPanel::slotRoleEditingFinished(int index, const QByteArray& role, co
KIO::Job* job = KIO::moveAs(oldUrl, newUrl);
KJobWidgets::setWindow(job, this);
KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
}
}

View file

@ -201,7 +201,7 @@ void TreeViewContextMenu::moveToTrash()
KIO::Job* job = KIO::trash(list);
KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Trash, list, QUrl(QStringLiteral("trash:/")), job);
KJobWidgets::setWindow(job, m_parent);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
}
@ -213,7 +213,7 @@ void TreeViewContextMenu::deleteItem()
if (uiDelegate.askDeleteConfirmation(list, KIO::JobUiDelegate::Delete, KIO::JobUiDelegate::DefaultConfirmation)) {
KIO::Job* job = KIO::del(list);
KJobWidgets::setWindow(job, m_parent);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
}

View file

@ -185,7 +185,7 @@ void InformationPanel::showItemInfo()
// No item is hovered and no selection has been done: provide
// an item for the currently shown directory.
m_folderStatJob = KIO::stat(url(), KIO::HideProgressInfo);
if (m_folderStatJob->ui()) {
if (m_folderStatJob->uiDelegate()) {
KJobWidgets::setWindow(m_folderStatJob, this);
}
connect(m_folderStatJob, &KIO::Job::result,

View file

@ -142,10 +142,6 @@ InformationPanelContent::InformationPanelContent(QWidget* parent) :
QWidget* viewport = m_metaDataArea->viewport();
viewport->installEventFilter(this);
QPalette palette = viewport->palette();
palette.setColor(viewport->backgroundRole(), QColor(Qt::transparent));
viewport->setPalette(palette);
layout->addWidget(m_preview);
layout->addWidget(m_phononWidget);
layout->addWidget(m_nameLabel);
@ -195,7 +191,7 @@ void InformationPanelContent::showItem(const KFileItem& item)
m_previewJob = new KIO::PreviewJob(KFileItemList() << item, QSize(m_preview->width(), m_preview->height()));
m_previewJob->setScaleType(KIO::PreviewJob::Unscaled);
m_previewJob->setIgnoreMaximumSize(item.isLocalFile());
if (m_previewJob->ui()) {
if (m_previewJob->uiDelegate()) {
KJobWidgets::setWindow(m_previewJob, this);
}

View file

@ -52,7 +52,7 @@ class EmbeddedVideoPlayer : public Phonon::VideoWidget
updateGeometry();
}
virtual QSize sizeHint() const
QSize sizeHint() const Q_DECL_OVERRIDE
{
return m_sizeHint.isValid() ? m_sizeHint : Phonon::VideoWidget::sizeHint();
}

View file

@ -47,7 +47,8 @@ PlacesItemEditDialog::PlacesItemEditDialog(QWidget* parent) :
m_urlEdit(0),
m_textEdit(0),
m_iconButton(0),
m_appLocal(0)
m_appLocal(0),
m_buttonBox(nullptr)
{
}
@ -106,7 +107,7 @@ bool PlacesItemEditDialog::event(QEvent* event)
void PlacesItemEditDialog::slotUrlChanged(const QString& text)
{
m_okButton->setEnabled(!text.isEmpty());
m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!text.isEmpty());
}
PlacesItemEditDialog::~PlacesItemEditDialog()
@ -115,20 +116,16 @@ PlacesItemEditDialog::~PlacesItemEditDialog()
void PlacesItemEditDialog::initialize()
{
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
m_okButton = buttonBox->button(QDialogButtonBox::Ok);
m_okButton->setDefault(true);
m_okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
connect(buttonBox, &QDialogButtonBox::accepted, this, &PlacesItemEditDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &PlacesItemEditDialog::reject);
m_buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel, this);
connect(m_buttonBox, &QDialogButtonBox::accepted, this, &PlacesItemEditDialog::accept);
connect(m_buttonBox, &QDialogButtonBox::rejected, this, &PlacesItemEditDialog::reject);
setModal(true);
m_okButton->setDefault(true);
QVBoxLayout *mainLayout = new QVBoxLayout;
setLayout(mainLayout);
QWidget* mainWidget = new QWidget(this);
mainLayout->addWidget(mainWidget);
mainLayout->addWidget(buttonBox);
mainLayout->addWidget(m_buttonBox);
QVBoxLayout* vBox = new QVBoxLayout(mainWidget);

View file

@ -31,7 +31,7 @@ class KIconButton;
class KUrlRequester;
class QLineEdit;
class QCheckBox;
class QPushButton;
class QDialogButtonBox;
class PlacesItemEditDialog: public QDialog
{
@ -72,7 +72,7 @@ private:
QLineEdit* m_textEdit;
KIconButton* m_iconButton;
QCheckBox* m_appLocal;
QPushButton *m_okButton;
QDialogButtonBox *m_buttonBox;
};
#endif

View file

@ -872,7 +872,7 @@ PlacesItem* PlacesItemModel::createSystemPlacesItem(const SystemBookmarkData& da
props.setVisibleRoles({"text"});
} else if (data.url.scheme() == QLatin1String("timeline")) {
props.setViewMode(DolphinView::DetailsView);
props.setVisibleRoles({"text", "date"});
props.setVisibleRoles({"text", "modificationtime"});
}
}
}

View file

@ -137,7 +137,7 @@ void TerminalPanel::changeDir(const QUrl& url)
sendCdToTerminal(url.toLocalFile());
} else {
m_mostLocalUrlJob = KIO::mostLocalUrl(url, KIO::HideProgressInfo);
if (m_mostLocalUrlJob->ui()) {
if (m_mostLocalUrlJob->uiDelegate()) {
KJobWidgets::setWindow(m_mostLocalUrlJob, this);
}
connect(m_mostLocalUrlJob, &KIO::StatJob::result, this, &TerminalPanel::slotMostLocalUrlResult);

View file

@ -26,6 +26,7 @@
#include <QLineEdit>
#include <KLocalizedString>
#include <KSeparator>
#include <KNS3/KMoreToolsMenuFactory>
#include <QButtonGroup>
#include <QDir>
@ -206,6 +207,13 @@ void DolphinSearchBox::showEvent(QShowEvent* event)
}
}
void DolphinSearchBox::hideEvent(QHideEvent* event)
{
Q_UNUSED(event);
m_startedSearching = false;
m_startSearchTimer->stop();
}
void DolphinSearchBox::keyReleaseEvent(QKeyEvent* event)
{
QWidget::keyReleaseEvent(event);
@ -378,6 +386,20 @@ void DolphinSearchBox::init()
searchLocationGroup->addButton(m_fromHereButton);
searchLocationGroup->addButton(m_everywhereButton);
auto moreSearchToolsButton = new QToolButton(this);
moreSearchToolsButton->setAutoRaise(true);
moreSearchToolsButton->setPopupMode(QToolButton::InstantPopup);
moreSearchToolsButton->setIcon(QIcon::fromTheme("arrow-down-double"));
moreSearchToolsButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
moreSearchToolsButton->setText(i18n("More Search Tools"));
moreSearchToolsButton->setMenu(new QMenu(this));
connect(moreSearchToolsButton->menu(), &QMenu::aboutToShow, moreSearchToolsButton->menu(), [this, moreSearchToolsButton]()
{
m_menuFactory.reset(new KMoreToolsMenuFactory("dolphin/search-tools"));
moreSearchToolsButton->menu()->clear();
m_menuFactory->fillMenuFromGroupingNames(moreSearchToolsButton->menu(), { "files-find" }, this->m_searchPath);
} );
// Create "Facets" widgets
m_facetsToggleButton = new QToolButton(this);
m_facetsToggleButton->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
@ -397,8 +419,10 @@ void DolphinSearchBox::init()
optionsLayout->addWidget(m_separator);
optionsLayout->addWidget(m_fromHereButton);
optionsLayout->addWidget(m_everywhereButton);
optionsLayout->addStretch(1);
optionsLayout->addWidget(new KSeparator(Qt::Vertical, this));
optionsLayout->addWidget(m_facetsToggleButton);
optionsLayout->addWidget(moreSearchToolsButton);
optionsLayout->addStretch(1);
// Put the options into a QScrollArea. This prevents increasing the view width
// in case that not enough width for the options is available.

View file

@ -30,6 +30,7 @@ class QToolButton;
class QScrollArea;
class QLabel;
class QVBoxLayout;
class KMoreToolsMenuFactory;
/**
* @brief Input box for searching files with or without Baloo.
@ -100,6 +101,7 @@ public:
protected:
virtual bool event(QEvent* event) Q_DECL_OVERRIDE;
virtual void showEvent(QShowEvent* event) Q_DECL_OVERRIDE;
virtual void hideEvent(QHideEvent* event) Q_DECL_OVERRIDE;
virtual void keyReleaseEvent(QKeyEvent* event) Q_DECL_OVERRIDE;
virtual bool eventFilter(QObject* obj, QEvent* event) Q_DECL_OVERRIDE;
@ -175,6 +177,7 @@ private:
DolphinFacetsWidget* m_facetsWidget;
QUrl m_searchPath;
QScopedPointer<KMoreToolsMenuFactory> m_menuFactory;
QTimer* m_startSearchTimer;
};

View file

@ -22,6 +22,10 @@
<label>Should the full path be shown inside the location bar</label>
<default>false</default>
</entry>
<entry name="ShowFullPathInTitlebar" type="Bool">
<label>Should the full path be shown in the title bar</label>
<default>false</default>
</entry>
<entry name="Version" type="Int">
<label>Internal version of Dolphin, containing 3 digits for major, minor, bugfix</label>
<default>0</default>

View file

@ -29,6 +29,7 @@
#include "viewmodes/viewsettingspage.h"
#include "trash/trashsettingspage.h"
#include <KAuthorized>
#include <KWindowConfig>
#include <KLocalizedString>
#include <QIcon>
@ -85,11 +86,13 @@ DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent) :
connect(servicesSettingsPage, &ServicesSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
// Trash
TrashSettingsPage* trashSettingsPage = new TrashSettingsPage(this);
KPageWidgetItem* trashSettingsFrame = addPage(trashSettingsPage,
i18nc("@title:group", "Trash"));
trashSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("trash-empty")));
connect(trashSettingsPage, &TrashSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
auto* trashSettingsPage = createTrashSettingsPage(this);
if (trashSettingsPage) {
KPageWidgetItem* trashSettingsFrame = addPage(trashSettingsPage,
i18nc("@title:group", "Trash"));
trashSettingsFrame->setIcon(QIcon::fromTheme(QStringLiteral("trash-empty")));
connect(trashSettingsPage, &TrashSettingsPage::changed, this, &DolphinSettingsDialog::enableApply);
}
// General
GeneralSettingsPage* generalSettingsPage = new GeneralSettingsPage(url, this);
@ -102,7 +105,9 @@ DolphinSettingsDialog::DolphinSettingsDialog(const QUrl& url, QWidget* parent) :
m_pages.append(viewSettingsPage);
m_pages.append(navigationSettingsPage);
m_pages.append(servicesSettingsPage);
m_pages.append(trashSettingsPage);
if (trashSettingsPage) {
m_pages.append(trashSettingsPage);
}
m_pages.append(generalSettingsPage);
const KConfigGroup dialogConfig(KSharedConfig::openConfig(QStringLiteral("dolphinrc")), "SettingsDialog");
@ -145,3 +150,11 @@ void DolphinSettingsDialog::restoreDefaults()
}
}
SettingsPageBase *DolphinSettingsDialog::createTrashSettingsPage(QWidget *parent)
{
if (!KAuthorized::authorizeControlModule(QStringLiteral("kcmtrash.desktop"))) {
return nullptr;
}
return new TrashSettingsPage(parent);
}

View file

@ -49,6 +49,8 @@ private slots:
void restoreDefaults();
private:
static SettingsPageBase *createTrashSettingsPage(QWidget *parent);
QList<SettingsPageBase*> m_pages;
};

View file

@ -32,7 +32,6 @@
#include <QTabWidget>
K_PLUGIN_FACTORY(KCMDolphinGeneralConfigFactory, registerPlugin<DolphinGeneralConfigModule>(QStringLiteral("dolphingeneral"));)
K_EXPORT_PLUGIN(KCMDolphinGeneralConfigFactory("kcmdolphingeneral"))
DolphinGeneralConfigModule::DolphinGeneralConfigModule(QWidget* parent, const QVariantList& args) :
KCModule(parent),

View file

@ -1,6 +1,5 @@
Name=Dolphin General
Name[ar]=دولفين العامّ
Name[ast]=Xeneral de Dolphin
Name[ca]=General del Dolphin
Name[ca@valencia]=General del Dolphin
Name[cs]=Obecný Dolphin
@ -43,7 +42,6 @@ Name[zh_CN]=Dolphin 常规
Name[zh_TW]=Dolphin
Comment=This service allows configuration of general Dolphin settings.
Comment[ar]=تسمح هذه الخدمة بضبط إعدادات دولفين العامّة.
Comment[ast]=Esti serviciu permite la configuración de los axustes xenerales de Dolphin.
Comment[ca]=Aquest servei permet la configuració de l'arranjament general del Dolphin.
Comment[ca@valencia]=Este servei permet la configuració de l'arranjament general del Dolphin.
Comment[cs]=Tato služba umožňuje obecné nastavení Dolphinu.
@ -139,7 +137,6 @@ Name[zh_CN]=常规
Name[zh_TW]=
Comment=Configure general file manager settings
Comment[ar]=اضبط إعدادات مدير الملفّات العامّة
Comment[ast]=Configura los axustes xenerales del xestor de ficheros
Comment[ca]=Configura les opcions generals del gestor de fitxers
Comment[ca@valencia]=Configura les opcions generals del gestor de fitxers
Comment[cs]=Obecné nastavení správce souborů
@ -198,6 +195,7 @@ X-KDE-Keywords[hu]=fájlkezelő
X-KDE-Keywords[ia]=gerente de file
X-KDE-Keywords[id]=manajer berkas
X-KDE-Keywords[it]=gestore dei file
X-KDE-Keywords[ja]=
X-KDE-Keywords[ko]=
X-KDE-Keywords[lt]=Failų tvarkyklė
X-KDE-Keywords[nb]=filbehandler

View file

@ -27,7 +27,6 @@
#include <QVBoxLayout>
K_PLUGIN_FACTORY(KCMDolphinNavigationConfigFactory, registerPlugin<DolphinNavigationConfigModule>(QStringLiteral("dolphinnavigation"));)
K_EXPORT_PLUGIN(KCMDolphinNavigationConfigFactory("kcmdolphinnavigation"))
DolphinNavigationConfigModule::DolphinNavigationConfigModule(QWidget* parent, const QVariantList& args) :
KCModule(parent),

View file

@ -1,6 +1,5 @@
Name=Dolphin Navigation
Name[ar]=التّنقّل في دولفين
Name[ast]=Navegación de Dolphin
Name[ca]=Navegació del Dolphin
Name[ca@valencia]=Navegació del Dolphin
Name[cs]=Navigace Dolphinu
@ -43,7 +42,6 @@ Name[zh_CN]=Dolphin 导航
Name[zh_TW]=Dolphin
Comment=This service allows configuration of the Dolphin navigation.
Comment[ar]=تسمح هذه الخدمة بضبط التّنقّل في دولفين.
Comment[ast]=Esti serviciu permite la configuración de la navegación de Dolphin.
Comment[ca]=Aquest servei permet la configuració de la navegació del Dolphin.
Comment[ca@valencia]=Este servei permet la configuració de la navegació del Dolphin.
Comment[cs]=Tato služba umožňuje nastavení navigace v Dolphinu.
@ -139,7 +137,6 @@ Name[zh_CN]=导航
Name[zh_TW]=
Comment=Configure file manager navigation
Comment[ar]=اضبط التّنقّل في مدير الملفّات
Comment[ast]=Configura la navegación del xestor de ficheros
Comment[ca]=Configura la navegació del gestor de fitxers
Comment[ca@valencia]=Configura la navegació del gestor de fitxers
Comment[cs]=Nastavení navigace správce souborů
@ -199,6 +196,7 @@ X-KDE-Keywords[hu]=fájlkezelő
X-KDE-Keywords[ia]=gerente de file
X-KDE-Keywords[id]=manajer berkas
X-KDE-Keywords[it]=gestore dei file
X-KDE-Keywords[ja]=
X-KDE-Keywords[ko]=
X-KDE-Keywords[lt]=Failų tvarkyklė
X-KDE-Keywords[nb]=filbehandler

View file

@ -27,7 +27,6 @@
#include <QVBoxLayout>
K_PLUGIN_FACTORY(KCMDolphinServicesConfigFactory, registerPlugin<DolphinServicesConfigModule>(QStringLiteral("dolphinservices"));)
K_EXPORT_PLUGIN(KCMDolphinServicesConfigFactory("kcmdolphinservices"))
DolphinServicesConfigModule::DolphinServicesConfigModule(QWidget* parent, const QVariantList& args) :
KCModule(parent),

View file

@ -95,7 +95,6 @@ Name[zh_CN]=服务
Name[zh_TW]=
Comment=Configure file manager services
Comment[ar]=اضبط خدمات مدير الملفّات
Comment[ast]=Configura los servicios del xestor de ficheros
Comment[ca]=Configura els serveis del gestor de fitxers
Comment[ca@valencia]=Configura els serveis del gestor de fitxers
Comment[cs]=Nastavení služeb správce souborů
@ -154,6 +153,7 @@ X-KDE-Keywords[hu]=fájlkezelő
X-KDE-Keywords[ia]=gerente de file
X-KDE-Keywords[id]=manajer berkas
X-KDE-Keywords[it]=gestore dei file
X-KDE-Keywords[ja]=
X-KDE-Keywords[ko]=
X-KDE-Keywords[lt]=Failų tvarkyklė
X-KDE-Keywords[nb]=filbehandler

View file

@ -33,7 +33,6 @@
#include <QTabWidget>
K_PLUGIN_FACTORY(KCMDolphinViewModesConfigFactory, registerPlugin<DolphinViewModesConfigModule>(QStringLiteral("dolphinviewmodes"));)
K_EXPORT_PLUGIN(KCMDolphinViewModesConfigFactory("kcmdolphinviewmodes"))
DolphinViewModesConfigModule::DolphinViewModesConfigModule(QWidget* parent, const QVariantList& args) :
KCModule(parent),

View file

@ -1,6 +1,5 @@
Name=Dolphin View Modes
Name[ar]=أوضاع المنظور في دولفين
Name[ast]=Moos de vista de Dolphin
Name[ca]=Modes de vista del Dolphin
Name[ca@valencia]=Modes de vista del Dolphin
Name[cs]=Režimy pohledů Dolphinu
@ -43,7 +42,6 @@ Name[zh_CN]=Dolphin 视图模式
Name[zh_TW]=
Comment=This service allows configuration of the Dolphin view modes.
Comment[ar]=تسمح هذه الخدمة بضبط أوضاع المنظور في دولفين.
Comment[ast]=Esti serviciu permite la configuración de los moos de vista de Dolphin.
Comment[ca]=Aquest servei permet la configuració dels modes de vista del Dolphin.
Comment[ca@valencia]=Este servei permet la configuració dels modes de vista del Dolphin.
Comment[cs]=Tato služba umožňuje nastavení režimů pohledu Dolphinu.
@ -96,7 +94,6 @@ X-KDE-ParentApp=kcontrol
X-DocPath=dolphin/index.html#preferences-dialog-viewmodes
Name=View Modes
Name[ar]=أوضاع المنظور
Name[ast]=Moos de vista
Name[ca]=Modes de vista
Name[ca@valencia]=Modes de vista
Name[cs]=Režimy pohledu
@ -139,7 +136,6 @@ Name[zh_CN]=视图模式
Name[zh_TW]=
Comment=Configure file manager view modes
Comment[ar]=اضبط أوضاع المنظور في مدير الملفّات
Comment[ast]=Configura los moos de vista del xestor de ficheros
Comment[ca]=Configura els modes de vista del gestor de fitxers
Comment[ca@valencia]=Configura els modes de vista del gestor de fitxers
Comment[cs]=Nastavení režimů pohledu správce souborů
@ -199,6 +195,7 @@ X-KDE-Keywords[hu]=fájlkezelő
X-KDE-Keywords[ia]=gerente de file
X-KDE-Keywords[id]=manajer berkas
X-KDE-Keywords[it]=gestore dei file
X-KDE-Keywords[ja]=
X-KDE-Keywords[ko]=
X-KDE-Keywords[lt]=Failų tvarkyklė
X-KDE-Keywords[nb]=filbehandler

View file

@ -46,7 +46,8 @@ StartupSettingsPage::StartupSettingsPage(const QUrl& url, QWidget* parent) :
m_splitView(0),
m_editableUrl(0),
m_showFullPath(0),
m_filterBar(0)
m_filterBar(0),
m_showFullPathInTitlebar(0)
{
QVBoxLayout* topLayout = new QVBoxLayout(this);
QWidget* vBox = new QWidget(this);
@ -104,6 +105,8 @@ StartupSettingsPage::StartupSettingsPage(const QUrl& url, QWidget* parent) :
vBoxLayout->addWidget(m_showFullPath);
m_filterBar = new QCheckBox(i18nc("@option:check Startup Settings", "Show filter bar"), vBox);
vBoxLayout->addWidget(m_filterBar);
m_showFullPathInTitlebar = new QCheckBox(i18nc("@option:check Startup Settings", "Show full path in title bar"), vBox);
vBoxLayout->addWidget(m_showFullPathInTitlebar);
// Add a dummy widget with no restriction regarding
// a vertical resizing. This assures that the dialog layout
@ -119,6 +122,7 @@ StartupSettingsPage::StartupSettingsPage(const QUrl& url, QWidget* parent) :
connect(m_editableUrl, &QCheckBox::toggled, this, &StartupSettingsPage::slotSettingsChanged);
connect(m_showFullPath, &QCheckBox::toggled, this, &StartupSettingsPage::slotSettingsChanged);
connect(m_filterBar, &QCheckBox::toggled, this, &StartupSettingsPage::slotSettingsChanged);
connect(m_showFullPathInTitlebar, &QCheckBox::toggled, this, &StartupSettingsPage::slotSettingsChanged);
}
StartupSettingsPage::~StartupSettingsPage()
@ -141,6 +145,7 @@ void StartupSettingsPage::applySettings()
settings->setEditableUrl(m_editableUrl->isChecked());
settings->setShowFullPath(m_showFullPath->isChecked());
settings->setFilterBar(m_filterBar->isChecked());
settings->setShowFullPathInTitlebar(m_showFullPathInTitlebar->isChecked());
settings->save();
}
@ -190,4 +195,5 @@ void StartupSettingsPage::loadSettings()
m_editableUrl->setChecked(GeneralSettings::editableUrl());
m_showFullPath->setChecked(GeneralSettings::showFullPath());
m_filterBar->setChecked(GeneralSettings::filterBar());
m_showFullPathInTitlebar->setChecked(GeneralSettings::showFullPathInTitlebar());
}

View file

@ -62,6 +62,7 @@ private:
QCheckBox* m_editableUrl;
QCheckBox* m_showFullPath;
QCheckBox* m_filterBar;
QCheckBox* m_showFullPathInTitlebar;
};
#endif

View file

@ -303,7 +303,7 @@ void ViewPropertiesDialog::configureAdditionalInfo()
visibleRoles.clear();
visibleRoles.append("text");
visibleRoles.append("size");
visibleRoles.append("date");
visibleRoles.append("modificationtime");
m_viewProps->setVisibleRoles(visibleRoles);
}

View file

@ -154,9 +154,9 @@ void KFileItemModelTest::testDefaultSortRole()
QVERIFY(itemsInsertedSpy.wait());
QCOMPARE(m_model->count(), 3);
QCOMPARE(m_model->data(0)["text"].toString(), QString("a.txt"));
QCOMPARE(m_model->data(1)["text"].toString(), QString("b.txt"));
QCOMPARE(m_model->data(2)["text"].toString(), QString("c.txt"));
QCOMPARE(m_model->data(0).value("text").toString(), QString("a.txt"));
QCOMPARE(m_model->data(1).value("text").toString(), QString("b.txt"));
QCOMPARE(m_model->data(2).value("text").toString(), QString("c.txt"));
}
void KFileItemModelTest::testDefaultGroupedSorting()
@ -882,8 +882,8 @@ void KFileItemModelTest::testSorting()
// Sort by Date, descending
m_model->setSortDirectoriesFirst(true);
m_model->setSortRole("date");
QCOMPARE(m_model->sortRole(), QByteArray("date"));
m_model->setSortRole("modificationtime");
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::DescendingOrder);
QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "b" << "d" << "a" << "e");
QCOMPARE(itemsMovedSpy.count(), 1);
@ -892,7 +892,7 @@ void KFileItemModelTest::testSorting()
// Sort by Date, ascending
m_model->setSortOrder(Qt::AscendingOrder);
QCOMPARE(m_model->sortRole(), QByteArray("date"));
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
QCOMPARE(itemsInModel(), QStringList() << "c" << "c-2" << "c-3" << "c-1" << "e" << "a" << "d" << "b");
QCOMPARE(itemsMovedSpy.count(), 1);
@ -901,7 +901,7 @@ void KFileItemModelTest::testSorting()
// Sort by Date, ascending, 'Sort Folders First' disabled
m_model->setSortDirectoriesFirst(false);
QCOMPARE(m_model->sortRole(), QByteArray("date"));
QCOMPARE(m_model->sortRole(), QByteArray("modificationtime"));
QCOMPARE(m_model->sortOrder(), Qt::AscendingOrder);
QVERIFY(!m_model->sortDirectoriesFirst());
QCOMPARE(itemsInModel(), QStringList() << "e" << "a" << "c" << "c-1" << "c-2" << "c-3" << "d" << "b");

View file

@ -37,6 +37,7 @@
*/
class KItemListControllerTestStyle : public QProxyStyle
{
Q_OBJECT
public:
KItemListControllerTestStyle(QStyle* style) :
QProxyStyle(style),

View file

@ -26,11 +26,12 @@
class DummyModel : public KItemModelBase
{
Q_OBJECT
public:
DummyModel();
void setCount(int count);
virtual int count() const;
virtual QHash<QByteArray, QVariant> data(int index) const;
int count() const Q_DECL_OVERRIDE;
QHash<QByteArray, QVariant> data(int index) const Q_DECL_OVERRIDE;
private:
int m_count;

View file

@ -22,7 +22,7 @@
#include <QTest>
#include <QVector>
Q_DECLARE_METATYPE(KItemRangeList);
Q_DECLARE_METATYPE(KItemRangeList)
/**
* Converts a KItemRangeList to a KItemSet.
@ -72,14 +72,14 @@ QVector<int> KItemRangeList2QVector(const KItemRangeList& itemRanges)
static QSet<int> KItemSet2QSet(const KItemSet& itemSet)
{
QSet<int> result;
foreach (int i, itemSet) {
for (int i : itemSet) {
result.insert(i);
}
// Check that the conversion was successful.
Q_ASSERT(itemSet.count() == result.count());
foreach (int i, itemSet) {
for (int i : itemSet) {
Q_ASSERT(result.contains(i));
}
@ -239,7 +239,7 @@ void KItemSetTest::testIterators()
QCOMPARE(testQVector, itemsQVector);
testQVector.clear();
foreach (int i, itemSet) {
for (int i : itemSet) {
testQVector.append(i);
}
QCOMPARE(testQVector, itemsQVector);

View file

@ -44,6 +44,7 @@ void ViewPropertiesTest::init()
{
m_globalViewProps = GeneralSettings::self()->globalViewProps();
GeneralSettings::self()->setGlobalViewProps(false);
GeneralSettings::self()->save();
// It is mandatory to create the test-directory inside the home-directory
// of the user: ViewProperties does not write inside directories
@ -58,6 +59,7 @@ void ViewPropertiesTest::cleanup()
m_testDir = 0;
GeneralSettings::self()->setGlobalViewProps(m_globalViewProps);
GeneralSettings::self()->save();
}
/**

View file

@ -29,6 +29,7 @@
#include <QGraphicsSceneDragDropEvent>
#include <QTimer>
#include <QScrollBar>
#include <QPixmapCache>
#include <QPointer>
#include <QMenu>
#include <QVBoxLayout>
@ -211,19 +212,7 @@ void DolphinView::setActive(bool active)
m_active = active;
QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
if (!active) {
color.setAlpha(150);
}
QWidget* viewport = m_container->viewport();
if (viewport) {
QPalette palette;
palette.setColor(viewport->backgroundRole(), color);
viewport->setPalette(palette);
}
update();
updatePalette();
if (active) {
m_container->setFocus();
@ -721,9 +710,31 @@ void DolphinView::stopLoading()
m_model->cancelDirectoryLoading();
}
void DolphinView::updatePalette()
{
QColor color = KColorScheme(QPalette::Active, KColorScheme::View).background().color();
if (!m_active) {
color.setAlpha(150);
}
QWidget* viewport = m_container->viewport();
if (viewport) {
QPalette palette;
palette.setColor(viewport->backgroundRole(), color);
viewport->setPalette(palette);
}
update();
}
bool DolphinView::eventFilter(QObject* watched, QEvent* event)
{
switch (event->type()) {
case QEvent::PaletteChange:
updatePalette();
QPixmapCache::clear();
break;
case QEvent::KeyPress:
if (GeneralSettings::useTabForSwitchingSplitView()) {
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(event);
@ -1012,7 +1023,7 @@ void DolphinView::slotItemHovered(int index)
const QPoint pos = m_container->mapToGlobal(itemRect.topLeft().toPoint());
itemRect.moveTo(pos);
m_toolTipManager->showToolTip(item, itemRect);
m_toolTipManager->showToolTip(item, itemRect, nativeParentWidget()->windowHandle());
}
emit requestItemInfo(item);
@ -1525,7 +1536,7 @@ void DolphinView::slotRoleEditingFinished(int index, const QByteArray& role, con
KIO::Job * job = KIO::moveAs(oldUrl, newUrl);
KJobWidgets::setWindow(job, this);
KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
if (!newNameExistsAlready) {
// Only connect the result signal if there is no item with the new name

View file

@ -762,6 +762,8 @@ private:
QUrl viewPropertiesUrl() const;
private:
void updatePalette();
bool m_active;
bool m_tabsForFiles;
bool m_assureVisibleCurrentIndex;

View file

@ -37,6 +37,7 @@
#include <KSelectAction>
#include <KToggleAction>
#include <KPropertiesDialog>
#include <KProtocolManager>
#include <QIcon>
#include "dolphindebug.h"
@ -481,12 +482,19 @@ void DolphinViewActionHandler::slotHiddenFilesShownChanged(bool shown)
QAction* showHiddenFilesAction = m_actionCollection->action(QStringLiteral("show_hidden_files"));
showHiddenFilesAction->setChecked(shown);
// #374508: don't overwrite custom icons.
const QString iconName = showHiddenFilesAction->icon().name();
if (!iconName.isEmpty() && iconName != QLatin1String("visibility") && iconName != QLatin1String("hint")) {
return;
}
showHiddenFilesAction->setIcon(QIcon::fromTheme(shown ? QStringLiteral("visibility") : QStringLiteral("hint")));
}
void DolphinViewActionHandler::slotWriteStateChanged(bool isFolderWritable)
{
m_actionCollection->action(QStringLiteral("create_dir"))->setEnabled(isFolderWritable);
m_actionCollection->action(QStringLiteral("create_dir"))->setEnabled(isFolderWritable &&
KProtocolManager::supportsMakeDir(currentView()->url()));
}
KToggleAction* DolphinViewActionHandler::iconsModeAction()

View file

@ -159,10 +159,10 @@ void RenameDialog::renameItem(const KFileItem &item, const QString& newName)
widget = this;
}
KIO::Job * job = KIO::moveAs(oldUrl, newUrl);
KIO::Job * job = KIO::moveAs(oldUrl, newUrl, KIO::HideProgressInfo);
KJobWidgets::setWindow(job, widget);
KIO::FileUndoManager::self()->recordJob(KIO::FileUndoManager::Rename, {oldUrl}, newUrl, job);
job->ui()->setAutoErrorHandlingEnabled(true);
job->uiDelegate()->setAutoErrorHandlingEnabled(true);
}
void RenameDialog::slotAccepted()

View file

@ -19,12 +19,10 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#include "filemetadatatooltip.h"
#include "dolphinfilemetadatawidget.h"
#include <KColorScheme>
#include <KSeparator>
// For the blurred tooltip background
#include <KWindowEffects>
#include <KStringHandler>
#include <QTextDocument>
@ -41,15 +39,12 @@
#include <Baloo/FileMetaDataWidget>
#endif
FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
DolphinFileMetaDataWidget::DolphinFileMetaDataWidget(QWidget* parent) :
QWidget(parent),
m_preview(0),
m_name(0),
m_fileMetaDataWidget(0)
{
setAttribute(Qt::WA_TranslucentBackground);
setWindowFlags(Qt::ToolTip | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
// Create widget for file preview
m_preview = new QLabel(this);
m_preview->setAlignment(Qt::AlignTop);
@ -71,11 +66,11 @@ FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
#ifndef HAVE_BALOO
m_fileMetaDataWidget = new KFileMetaDataWidget(this);
connect(m_fileMetaDataWidget, &KFileMetaDataWidget::metaDataRequestFinished,
this, &FileMetaDataToolTip::metaDataRequestFinished);
this, &DolphinFileMetaDataWidget::metaDataRequestFinished);
#else
m_fileMetaDataWidget = new Baloo::FileMetaDataWidget(this);
connect(m_fileMetaDataWidget, &Baloo::FileMetaDataWidget::metaDataRequestFinished,
this, &FileMetaDataToolTip::metaDataRequestFinished);
this, &DolphinFileMetaDataWidget::metaDataRequestFinished);
#endif
m_fileMetaDataWidget->setForegroundRole(QPalette::ToolTipText);
m_fileMetaDataWidget->setReadOnly(true);
@ -92,22 +87,22 @@ FileMetaDataToolTip::FileMetaDataToolTip(QWidget* parent) :
// (see bug #241608)
textLayout->addStretch();
QHBoxLayout* tipLayout = new QHBoxLayout(this);
tipLayout->addWidget(m_preview);
tipLayout->addSpacing(tipLayout->margin());
tipLayout->addLayout(textLayout);
QHBoxLayout* layout = new QHBoxLayout(this);
layout->addWidget(m_preview);
layout->addSpacing(layout->margin());
layout->addLayout(textLayout);
}
FileMetaDataToolTip::~FileMetaDataToolTip()
DolphinFileMetaDataWidget::~DolphinFileMetaDataWidget()
{
}
void FileMetaDataToolTip::setPreview(const QPixmap& pixmap)
void DolphinFileMetaDataWidget::setPreview(const QPixmap& pixmap)
{
m_preview->setPixmap(pixmap);
}
QPixmap FileMetaDataToolTip::preview() const
QPixmap DolphinFileMetaDataWidget::preview() const
{
if (m_preview->pixmap()) {
return *m_preview->pixmap();
@ -115,7 +110,7 @@ QPixmap FileMetaDataToolTip::preview() const
return QPixmap();
}
void FileMetaDataToolTip::setName(const QString& name)
void DolphinFileMetaDataWidget::setName(const QString& name)
{
QTextOption textOption;
textOption.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
@ -146,34 +141,18 @@ void FileMetaDataToolTip::setName(const QString& name)
m_name->setText(wrappedText);
}
QString FileMetaDataToolTip::name() const
QString DolphinFileMetaDataWidget::name() const
{
return m_name->text();
}
void FileMetaDataToolTip::setItems(const KFileItemList& items)
void DolphinFileMetaDataWidget::setItems(const KFileItemList& items)
{
m_fileMetaDataWidget->setItems(items);
}
KFileItemList FileMetaDataToolTip::items() const
KFileItemList DolphinFileMetaDataWidget::items() const
{
return m_fileMetaDataWidget->items();
}
void FileMetaDataToolTip::paintEvent(QPaintEvent* event)
{
QStylePainter painter(this);
QStyleOptionFrame option;
option.init(this);
painter.drawPrimitive(QStyle::PE_PanelTipLabel, option);
painter.end();
QWidget::paintEvent(event);
}
void FileMetaDataToolTip::showEvent(QShowEvent *)
{
KWindowEffects::enableBlurBehind(winId(), true, mask());
}

View file

@ -19,8 +19,8 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
#ifndef FILEMETADATATOOLTIP_H
#define FILEMETADATATOOLTIP_H
#ifndef DOLPHINFILEMETADATAWIDGET_H
#define DOLPHINFILEMETADATAWIDGET_H
#include <QWidget>
#include "config-baloo.h"
@ -37,16 +37,16 @@ namespace Baloo {
#endif
/**
* @brief Tooltip, that shows the meta information and a preview of one
* or more files.
* @brief Widget that shows the meta information and a preview of one
* or more files inside a KToolTipWidget.
*/
class FileMetaDataToolTip : public QWidget
class DolphinFileMetaDataWidget : public QWidget
{
Q_OBJECT
public:
FileMetaDataToolTip(QWidget* parent = 0);
virtual ~FileMetaDataToolTip();
DolphinFileMetaDataWidget(QWidget* parent = 0);
virtual ~DolphinFileMetaDataWidget();
void setPreview(const QPixmap& pixmap);
QPixmap preview() const;
@ -65,14 +65,10 @@ public:
signals:
/**
* Is emitted after the meta data has been received for the items
* set by FileMetaDataToolTip::setItems().
* set by DolphinFileMetaDataWidget::setItems().
*/
void metaDataRequestFinished(const KFileItemList& items);
protected:
virtual void paintEvent(QPaintEvent* event) Q_DECL_OVERRIDE;
virtual void showEvent(QShowEvent *) Q_DECL_OVERRIDE;
private:
QLabel* m_preview;
QLabel* m_name;

View file

@ -19,23 +19,27 @@
#include "tooltipmanager.h"
#include "filemetadatatooltip.h"
#include "dolphinfilemetadatawidget.h"
#include <QIcon>
#include <KIO/JobUiDelegate>
#include <KIO/PreviewJob>
#include <KJobWidgets>
#include <KToolTipWidget>
#include <QApplication>
#include <QDesktopWidget>
#include <QLayout>
#include <QStyle>
#include <QTimer>
#include <QWindow>
ToolTipManager::ToolTipManager(QWidget* parent) :
QObject(parent),
m_showToolTipTimer(0),
m_contentRetrievalTimer(0),
m_fileMetaDataToolTip(0),
m_transientParent(0),
m_fileMetaDataWidget(0),
m_tooltipWidget(new KToolTipWidget()),
m_toolTipRequested(false),
m_metaDataRequested(false),
m_appliedWaitCursor(false),
@ -62,11 +66,9 @@ ToolTipManager::ToolTipManager(QWidget* parent) :
ToolTipManager::~ToolTipManager()
{
delete m_fileMetaDataToolTip;
m_fileMetaDataToolTip = 0;
}
void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect)
void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect, QWindow *transientParent)
{
hideToolTip();
@ -75,12 +77,14 @@ void ToolTipManager::showToolTip(const KFileItem& item, const QRectF& itemRect)
m_itemRect.adjust(-m_margin, -m_margin, m_margin, m_margin);
m_item = item;
m_transientParent = transientParent;
// Only start the retrieving of the content, when the mouse has been over this
// item for 200 milliseconds. This prevents a lot of useless preview jobs and
// meta data retrieval, when passing rapidly over a lot of items.
Q_ASSERT(!m_fileMetaDataToolTip);
m_fileMetaDataToolTip = new FileMetaDataToolTip();
connect(m_fileMetaDataToolTip, &FileMetaDataToolTip::metaDataRequestFinished,
delete m_fileMetaDataWidget;
m_fileMetaDataWidget = new DolphinFileMetaDataWidget();
connect(m_fileMetaDataWidget, &DolphinFileMetaDataWidget::metaDataRequestFinished,
this, &ToolTipManager::slotMetaDataRequestFinished);
m_contentRetrievalTimer->start();
@ -100,14 +104,7 @@ void ToolTipManager::hideToolTip()
m_metaDataRequested = false;
m_showToolTipTimer->stop();
m_contentRetrievalTimer->stop();
if (m_fileMetaDataToolTip) {
m_fileMetaDataToolTip->hide();
// Do not delete the tool tip immediately to prevent crashes when
// QCoreApplication tries to deliver an 'Enter' event to it, see bug 310579.
m_fileMetaDataToolTip->deleteLater();
m_fileMetaDataToolTip = 0;
}
m_tooltipWidget->hideLater();
}
void ToolTipManager::startContentRetrieval()
@ -116,21 +113,21 @@ void ToolTipManager::startContentRetrieval()
return;
}
m_fileMetaDataToolTip->setName(m_item.text());
m_fileMetaDataWidget->setName(m_item.text());
// Request the retrieval of meta-data. The slot
// slotMetaDataRequestFinished() is invoked after the
// meta-data have been received.
m_metaDataRequested = true;
m_fileMetaDataToolTip->setItems(KFileItemList() << m_item);
m_fileMetaDataToolTip->adjustSize();
m_fileMetaDataWidget->setItems(KFileItemList() << m_item);
m_fileMetaDataWidget->adjustSize();
// Request a preview of the item
m_fileMetaDataToolTip->setPreview(QPixmap());
m_fileMetaDataWidget->setPreview(QPixmap());
KIO::PreviewJob* job = new KIO::PreviewJob(KFileItemList() << m_item, QSize(256, 256));
job->setIgnoreMaximumSize(m_item.isLocalFile());
if (job->ui()) {
if (job->uiDelegate()) {
KJobWidgets::setWindow(job, qApp->activeWindow());
}
@ -152,7 +149,7 @@ void ToolTipManager::setPreviewPix(const KFileItem& item,
if (pixmap.isNull()) {
previewFailed();
} else {
m_fileMetaDataToolTip->setPreview(pixmap);
m_fileMetaDataWidget->setPreview(pixmap);
if (!m_showToolTipTimer->isActive()) {
showToolTip();
}
@ -166,7 +163,7 @@ void ToolTipManager::previewFailed()
}
const QPixmap pixmap = QIcon::fromTheme(m_item.iconName()).pixmap(128, 128);
m_fileMetaDataToolTip->setPreview(pixmap);
m_fileMetaDataWidget->setPreview(pixmap);
if (!m_showToolTipTimer->isActive()) {
showToolTip();
}
@ -193,75 +190,16 @@ void ToolTipManager::showToolTip()
m_appliedWaitCursor = false;
}
if (m_fileMetaDataToolTip->preview().isNull() || m_metaDataRequested) {
if (m_fileMetaDataWidget->preview().isNull() || m_metaDataRequested) {
Q_ASSERT(!m_appliedWaitCursor);
QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
m_appliedWaitCursor = true;
return;
}
const QRect screen = QApplication::desktop()->screenGeometry(QCursor::pos());
// Restrict tooltip size to current screen size when needed.
// Because layout controlling widget doesn't respect widget's maximumSize property
// (correct me if I'm wrong), we need to let layout do its work, then manually change
// geometry if resulting widget doesn't fit the screen.
// Step #1 - make sizeHint return calculated tooltip size
m_fileMetaDataToolTip->layout()->setSizeConstraint(QLayout::SetFixedSize);
m_fileMetaDataToolTip->adjustSize();
QSize size = m_fileMetaDataToolTip->sizeHint();
// Step #2 - correct tooltip size when needed
if (size.width() > screen.width()) {
size.setWidth(screen.width());
}
if (size.height() > screen.height()) {
size.setHeight(screen.height());
}
// m_itemRect defines the area of the item, where the tooltip should be
// shown. Per default the tooltip is shown centered at the bottom.
// It must be assured that:
// - the content is fully visible
// - the content is not drawn inside m_itemRect
const bool hasRoomToLeft = (m_itemRect.left() - size.width() - m_margin >= screen.left());
const bool hasRoomToRight = (m_itemRect.right() + size.width() + m_margin <= screen.right());
const bool hasRoomAbove = (m_itemRect.top() - size.height() - m_margin >= screen.top());
const bool hasRoomBelow = (m_itemRect.bottom() + size.height() + m_margin <= screen.bottom());
if (!hasRoomAbove && !hasRoomBelow && !hasRoomToLeft && !hasRoomToRight) {
return;
}
int x, y;
if (hasRoomBelow || hasRoomAbove) {
x = qMax(screen.left(), m_itemRect.center().x() - size.width() / 2);
if (x + size.width() >= screen.right()) {
x = screen.right() - size.width() + 1;
}
if (hasRoomBelow) {
y = m_itemRect.bottom() + m_margin;
} else {
y = m_itemRect.top() - size.height() - m_margin;
}
} else {
Q_ASSERT(hasRoomToLeft || hasRoomToRight);
if (hasRoomToRight) {
x = m_itemRect.right() + m_margin;
} else {
x = m_itemRect.left() - size.width() - m_margin;
}
// Put the tooltip at the bottom of the screen. The x-coordinate has already
// been adjusted, so that no overlapping with m_itemRect occurs.
y = screen.bottom() - size.height() + 1;
}
// Step #3 - Alter tooltip geometry
m_fileMetaDataToolTip->setFixedSize(size);
m_fileMetaDataToolTip->layout()->setSizeConstraint(QLayout::SetNoConstraint);
m_fileMetaDataToolTip->move(QPoint(x, y));
m_fileMetaDataToolTip->show();
// Adjust the size to get a proper sizeHint()
m_fileMetaDataWidget->adjustSize();
m_tooltipWidget->showBelow(m_itemRect, m_fileMetaDataWidget, m_transientParent);
m_toolTipRequested = false;
}

View file

@ -25,8 +25,10 @@
#include <KFileItem>
class FileMetaDataToolTip;
class DolphinFileMetaDataWidget;
class KToolTipWidget;
class QTimer;
class QWindow;
/**
* @brief Manages the tooltips for an item view.
@ -47,9 +49,9 @@ public:
* Triggers the showing of the tooltip for the item \p item
* where the item has the maximum boundaries of \p itemRect.
* The tooltip manager takes care that the tooltip is shown
* slightly delayed.
* slightly delayed and with a proper \p transientParent.
*/
void showToolTip(const KFileItem& item, const QRectF& itemRect);
void showToolTip(const KFileItem& item, const QRectF& itemRect, QWindow *transientParent);
/**
* Hides the currently shown tooltip.
@ -72,7 +74,11 @@ private:
/// the tooltip content like preview and meta data gets started.
QTimer* m_contentRetrievalTimer;
FileMetaDataToolTip* m_fileMetaDataToolTip;
/// Transient parent of the tooltip, mandatory on Wayland.
QWindow* m_transientParent;
DolphinFileMetaDataWidget* m_fileMetaDataWidget;
QScopedPointer<KToolTipWidget> m_tooltipWidget;
bool m_toolTipRequested;
bool m_metaDataRequested;

View file

@ -2,7 +2,7 @@
Type=ServiceType
X-KDE-ServiceType=FileViewVersionControlPlugin
Comment=Version Control Plugin for File Views
Comment[ast]=Complementu de control de versiones pa vistes de ficheros
Comment[ar]=ملحقة تحكّم بالإصدارات لمناظير الملفّات
Comment[ca]=Connector de control de versions per a les vistes de fitxers
Comment[ca@valencia]=Connector de control de versions per a les vistes de fitxers
Comment[cs]=Modul pro správu verzí pro pohledy na soubory

View file

@ -35,7 +35,8 @@
namespace {
const int AdditionalInfoViewPropertiesVersion = 1;
const int NameRolePropertiesVersion = 2;
const int CurrentViewPropertiesVersion = 3;
const int DateRolePropertiesVersion = 4;
const int CurrentViewPropertiesVersion = 4;
// String representation to mark the additional properties of
// the details view as customized by the user. See
@ -123,6 +124,11 @@ ViewProperties::ViewProperties(const QUrl& url) :
Q_ASSERT(m_node->version() == NameRolePropertiesVersion);
}
if (m_node->version() < DateRolePropertiesVersion) {
convertDateRoleToModificationTimeRole();
Q_ASSERT(m_node->version() == DateRolePropertiesVersion);
}
m_node->setVersion(CurrentViewPropertiesVersion);
}
}
@ -309,7 +315,7 @@ QList<QByteArray> ViewProperties::visibleRoles() const
&& !visibleRoles.contains(CustomizedDetailsString);
if (useDefaultValues) {
roles.append("size");
roles.append("date");
roles.append("modificationtime");
}
return roles;
@ -448,6 +454,27 @@ void ViewProperties::convertNameRoleToTextRole()
update();
}
void ViewProperties::convertDateRoleToModificationTimeRole()
{
QStringList visibleRoles = m_node->visibleRoles();
for (int i = 0; i < visibleRoles.count(); ++i) {
if (visibleRoles[i].endsWith(QLatin1String("_date"))) {
const int leftLength = visibleRoles[i].length() - 5;
visibleRoles[i] = visibleRoles[i].left(leftLength) + "_modificationtime";
}
}
QString sortRole = m_node->sortRole();
if (sortRole == QLatin1String("date")) {
sortRole = QStringLiteral("modificationtime");
}
m_node->setVisibleRoles(visibleRoles);
m_node->setSortRole(sortRole);
m_node->setVersion(DateRolePropertiesVersion);
update();
}
bool ViewProperties::isPartOfHome(const QString& filePath)
{
// For performance reasons cache the path in a static QString

View file

@ -153,6 +153,12 @@ private:
*/
void convertNameRoleToTextRole();
/**
* Provides backward compatibility with .directory files created with
* Dolphin < 16.11.70: Converts the old name-role "date" to "modificationtime"
*/
void convertDateRoleToModificationTimeRole();
/**
* Returns true, if \a filePath is part of the home-path (see QDir::homePath()).
*/