File indexing completed on 2024-05-12 17:22:03

0001 /*
0002     SPDX-FileCopyrightText: 2000-2007 Shie Erlich <krusader@users.sourceforge.net>
0003     SPDX-FileCopyrightText: 2000-2007 Rafi Yanai <krusader@users.sourceforge.net>
0004     SPDX-FileCopyrightText: 2000-2007 Csaba Karai <krusader@users.sourceforge.net>
0005     SPDX-FileCopyrightText: 2004-2022 Krusader Krew <https://krusader.org>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "krviewfactory.h"
0011 
0012 #include "krinterbriefview.h"
0013 #include "krinterdetailedview.h"
0014 
0015 #include <stdio.h>
0016 
0017 #include <KI18n/KLocalizedString>
0018 
0019 KrViewInstance::KrViewInstance(int id, const QString &name, const QString &desc, const QString &iconName, const QKeySequence &shortcut)
0020     : m_id(id)
0021     , m_name(name)
0022     , m_description(desc)
0023     , m_iconName(iconName)
0024     , m_shortcut(shortcut)
0025 {
0026 }
0027 
0028 template<typename T>
0029 class KrViewInstanceImpl : public KrViewInstance
0030 {
0031 public:
0032     KrViewInstanceImpl(int id, const QString &name, const QString &desc, const QString &icon, const QKeySequence &shortcut)
0033         : KrViewInstance(id, name, desc, icon, shortcut)
0034     {
0035     }
0036 
0037     KrView *create(QWidget *w, KConfig *cfg) override
0038     {
0039         return new T(w, *this, cfg);
0040     }
0041 };
0042 
0043 KrViewFactory::KrViewFactory()
0044     : m_defaultViewId(-1)
0045 {
0046 }
0047 
0048 // static initialization, on first use idiom
0049 KrViewFactory &KrViewFactory::self()
0050 {
0051     static KrViewFactory *factory = nullptr;
0052     if (!factory) {
0053         factory = new KrViewFactory();
0054         factory->init();
0055     }
0056     return *factory;
0057 }
0058 
0059 void KrViewFactory::init()
0060 {
0061     registerView(
0062         new KrViewInstanceImpl<KrInterDetailedView>(0, "KrInterDetailedView", i18n("&Detailed View"), "view-list-details", Qt::ALT + Qt::SHIFT + Qt::Key_D));
0063 
0064     registerView(new KrViewInstanceImpl<KrInterBriefView>(1, "KrInterBriefView", i18n("&Brief View"), "view-list-icons", Qt::ALT + Qt::SHIFT + Qt::Key_B));
0065 }
0066 
0067 KrView *KrViewFactory::createView(int id, QWidget *widget, KConfig *cfg)
0068 {
0069     return self().viewInstance(id)->create(widget, cfg);
0070 }
0071 
0072 void KrViewFactory::registerView(KrViewInstance *inst)
0073 {
0074     int position = 0;
0075 
0076     while (position < m_registeredViews.count()) {
0077         if (m_registeredViews[position]->id() > inst->id())
0078             break;
0079         position++;
0080     }
0081 
0082     m_registeredViews.insert(m_registeredViews.begin() + position, inst);
0083     if (m_defaultViewId == -1 || inst->id() < m_defaultViewId)
0084         m_defaultViewId = inst->id();
0085 }
0086 
0087 KrViewInstance *KrViewFactory::viewInstance(int id)
0088 {
0089     foreach (KrViewInstance *inst, m_registeredViews) {
0090         if (inst->id() == id)
0091             return inst;
0092     }
0093 
0094     foreach (KrViewInstance *inst_dflt, m_registeredViews) {
0095         if (inst_dflt->id() == m_defaultViewId)
0096             return inst_dflt;
0097     }
0098 
0099     fprintf(stderr, "Internal Error: no views registered!\n");
0100     exit(-1);
0101 }