File indexing completed on 2024-05-12 05:04:31

0001 /*
0002     SPDX-FileCopyrightText: 2018 Ralf Habacker ralf.habacker @freenet.de
0003 
0004     This file is part of libalkimia.
0005 
0006     SPDX-License-Identifier: GPL-2.0-or-later
0007 */
0008 
0009 #include "mainwindow.h"
0010 #include "ui_mainwindow.h"
0011 
0012 #include "alkonlinequotesprofile.h"
0013 #include "alkonlinequotesprofilemanager.h"
0014 #include "alkonlinequoteswidget.h"
0015 #include "alkwebpage.h"
0016 
0017 #include <QComboBox>
0018 #include <QDockWidget>
0019 #include <QLineEdit>
0020 #include <QUrl>
0021 
0022 class MainWindow::Private
0023 {
0024 public:
0025     Private()
0026         : urlLine(nullptr)
0027         , quotesWidget(nullptr)
0028     {
0029     }
0030 
0031     ~Private()
0032     {
0033         delete quotesWidget;
0034     }
0035     QLineEdit *urlLine;
0036     AlkOnlineQuotesWidget *quotesWidget;
0037     Ui::MainWindow ui;
0038 };
0039 
0040 void MainWindow::slotUrlChanged(const QUrl &url)
0041 {
0042 #if defined(BUILD_WITH_WEBKIT) || defined(BUILD_WITH_WEBENGINE)
0043     d->urlLine->setText(url.toString());
0044 #else
0045     Q_UNUSED(url)
0046 #endif
0047 }
0048 
0049 void MainWindow::slotEditingFinished()
0050 {
0051     AlkOnlineQuotesProfileManager::instance().webPage()->load(QUrl(d->urlLine->text()), d->quotesWidget->acceptLanguage());
0052 }
0053 
0054 void MainWindow::slotLanguageChanged(const QString &text)
0055 {
0056     d->quotesWidget->setAcceptLanguage(text);
0057     if (!d->urlLine->text().isEmpty())
0058         slotEditingFinished();
0059 }
0060 
0061 MainWindow::MainWindow(QWidget *parent)
0062     : QMainWindow(parent)
0063     , ApplicationSettings(this, false)
0064     , d(new Private)
0065 {
0066     AlkOnlineQuotesProfileManager &manager = AlkOnlineQuotesProfileManager::instance();
0067 
0068     manager.addProfile(new AlkOnlineQuotesProfile("no-config-file", AlkOnlineQuotesProfile::Type::None));
0069 #if QT_VERSION < QT_VERSION_CHECK(5, 0, 0)
0070     manager.addProfile(new AlkOnlineQuotesProfile("alkimia4", AlkOnlineQuotesProfile::Type::Alkimia4, "alkimia-quotes.knsrc"));
0071     manager.addProfile(new AlkOnlineQuotesProfile("skrooge4", AlkOnlineQuotesProfile::Type::Skrooge4, "skrooge-quotes.knsrc"));
0072     manager.addProfile(new AlkOnlineQuotesProfile("kmymoney4", AlkOnlineQuotesProfile::Type::KMyMoney4, "kmymoney-quotes.knsrc"));
0073 #else
0074     manager.addProfile(new AlkOnlineQuotesProfile("alkimia5", AlkOnlineQuotesProfile::Type::Alkimia5, "alkimia-quotes.knsrc"));
0075     manager.addProfile(new AlkOnlineQuotesProfile("skrooge5", AlkOnlineQuotesProfile::Type::Skrooge5, "skrooge-quotes.knsrc"));
0076     manager.addProfile(new AlkOnlineQuotesProfile("kmymoney5", AlkOnlineQuotesProfile::Type::KMyMoney5, "kmymoney-quotes.knsrc"));
0077 #endif
0078 #ifdef ENABLE_FINANCEQUOTE
0079     manager.addProfile(new AlkOnlineQuotesProfile("Finance::Quote", AlkOnlineQuotesProfile::Type::Script));
0080 #endif
0081     d->ui.setupUi(this);
0082     d->quotesWidget = new AlkOnlineQuotesWidget(true, true);
0083     d->quotesWidget->setGHNSSourceEditable(true);
0084 
0085     QDockWidget *profilesWidget = new QDockWidget(i18n("Profiles"), this);
0086     profilesWidget->setObjectName("profilesDockWidget");
0087     profilesWidget->setWidget(d->quotesWidget->profilesWidget());
0088     addDockWidget(Qt::LeftDockWidgetArea, profilesWidget);
0089 
0090     QDockWidget *profileDetailsWidget = new QDockWidget(i18n("Profile details"), this);
0091     profileDetailsWidget->setObjectName("profileDetailsDockWidget");
0092     profileDetailsWidget->setWidget(d->quotesWidget->profileDetailsWidget());
0093     addDockWidget(Qt::RightDockWidgetArea, profileDetailsWidget);
0094 
0095     QDockWidget *onlineQuotesWidget = new QDockWidget(i18n("Online quotes"), this);
0096     onlineQuotesWidget->setObjectName("onlineQuotesDockWidget");
0097     onlineQuotesWidget->setWidget(d->quotesWidget->onlineQuotesWidget());
0098     addDockWidget(Qt::LeftDockWidgetArea, onlineQuotesWidget);
0099 
0100     QDockWidget *debugWidget = new QDockWidget(i18n("Debug"), this);
0101     debugWidget->setObjectName("debugDockWidget");
0102     debugWidget->setWidget(d->quotesWidget->debugWidget());
0103     addDockWidget(Qt::LeftDockWidgetArea, debugWidget);
0104 
0105     QDockWidget *quoteDetailsWidget = new QDockWidget(i18n("Quote details"), this);
0106     quoteDetailsWidget->setObjectName("quoteDetailsDockWidget");
0107     quoteDetailsWidget->setWidget(d->quotesWidget->quoteDetailsWidget());
0108     addDockWidget(Qt::RightDockWidgetArea, quoteDetailsWidget);
0109 
0110     connect(&AlkOnlineQuotesProfileManager::instance(), SIGNAL(updateAvailable(QString,QString)),
0111             this, SLOT(slotUpdateAvailable(QString,QString)));
0112 
0113     manager.setWebPageEnabled(true);
0114     QDockWidget *browserWidget = new QDockWidget(i18n("Browser"), this);
0115     browserWidget->setObjectName("browserDockWidget");
0116     AlkWebPage *webPage = manager.webPage();
0117 
0118     QHBoxLayout *hLayout = new QHBoxLayout;
0119 #if defined(BUILD_WITH_WEBKIT) || defined(BUILD_WITH_WEBENGINE)
0120     // setup url line
0121     d->urlLine = new QLineEdit;
0122     connect(d->urlLine, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished()));
0123     hLayout->addWidget(d->urlLine);
0124 
0125     // setup language box
0126     QComboBox *box = new QComboBox;
0127     QList<QLocale> allLocales = QLocale::matchingLocales(
0128             QLocale::AnyLanguage,
0129             QLocale::AnyScript,
0130             QLocale::AnyCountry);
0131 
0132     QStringList languages;
0133     for (const QLocale &locale : allLocales) {
0134         languages.append(locale.uiLanguages());
0135     }
0136     languages.sort();
0137     box->addItems(languages);
0138     d->quotesWidget->setAcceptLanguage(box->currentText());
0139     connect(box, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotLanguageChanged(QString)));
0140     hLayout->addWidget(box);
0141 
0142     webPage->setWebInspectorEnabled(true);
0143     connect(webPage, SIGNAL(urlChanged(QUrl)), this, SLOT(slotUrlChanged(QUrl)));
0144 #endif
0145     // setup browser window
0146     QVBoxLayout *layout = new QVBoxLayout;
0147     layout->addLayout(hLayout);
0148     layout->addWidget(webPage->widget());
0149     QWidget *group = new QWidget;
0150     group->setLayout(layout);
0151     browserWidget->setWidget(group);
0152     addDockWidget(Qt::RightDockWidgetArea, browserWidget);
0153 
0154     setCentralWidget(nullptr);
0155 
0156     readPositionSettings();
0157 }
0158 
0159 MainWindow::~MainWindow()
0160 {
0161     delete d;
0162 }
0163 
0164 void MainWindow::slotUpdateAvailable(const QString &profile, const QString &name)
0165 {
0166     QString s = statusBar()->currentMessage();
0167     if (!s.isEmpty())
0168         s += " - ";
0169     s += i18n("Update for '%1' available in profile '%2'", name, profile);
0170     statusBar()->showMessage(s);
0171 }
0172 
0173 void MainWindow::closeEvent(QCloseEvent *event)
0174 {
0175     writePositionSettings();
0176     QMainWindow::closeEvent(event);
0177 }