3
0
mirror of https://github.com/Qortal/Brooklyn.git synced 2025-02-22 15:15:53 +00:00
Scare Crowe d2ebfd0519 QortalOS Titan 5.60.12
Screw the description like that inbred T3Q
2022-03-05 21:17:59 +05:00

176 lines
4.3 KiB
C++

/*
SPDX-FileCopyrightText: 2008, 2009 Fredrik Höglund <fredrik@kde.org>
SPDX-FileCopyrightText: 2013-2014 Eike Hein <hein@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "labelgenerator.h"
#include <KFilePlacesModel>
#include <KShell>
#include "foldermodel.h"
int LabelGenerator::s_instanceCount = 0;
KFilePlacesModel *LabelGenerator::s_placesModel = nullptr;
LabelGenerator::LabelGenerator(QObject *parent)
: QObject(parent)
, m_rtl(false)
, m_labelMode(1)
{
++s_instanceCount;
}
LabelGenerator::~LabelGenerator()
{
--s_instanceCount;
if (!s_instanceCount) {
delete s_placesModel;
s_placesModel = nullptr;
}
}
FolderModel *LabelGenerator::folderModel() const
{
return m_folderModel.data();
}
void LabelGenerator::setFolderModel(FolderModel *folderModel)
{
if (m_folderModel.data() != folderModel) {
if (m_folderModel.data()) {
disconnect(m_folderModel.data(), nullptr, this, nullptr);
}
m_folderModel = folderModel;
connect(m_folderModel.data(), &FolderModel::listingCompleted, this, &LabelGenerator::updateDisplayLabel);
connect(m_folderModel.data(), &FolderModel::listingCanceled, this, &LabelGenerator::updateDisplayLabel);
Q_EMIT folderModelChanged();
updateDisplayLabel();
}
}
bool LabelGenerator::rtl() const
{
return m_rtl;
}
void LabelGenerator::setRtl(bool rtl)
{
if (rtl != m_rtl) {
m_rtl = rtl;
Q_EMIT rtlChanged();
updateDisplayLabel();
}
}
int LabelGenerator::labelMode() const
{
return m_labelMode;
}
void LabelGenerator::setLabelMode(int mode)
{
if (mode != m_labelMode) {
m_labelMode = mode;
Q_EMIT labelModeChanged();
updateDisplayLabel();
}
}
QString LabelGenerator::labelText() const
{
return m_labelText;
}
void LabelGenerator::setLabelText(const QString &text)
{
if (text != m_labelText) {
m_labelText = text;
Q_EMIT labelTextChanged();
updateDisplayLabel();
}
}
QString LabelGenerator::displayLabel() const
{
return m_displayLabel;
}
void LabelGenerator::updateDisplayLabel()
{
const QString displayLabel = generatedDisplayLabel();
if (m_displayLabel != displayLabel) {
m_displayLabel = displayLabel;
Q_EMIT displayLabelChanged();
}
}
QString LabelGenerator::generatedDisplayLabel()
{
if (!m_folderModel) {
return QString();
}
QUrl url = m_folderModel->resolvedUrl();
if (m_labelMode == 1 /* Default */) {
if (url.path().length() <= 1) {
const KFileItem &rootItem = m_folderModel->rootItem();
if (rootItem.text() != QLatin1String(".")) {
return rootItem.text();
}
}
QString label(url.toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash));
if (!s_placesModel) {
s_placesModel = new KFilePlacesModel();
}
connectPlacesModel();
const QModelIndex index = s_placesModel->closestItem(url);
if (index.isValid()) {
QString root = s_placesModel->url(index).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash);
label = label.right(label.length() - root.length());
if (!label.isEmpty()) {
if (label.at(0) == QLatin1Char('/')) {
label.remove(0, 1);
}
if (m_rtl) {
label.prepend(QLatin1String(" < "));
} else {
label.prepend(QLatin1String(" > "));
}
}
label.prepend(s_placesModel->text(index));
}
return label;
} else if (m_labelMode == 2 /* Full path */) {
return QUrl(url).toDisplayString(QUrl::PreferLocalFile | QUrl::StripTrailingSlash);
} else if (m_labelMode == 3 /* Custom title */) {
return m_labelText;
}
return QString();
}
void LabelGenerator::connectPlacesModel()
{
connect(s_placesModel, &KFilePlacesModel::rowsInserted, this, &LabelGenerator::updateDisplayLabel, Qt::UniqueConnection);
connect(s_placesModel, &KFilePlacesModel::rowsRemoved, this, &LabelGenerator::updateDisplayLabel, Qt::UniqueConnection);
connect(s_placesModel, &KFilePlacesModel::dataChanged, this, &LabelGenerator::updateDisplayLabel, Qt::UniqueConnection);
}