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 }