1 /*
2  * SPDX-FileCopyrightText: 2014 Kevin Ottens <ervin@kde.org>
3  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
4  */
5 
6 #include <QApplication>
7 #include <QBoxLayout>
8 #include <QDockWidget>
9 #include <QProcess>
10 #include <QAction>
11 
12 #include <KActionCollection>
13 
14 
15 #include <KXmlGuiWindow>
16 
17 #include <KConfigGroup>
18 #include <KSharedConfig>
19 
20 #include "widgets/applicationcomponents.h"
21 #include "widgets/availablepagesview.h"
22 #include "widgets/availablesourcesview.h"
23 #include "widgets/editorview.h"
24 #include "widgets/pageview.h"
25 
26 #include "presentation/applicationmodel.h"
27 
28 #include "utils/dependencymanager.h"
29 #include "integration/dependencies.h"
30 
31 #include "aboutdata.h"
32 
33 #include <iostream>
34 #include <KAboutData>
35 #include <KLocalizedString>
36 #include <QCommandLineParser>
37 
main(int argc,char ** argv)38 int main(int argc, char **argv)
39 {
40     KLocalizedString::setApplicationDomain("zanshin");
41     QApplication app(argc, argv);
42     Integration::initializeGlobalAppDependencies();
43 
44     auto aboutData = App::getAboutData();
45     QCommandLineParser parser;
46     KAboutData::setApplicationData(aboutData);
47     aboutData.setupCommandLine(&parser);
48     parser.process(app);
49     aboutData.processCommandLine(&parser);
50 
51     KSharedConfig::Ptr config = KSharedConfig::openConfig(QStringLiteral("zanshin-migratorrc"));
52     KConfigGroup group = config->group("Migrations");
53     if (!group.readEntry("MigratedTags", false)) {
54         std::cerr << "Migrating tags, please wait..." << std::endl;
55         QProcess proc;
56         proc.start(QStringLiteral("zanshin-migrator"));
57         proc.waitForFinished(-1);
58         if (proc.exitStatus() == QProcess::CrashExit) {
59             std::cerr << "Migrator crashed!" << std::endl;
60         } else if (proc.exitCode() == 0) {
61             std::cerr << "Migration done" << std::endl;
62         } else {
63             std::cerr << "Migration error, code" << proc.exitCode() << std::endl;
64         }
65     }
66 
67     auto widget = new QWidget;
68     auto components = new Widgets::ApplicationComponents(widget);
69     components->setModel(Presentation::ApplicationModel::Ptr::create());
70 
71     auto layout = new QVBoxLayout;
72     layout->setContentsMargins(0, 0, 0, 0);
73     layout->addWidget(components->pageView());
74     widget->setLayout(layout);
75 
76     auto sourcesDock = new QDockWidget(i18n("Sources"));
77     sourcesDock->setObjectName(QStringLiteral("sourcesDock"));
78     sourcesDock->setWidget(components->availableSourcesView());
79 
80     auto pagesDock = new QDockWidget(i18n("Pages"));
81     pagesDock->setObjectName(QStringLiteral("pagesDock"));
82     pagesDock->setWidget(components->availablePagesView());
83 
84     auto editorDock = new QDockWidget(i18n("Editor"));
85     editorDock->setObjectName(QStringLiteral("editorDock"));
86     editorDock->setWidget(components->editorView());
87 
88     auto window = new KXmlGuiWindow;
89     window->setCentralWidget(widget);
90 
91     window->addDockWidget(Qt::RightDockWidgetArea, editorDock);
92     window->addDockWidget(Qt::LeftDockWidgetArea, pagesDock);
93     window->addDockWidget(Qt::LeftDockWidgetArea, sourcesDock);
94 
95     auto actions = components->globalActions();
96     actions.insert(QStringLiteral("dock_sources"), sourcesDock->toggleViewAction());
97     actions.insert(QStringLiteral("dock_pages"), pagesDock->toggleViewAction());
98     actions.insert(QStringLiteral("dock_editor"), editorDock->toggleViewAction());
99 
100     auto ac = window->actionCollection();
101     ac->addAction(KStandardAction::Quit, window, SLOT(close()));
102     for (auto it = actions.constBegin(); it != actions.constEnd(); ++it) {
103         auto shortcut = it.value()->shortcut();
104         if (!shortcut.isEmpty()) {
105             ac->setDefaultShortcut(it.value(), shortcut);
106         }
107         ac->addAction(it.key(), it.value());
108     }
109 
110     window->setupGUI(QSize(1024, 600),
111                      KXmlGuiWindow::ToolBar
112                    | KXmlGuiWindow::Keys
113                    | KXmlGuiWindow::Save
114                    | KXmlGuiWindow::Create);
115 
116     delete window->findChild<QAction*>("help_contents");
117     delete window->findChild<QAction*>("help_whats_this");
118 
119     window->show();
120 
121     {
122         auto &deps = Utils::DependencyManager::globalInstance();
123         auto repo = deps.create<Domain::DataSourceRepository>();
124         repo->windowNeedsDataBackend(window);
125     }
126 
127     return app.exec();
128 }
129