* gnu/packages/kde.scm (grantleetheme): New variable. * gnu/packages/patches/grantlee-merge-theme-dirs.patch: New file. * gnu:lokal.mk (DATA): Add it.
		
			
				
	
	
		
			163 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Taken from nixpkgs, see
 | |
| grantleetheme: merge themes across multiple prefixes
 | |
| <https://github.com/NixOS/nixpkgs/commits/master/pkgs/applications/kde/grantleetheme/grantlee-merge-theme-dirs.patch>
 | |
| 
 | |
| 
 | |
| diff --git a/src/grantleetheme.cpp b/src/grantleetheme.cpp
 | |
| index 27d5bc8..8d43140 100644
 | |
| --- a/src/grantleetheme.cpp
 | |
| +++ b/src/grantleetheme.cpp
 | |
| @@ -46,7 +46,7 @@ ThemePrivate::ThemePrivate(const ThemePrivate &other)
 | |
|      , description(other.description)
 | |
|      , name(other.name)
 | |
|      , dirName(other.dirName)
 | |
| -    , absolutePath(other.absolutePath)
 | |
| +    , absolutePaths(other.absolutePaths)
 | |
|      , author(other.author)
 | |
|      , email(other.email)
 | |
|      , loader(other.loader)
 | |
| @@ -64,12 +64,15 @@ void ThemePrivate::setupEngine()
 | |
|  
 | |
|  void ThemePrivate::setupLoader()
 | |
|  {
 | |
| -    // Get the parent dir with themes, we set the theme directory separately
 | |
| -    QDir dir(absolutePath);
 | |
| -    dir.cdUp();
 | |
| +    QStringList templateDirs;
 | |
| +    for (const QString& path : absolutePaths) {
 | |
| +        QDir dir(path);
 | |
| +        dir.cdUp();
 | |
| +        templateDirs << dir.absolutePath();
 | |
| +    }
 | |
|  
 | |
|      loader = QSharedPointer<GrantleeTheme::QtResourceTemplateLoader>::create();
 | |
| -    loader->setTemplateDirs({ dir.absolutePath() });
 | |
| +    loader->setTemplateDirs(templateDirs);
 | |
|      loader->setTheme(dirName);
 | |
|  
 | |
|      if (!sEngine) {
 | |
| @@ -121,7 +124,7 @@ Theme::Theme(const QString &themePath, const QString &dirName, const QString &de
 | |
|      KConfigGroup group(&config, QStringLiteral("Desktop Entry"));
 | |
|      if (group.isValid()) {
 | |
|          d->dirName = dirName;
 | |
| -        d->absolutePath = themePath;
 | |
| +        d->absolutePaths = QStringList(themePath);
 | |
|          d->name = group.readEntry("Name", QString());
 | |
|          d->description = group.readEntry("Description", QString());
 | |
|          d->themeFileName = group.readEntry("FileName", QString());
 | |
| @@ -140,7 +143,7 @@ Theme::~Theme()
 | |
|  
 | |
|  bool Theme::operator==(const Theme &other) const
 | |
|  {
 | |
| -    return isValid() && other.isValid() && d->absolutePath == other.absolutePath();
 | |
| +    return isValid() && other.isValid() && d->absolutePaths == other.absolutePaths();
 | |
|  }
 | |
|  
 | |
|  Theme &Theme::operator=(const Theme &other)
 | |
| @@ -184,7 +187,15 @@ QString Theme::dirName() const
 | |
|  
 | |
|  QString Theme::absolutePath() const
 | |
|  {
 | |
| -    return d->absolutePath;
 | |
| +    if (! d->absolutePaths.isEmpty()) {
 | |
| +      return d->absolutePaths.first();
 | |
| +    };
 | |
| +    return QString();
 | |
| +}
 | |
| +
 | |
| +QStringList Theme::absolutePaths() const
 | |
| +{
 | |
| +    return d->absolutePaths;
 | |
|  }
 | |
|  
 | |
|  QString Theme::author() const
 | |
| @@ -223,6 +231,13 @@ QString Theme::render(const QString &templateName, const QVariantHash &data, con
 | |
|      return result;
 | |
|  }
 | |
|  
 | |
| +void Theme::addThemeDir(const QString& path)
 | |
| +{
 | |
| +    QDir dir(path);
 | |
| +    dir.cdUp();
 | |
| +    d->absolutePaths << dir.absolutePath();
 | |
| +}
 | |
| +
 | |
|  void Theme::addPluginPath(const QString &path)
 | |
|  {
 | |
|      if (!ThemePrivate::sEngine) {
 | |
| diff --git a/src/grantleetheme.h b/src/grantleetheme.h
 | |
| index a25c27b..be38299 100644
 | |
| --- a/src/grantleetheme.h
 | |
| +++ b/src/grantleetheme.h
 | |
| @@ -48,11 +48,14 @@ public:
 | |
|      Q_REQUIRED_RESULT QStringList displayExtraVariables() const;
 | |
|      Q_REQUIRED_RESULT QString dirName() const;
 | |
|      Q_REQUIRED_RESULT QString absolutePath() const;
 | |
| +    Q_REQUIRED_RESULT QStringList absolutePaths() const;
 | |
|      Q_REQUIRED_RESULT QString author() const;
 | |
|      Q_REQUIRED_RESULT QString authorEmail() const;
 | |
|  
 | |
|      Q_REQUIRED_RESULT QString render(const QString &templateName, const QVariantHash &data, const QByteArray &applicationDomain = QByteArray());
 | |
|  
 | |
| +    void addThemeDir(const QString&);
 | |
| +
 | |
|      static void addPluginPath(const QString &path);
 | |
|  
 | |
|  private:
 | |
| diff --git a/src/grantleetheme_p.h b/src/grantleetheme_p.h
 | |
| index eb73dcb..00510e9 100644
 | |
| --- a/src/grantleetheme_p.h
 | |
| +++ b/src/grantleetheme_p.h
 | |
| @@ -43,7 +43,7 @@ public:
 | |
|      QString description;
 | |
|      QString name;
 | |
|      QString dirName;
 | |
| -    QString absolutePath;
 | |
| +    QStringList absolutePaths;
 | |
|      QString author;
 | |
|      QString email;
 | |
|  
 | |
| diff --git a/src/grantleethememanager.cpp b/src/grantleethememanager.cpp
 | |
| index 606d717..dc99041 100644
 | |
| --- a/src/grantleethememanager.cpp
 | |
| +++ b/src/grantleethememanager.cpp
 | |
| @@ -125,25 +125,18 @@ public:
 | |
|  
 | |
|          for (const QString &directory : qAsConst(themesDirectories)) {
 | |
|              QDirIterator dirIt(directory, QStringList(), QDir::AllDirs | QDir::NoDotAndDotDot);
 | |
| -            QStringList alreadyLoadedThemeName;
 | |
|              while (dirIt.hasNext()) {
 | |
|                  dirIt.next();
 | |
|                  const QString dirName = dirIt.fileName();
 | |
|                  GrantleeTheme::Theme theme = q->loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
 | |
|                  if (theme.isValid()) {
 | |
|                      QString themeName = theme.name();
 | |
| -                    if (alreadyLoadedThemeName.contains(themeName)) {
 | |
| -                        int i = 2;
 | |
| -                        const QString originalName(theme.name());
 | |
| -                        while (alreadyLoadedThemeName.contains(themeName)) {
 | |
| -                            themeName = originalName + QStringLiteral(" (%1)").arg(i);
 | |
| -                            ++i;
 | |
| -                        }
 | |
| -                        theme.d->name = themeName;
 | |
| +                    QMap<QString, GrantleeTheme::Theme>::iterator i = themes.find(dirName);
 | |
| +                    if (i != themes.end()) {
 | |
| +                        i.value().addThemeDir(dirIt.filePath());
 | |
| +                    } else {
 | |
| +                        themes.insert(dirName, theme);
 | |
|                      }
 | |
| -                    alreadyLoadedThemeName << themeName;
 | |
| -                    themes.insert(dirName, theme);
 | |
| -                    //qDebug()<<" theme.name()"<<theme.name();
 | |
|                  }
 | |
|              }
 | |
|              watch->addDir(directory);
 | |
| @@ -366,7 +359,7 @@ QString ThemeManager::pathFromThemes(const QString &themesRelativePath, const QS
 | |
|                  GrantleeTheme::Theme theme = loadTheme(dirIt.filePath(), dirName, defaultDesktopFileName);
 | |
|                  if (theme.isValid()) {
 | |
|                      if (dirName == themeName) {
 | |
| -                        return theme.absolutePath();
 | |
| +                        return theme.absolutePaths().first();
 | |
|                      }
 | |
|                  }
 | |
|              }
 |