diff --git a/src/alkonlinequoteswidget.cpp b/src/alkonlinequoteswidget.cpp index 797705e..12871d2 100644 --- a/src/alkonlinequoteswidget.cpp +++ b/src/alkonlinequoteswidget.cpp @@ -1,498 +1,543 @@ /*************************************************************************** * Copyright 2004 Thomas Baumgart tbaumgart@kde.org * * * * This file is part of libalkimia. * * * * libalkimia is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2.1 of * * the License or (at your option) version 3 or any later version. * * * * libalkimia is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see * ***************************************************************************/ #include "alkonlinequoteswidget.h" #include "alkonlinequote.h" #include "alkonlinequotesprofile.h" #include "alkonlinequotesprofilemanager.h" #include "alkonlinequotesource.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include -class AlkOnlineQuotesWidget::Private +#include + +class AlkOnlineQuotesWidget::Private : public QWidget, public Ui::AlkOnlineQuotesWidget { + Q_OBJECT public: QWebView *m_webView; QString m_acceptLanguage; QList m_resetList; AlkOnlineQuoteSource m_currentItem; bool m_quoteInEditing; AlkOnlineQuotesProfile *m_profile; - Private() - : m_webView(nullptr) - , m_quoteInEditing(false) - , m_profile(nullptr) - { - } + Private(QWidget *parent); +public slots: + void slotNewProfile(); + void slotDeleteProfile(); + void slotSelectProfile(); + void slotLoadProfile(); + + void slotDeleteEntry(); + void slotUpdateEntry(); + void slotLoadWidgets(); + void slotEntryChanged(); + void slotNewEntry(); + void slotCheckEntry(); + void slotLogStatus(const QString &s); + void slotLogError(const QString &s); + void slotLogFailed(const QString &id, const QString &symbol); + void slotLogQuote(const QString &id, const QString &symbol, const QDate &date, double price); + void slotEntryRenamed(QListWidgetItem *item); + void slotStartRename(QListWidgetItem *item); + void slotInstallEntries(); + void slotUploadEntry(); + +public: + void loadProfiles(); + void loadQuotesList(const bool updateResetList = false); + void clearIcons(); + void setupIcons(const AlkOnlineQuote::Errors &errors); + QString singleSymbol() const; + QStringList doubleSymbol() const; + QString expandedUrl() const; }; -AlkOnlineQuotesWidget::AlkOnlineQuotesWidget(QWidget *parent) - : AlkOnlineQuotesWidgetDecl(parent) - , d(new Private) +AlkOnlineQuotesWidget::Private::Private(QWidget *parent) + : m_webView(nullptr) + , m_quoteInEditing(false) + , m_profile(nullptr) { + setupUi(parent); loadProfiles(); // TODO move to ui file KGuiItem updateButtenItem(i18nc("Accepts the entered data and stores it", "&Accept"), KIcon("dialog-ok"), i18n("Accepts the entered data and stores it"), i18n("Use this to accept the modified data.")); m_updateButton->setGuiItem(updateButtenItem); KGuiItem deleteButtenItem(i18n("&Delete"), KIcon("edit-delete"), i18n("Delete the selected source entry"), i18n("Use this to delete the selected online source entry")); m_deleteButton->setGuiItem(deleteButtenItem); KGuiItem checkButtonItem(i18nc("Check the selected source entry", "&Check Source"), KIcon("document-edit-verify"), i18n("Check the selected source entry"), i18n("Use this to check the selected online source entry")); m_checkButton->setGuiItem(checkButtonItem); KGuiItem showButtonItem(i18nc("Show the selected source entry in a web browser", "&Show page"), KIcon("applications-internet"), i18n("Show the selected source entry in a web browser"), i18n("Use this to show the selected online source entry")); m_showButton->setGuiItem(showButtonItem); KGuiItem newButtenItem(i18nc("Create a new source entry for online quotes", "&New..."), KIcon("document-new"), i18n("Create a new source entry for online quotes"), i18n("Use this to create a new entry for online quotes")); m_newButton->setGuiItem(newButtenItem); connect(m_newProfile, SIGNAL(clicked()), this, SLOT(slotNewProfile())); connect(m_deleteProfile, SIGNAL(clicked()), this, SLOT(slotDeleteProfile())); connect(m_selectProfile, SIGNAL(clicked()), this, SLOT(slotSelectProfile())); connect(m_updateButton, SIGNAL(clicked()), this, SLOT(slotUpdateEntry())); connect(m_newButton, SIGNAL(clicked()), this, SLOT(slotNewEntry())); connect(m_checkButton, SIGNAL(clicked()), this, SLOT(slotCheckEntry())); connect(m_deleteButton, SIGNAL(clicked()), this, SLOT(slotDeleteEntry())); connect(m_installButton, SIGNAL(clicked()), this, SLOT(slotInstallEntries())); connect(m_uploadButton, SIGNAL(clicked()), this, SLOT(slotUploadEntry())); connect(m_quoteSourceList, SIGNAL(itemSelectionChanged()), this, SLOT(slotLoadWidgets())); connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(slotEntryRenamed(QListWidgetItem *))); connect(m_quoteSourceList, SIGNAL(itemDoubleClicked(QListWidgetItem *)), this, SLOT(slotStartRename(QListWidgetItem *))); connect(m_editURL, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editSymbol, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editDate, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editDateFormat, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_editPrice, SIGNAL(textChanged(QString)), this, SLOT(slotEntryChanged())); connect(m_skipStripping, SIGNAL(toggled(bool)), this, SLOT(slotEntryChanged())); m_checkSymbol->setText("ORCL"); m_checkSymbol2->setText("BTC GBP"); m_updateButton->setEnabled(false); m_showButton->setVisible(false); slotLoadProfile(); } -AlkOnlineQuotesWidget::~AlkOnlineQuotesWidget() -{ - delete d; -} - -void AlkOnlineQuotesWidget::loadProfiles() +void AlkOnlineQuotesWidget::Private::loadProfiles() { AlkOnlineQuotesProfileList list = AlkOnlineQuotesProfileManager::instance().profiles(); foreach (AlkOnlineQuotesProfile *profile, list) { QListWidgetItem *item = new QListWidgetItem(dynamic_cast(m_profileList)); item->setText(profile->name()); item->setFlags(item->flags() | Qt::ItemIsEditable); } m_profileList->setCurrentRow(0); - d->m_profile = AlkOnlineQuotesProfileManager::instance().profiles().first(); + m_profile = AlkOnlineQuotesProfileManager::instance().profiles().first(); loadQuotesList(); } -void AlkOnlineQuotesWidget::loadQuotesList(const bool updateResetList) +void AlkOnlineQuotesWidget::Private::loadQuotesList(const bool updateResetList) { //disconnect the slot while items are being loaded and reconnect at the end disconnect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(slotEntryRenamed(QListWidgetItem *))); - d->m_quoteInEditing = false; - QStringList groups = d->m_profile->quoteSources(); + m_quoteInEditing = false; + QStringList groups = m_profile->quoteSources(); if (updateResetList) { - d->m_resetList.clear(); + m_resetList.clear(); } m_quoteSourceList->clear(); QStringList::Iterator it; for (it = groups.begin(); it != groups.end(); ++it) { - AlkOnlineQuoteSource source(*it, d->m_profile); + AlkOnlineQuoteSource source(*it, m_profile); if (!source.isValid()) { continue; } QListWidgetItem *item = new QListWidgetItem(*it); item->setFlags(Qt::ItemIsEditable | Qt::ItemIsSelectable | Qt::ItemIsEnabled); m_quoteSourceList->addItem(item); if (updateResetList) { - d->m_resetList += source; + m_resetList += source; } } m_quoteSourceList->sortItems(); QListWidgetItem *first = m_quoteSourceList->item(0); if (first) { m_quoteSourceList->setCurrentItem(first); } slotLoadWidgets(); m_newButton->setEnabled((m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly)).count() == 0); connect(m_quoteSourceList, SIGNAL(itemChanged(QListWidgetItem *)), this, SLOT(slotEntryRenamed(QListWidgetItem *))); } -void AlkOnlineQuotesWidget::resetConfig() -{ - QStringList::ConstIterator it; - QStringList groups = d->m_profile->quoteSources(); - - // delete all currently defined entries - for (it = groups.constBegin(); it != groups.constEnd(); ++it) { - AlkOnlineQuoteSource(*it, d->m_profile).remove(); - } - - // and write back the one's from the reset list - QList::iterator itr; - for (itr = d->m_resetList.begin(); itr != d->m_resetList.end(); ++itr) { - (*itr).write(); - } - - loadQuotesList(); -} - -void AlkOnlineQuotesWidget::setView(QWebView *view) -{ - d->m_webView = view; -} - -QString AlkOnlineQuotesWidget::acceptLanguage() const -{ - return d->m_acceptLanguage; -} - -void AlkOnlineQuotesWidget::setAcceptLanguage(const QString &text) -{ - d->m_acceptLanguage = text; -} - -void AlkOnlineQuotesWidget::slotNewProfile() +void AlkOnlineQuotesWidget::Private::slotNewProfile() { QListWidgetItem *item = new QListWidgetItem(dynamic_cast(m_profileList)); item->setText(QLatin1String("new profile")); item->setFlags(item->flags() | Qt::ItemIsEditable); } -void AlkOnlineQuotesWidget::slotDeleteProfile() +void AlkOnlineQuotesWidget::Private::slotDeleteProfile() { delete m_profileList->currentItem(); } -void AlkOnlineQuotesWidget::slotSelectProfile() +void AlkOnlineQuotesWidget::Private::slotSelectProfile() { slotLoadProfile(); } -void AlkOnlineQuotesWidget::slotLoadProfile() +void AlkOnlineQuotesWidget::Private::slotLoadProfile() { AlkOnlineQuotesProfileList list = AlkOnlineQuotesProfileManager::instance().profiles(); foreach (AlkOnlineQuotesProfile *profile, list) { if (m_profileList->currentItem()->text() == profile->name()) { - d->m_profile = profile; + m_profile = profile; loadQuotesList(); m_installButton->setVisible(profile->type() == AlkOnlineQuotesProfile::Type::GHNS); } } } -void AlkOnlineQuotesWidget::slotLoadWidgets() +void AlkOnlineQuotesWidget::Private::slotLoadWidgets() { - d->m_quoteInEditing = false; + m_quoteInEditing = false; QListWidgetItem *item = m_quoteSourceList->currentItem(); m_editURL->setEnabled(true); m_editSymbol->setEnabled(true); m_editPrice->setEnabled(true); m_editDate->setEnabled(true); m_editDateFormat->setEnabled(true); m_skipStripping->setEnabled(true); m_editURL->setText(QString()); m_editSymbol->setText(QString()); m_editPrice->setText(QString()); m_editDate->setText(QString()); m_editDateFormat->setText(QString()); if (item) { - d->m_currentItem = AlkOnlineQuoteSource(item->text(), d->m_profile); - m_editURL->setText(d->m_currentItem.url()); - m_editSymbol->setText(d->m_currentItem.sym()); - m_editPrice->setText(d->m_currentItem.price()); - m_editDate->setText(d->m_currentItem.date()); - m_editDateFormat->setText(d->m_currentItem.dateformat()); - m_skipStripping->setChecked(d->m_currentItem.skipStripping()); + m_currentItem = AlkOnlineQuoteSource(item->text(), m_profile); + m_editURL->setText(m_currentItem.url()); + m_editSymbol->setText(m_currentItem.sym()); + m_editPrice->setText(m_currentItem.price()); + m_editDate->setText(m_currentItem.date()); + m_editDateFormat->setText(m_currentItem.dateformat()); + m_skipStripping->setChecked(m_currentItem.skipStripping()); } else { m_editURL->setEnabled(false); m_editSymbol->setEnabled(false); m_editPrice->setEnabled(false); m_editDate->setEnabled(false); m_editDateFormat->setEnabled(false); m_skipStripping->setEnabled(false); } m_updateButton->setEnabled(false); } -void AlkOnlineQuotesWidget::slotEntryChanged() +void AlkOnlineQuotesWidget::Private::slotEntryChanged() { clearIcons(); - bool modified = m_editURL->text() != d->m_currentItem.url() - || m_editSymbol->text() != d->m_currentItem.sym() - || m_editDate->text() != d->m_currentItem.date() - || m_editDateFormat->text() != d->m_currentItem.dateformat() - || m_editPrice->text() != d->m_currentItem.price() - || m_skipStripping->isChecked() != d->m_currentItem.skipStripping(); + bool modified = m_editURL->text() != m_currentItem.url() + || m_editSymbol->text() != m_currentItem.sym() + || m_editDate->text() != m_currentItem.date() + || m_editDateFormat->text() != m_currentItem.dateformat() + || m_editPrice->text() != m_currentItem.price() + || m_skipStripping->isChecked() != m_currentItem.skipStripping(); m_updateButton->setEnabled(modified); m_checkButton->setEnabled(!modified); - m_checkSymbol->setEnabled(!d->m_currentItem.url().contains("%2")); - m_checkSymbol2->setEnabled(d->m_currentItem.url().contains("%2")); + m_checkSymbol->setEnabled(!m_currentItem.url().contains("%2")); + m_checkSymbol2->setEnabled(m_currentItem.url().contains("%2")); } -void AlkOnlineQuotesWidget::slotDeleteEntry() +void AlkOnlineQuotesWidget::Private::slotDeleteEntry() { QList items = m_quoteSourceList->findItems( - d->m_currentItem.name(), Qt::MatchExactly); + m_currentItem.name(), Qt::MatchExactly); if (items.size() == 0) { return; } QListWidgetItem *item = items.at(0); if (!item) { return; } int ret = KMessageBox::warningContinueCancel(this, i18n("Are you sure to delete this online quote ?"), i18n("Delete online quote"), KStandardGuiItem::cont(), KStandardGuiItem::cancel(), QString("DeletingOnlineQuote")); if (ret == KMessageBox::Cancel) { return; } // keep this order to avoid deleting the wrong current item - d->m_currentItem.remove(); + m_currentItem.remove(); delete item; slotEntryChanged(); } -void AlkOnlineQuotesWidget::slotUpdateEntry() +void AlkOnlineQuotesWidget::Private::slotUpdateEntry() { - d->m_currentItem.setUrl(m_editURL->text()); - d->m_currentItem.setSym(m_editSymbol->text()); - d->m_currentItem.setDate(m_editDate->text()); - d->m_currentItem.setDateformat(m_editDateFormat->text()); - d->m_currentItem.setPrice(m_editPrice->text()); - d->m_currentItem.setSkipStripping(m_skipStripping->isChecked()); - d->m_currentItem.write(); + m_currentItem.setUrl(m_editURL->text()); + m_currentItem.setSym(m_editSymbol->text()); + m_currentItem.setDate(m_editDate->text()); + m_currentItem.setDateformat(m_editDateFormat->text()); + m_currentItem.setPrice(m_editPrice->text()); + m_currentItem.setSkipStripping(m_skipStripping->isChecked()); + m_currentItem.write(); m_checkButton->setEnabled(true); slotEntryChanged(); } -void AlkOnlineQuotesWidget::slotNewEntry() +void AlkOnlineQuotesWidget::Private::slotNewEntry() { - AlkOnlineQuoteSource newSource(i18n("New Quote Source"), d->m_profile); + AlkOnlineQuoteSource newSource(i18n("New Quote Source"), m_profile); newSource.write(); loadQuotesList(); QListWidgetItem *item = m_quoteSourceList->findItems(i18n("New Quote Source"), Qt::MatchExactly).at(0); if (item) { m_quoteSourceList->setCurrentItem(item); slotLoadWidgets(); } } -void AlkOnlineQuotesWidget::clearIcons() +void AlkOnlineQuotesWidget::Private::clearIcons() { QPixmap emptyIcon; m_urlCheckLabel->setPixmap(emptyIcon); m_dateCheckLabel->setPixmap(emptyIcon); m_priceCheckLabel->setPixmap(emptyIcon); m_symbolCheckLabel->setPixmap(emptyIcon); m_dateFormatCheckLabel->setPixmap(emptyIcon); } -void AlkOnlineQuotesWidget::setupIcons(const AlkOnlineQuote::Errors &errors) +void AlkOnlineQuotesWidget::Private::setupIcons(const AlkOnlineQuote::Errors &errors) { QPixmap okIcon(BarIcon("dialog-ok-apply")); QPixmap failIcon(BarIcon("dialog-cancel")); if (errors & AlkOnlineQuote::Errors::URL) { m_urlCheckLabel->setPixmap(failIcon); } else { m_urlCheckLabel->setPixmap(okIcon); m_symbolCheckLabel->setPixmap(errors & AlkOnlineQuote::Errors::Symbol ? failIcon : okIcon); m_priceCheckLabel->setPixmap(errors & AlkOnlineQuote::Errors::Price ? failIcon : okIcon); if (errors & AlkOnlineQuote::Errors::Date) { m_dateCheckLabel->setPixmap(failIcon); } else { m_dateCheckLabel->setPixmap(okIcon); m_dateFormatCheckLabel->setPixmap( errors & AlkOnlineQuote::Errors::DateFormat ? failIcon : okIcon); } } } -void AlkOnlineQuotesWidget::slotCheckEntry() +void AlkOnlineQuotesWidget::Private::slotCheckEntry() { - AlkOnlineQuote quote(d->m_profile); + AlkOnlineQuote quote(m_profile); m_logWindow->setVisible(true); m_logWindow->clear(); clearIcons(); - quote.setWebView(d->m_webView); - quote.setAcceptLanguage(d->m_acceptLanguage); + quote.setWebView(m_webView); + quote.setAcceptLanguage(m_acceptLanguage); connect("e, SIGNAL(status(QString)), this, SLOT(slotLogStatus(QString))); connect("e, SIGNAL(error(QString)), this, SLOT(slotLogError(QString))); connect("e, SIGNAL(failed(QString,QString)), this, SLOT(slotLogFailed(QString,QString))); connect("e, SIGNAL(quote(QString,QString,QDate,double)), this, SLOT(slotLogQuote(QString,QString,QDate,double))); - if (d->m_currentItem.url().contains("%2")) { - quote.launch(m_checkSymbol2->text(), m_checkSymbol2->text(), d->m_currentItem.name()); + if (m_currentItem.url().contains("%2")) { + quote.launch(m_checkSymbol2->text(), m_checkSymbol2->text(), m_currentItem.name()); } else { - quote.launch(m_checkSymbol->text(), m_checkSymbol->text(), d->m_currentItem.name()); + quote.launch(m_checkSymbol->text(), m_checkSymbol->text(), m_currentItem.name()); } setupIcons(quote.errors()); } -void AlkOnlineQuotesWidget::slotLogStatus(const QString &s) +void AlkOnlineQuotesWidget::Private::slotLogStatus(const QString &s) { m_logWindow->append(s); } -void AlkOnlineQuotesWidget::slotLogError(const QString &s) +void AlkOnlineQuotesWidget::Private::slotLogError(const QString &s) { slotLogStatus(QString("") + s + QString("")); } -void AlkOnlineQuotesWidget::slotLogFailed(const QString &id, const QString &symbol) +void AlkOnlineQuotesWidget::Private::slotLogFailed(const QString &id, const QString &symbol) { slotLogStatus(QString("%1 %2").arg(id, symbol)); } -void AlkOnlineQuotesWidget::slotLogQuote(const QString &id, const QString &symbol, +void AlkOnlineQuotesWidget::Private::slotLogQuote(const QString &id, const QString &symbol, const QDate &date, double price) { slotLogStatus(QString("%1 %2 %3 %4").arg(id, symbol, date.toString()).arg( price)); } -void AlkOnlineQuotesWidget::slotStartRename(QListWidgetItem *item) +void AlkOnlineQuotesWidget::Private::slotStartRename(QListWidgetItem *item) { - d->m_quoteInEditing = true; + m_quoteInEditing = true; m_quoteSourceList->editItem(item); } -void AlkOnlineQuotesWidget::slotEntryRenamed(QListWidgetItem *item) +void AlkOnlineQuotesWidget::Private::slotEntryRenamed(QListWidgetItem *item) { //if there is no current item selected, exit - if (d->m_quoteInEditing == false || !m_quoteSourceList->currentItem() + if (m_quoteInEditing == false || !m_quoteSourceList->currentItem() || item != m_quoteSourceList->currentItem()) { return; } - d->m_quoteInEditing = false; + m_quoteInEditing = false; QString text = item->text(); int nameCount = 0; for (int i = 0; i < m_quoteSourceList->count(); ++i) { if (m_quoteSourceList->item(i)->text() == text) { ++nameCount; } } // Make sure we get a non-empty and unique name if (text.length() > 0 && nameCount == 1) { - d->m_currentItem.rename(text); + m_currentItem.rename(text); } else { - item->setText(d->m_currentItem.name()); + item->setText(m_currentItem.name()); } m_quoteSourceList->sortItems(); m_newButton->setEnabled(m_quoteSourceList->findItems(i18n( "New Quote Source"), Qt::MatchExactly).count() == 0); } -void AlkOnlineQuotesWidget::slotInstallEntries() +void AlkOnlineQuotesWidget::Private::slotInstallEntries() { - QString configFile = d->m_profile->hotNewStuffConfigFile(); + QString configFile = m_profile->hotNewStuffConfigFile(); QPointer dialog = new KNS3::DownloadDialog(configFile, this); dialog->exec(); delete dialog; loadQuotesList(); } -void AlkOnlineQuotesWidget::slotUploadEntry() +void AlkOnlineQuotesWidget::Private::slotUploadEntry() { - QString configFile = d->m_profile->hotNewStuffConfigFile(); + QString configFile = m_profile->hotNewStuffConfigFile(); - QUrl url = QUrl::fromLocalFile(d->m_profile->hotNewStuffWriteFilePath(d->m_currentItem.name())); + QUrl url = QUrl::fromLocalFile(m_profile->hotNewStuffWriteFilePath(m_currentItem.name())); qDebug() << "uploading file" << url; QPointer dialog = new KNS3::UploadDialog(configFile, this); - dialog->setUploadName(d->m_currentItem.name()); + dialog->setUploadName(m_currentItem.name()); dialog->setUploadFile(url); dialog->exec(); delete dialog; } -QString AlkOnlineQuotesWidget::expandedUrl() const +QString AlkOnlineQuotesWidget::Private::expandedUrl() const { - if (d->m_currentItem.url().contains("%2")) { - return d->m_currentItem.url().arg(m_checkSymbol2->text()); + if (m_currentItem.url().contains("%2")) { + return m_currentItem.url().arg(m_checkSymbol2->text()); } else { - return d->m_currentItem.url().arg(m_checkSymbol->text()); + return m_currentItem.url().arg(m_checkSymbol->text()); + } +} + +AlkOnlineQuotesWidget::AlkOnlineQuotesWidget(QWidget *parent) + : QWidget(parent) + , d(new Private(this)) +{ +} + +AlkOnlineQuotesWidget::~AlkOnlineQuotesWidget() +{ + delete d; +} + +void AlkOnlineQuotesWidget::readConfig() +{ +} + +void AlkOnlineQuotesWidget::writeConfig() +{ +} + +void AlkOnlineQuotesWidget::resetConfig() +{ + QStringList::ConstIterator it; + QStringList groups = d->m_profile->quoteSources(); + + // delete all currently defined entries + for (it = groups.constBegin(); it != groups.constEnd(); ++it) { + AlkOnlineQuoteSource(*it, d->m_profile).remove(); } + + // and write back the one's from the reset list + QList::iterator itr; + for (itr = d->m_resetList.begin(); itr != d->m_resetList.end(); ++itr) { + (*itr).write(); + } + + d->loadQuotesList(); +} + +void AlkOnlineQuotesWidget::setView(QWebView *view) +{ + d->m_webView = view; } + +QString AlkOnlineQuotesWidget::acceptLanguage() const +{ + return d->m_acceptLanguage; +} + +void AlkOnlineQuotesWidget::setAcceptLanguage(const QString &text) +{ + d->m_acceptLanguage = text; +} + +#include "alkonlinequoteswidget.moc" diff --git a/src/alkonlinequoteswidget.h b/src/alkonlinequoteswidget.h index 65d6806..8027eac 100644 --- a/src/alkonlinequoteswidget.h +++ b/src/alkonlinequoteswidget.h @@ -1,98 +1,54 @@ /*************************************************************************** * Copyright 2004 Thomas Baumgart tbaumgart@kde.org * + * Copyright 2018 Ralf Habacker * * * * This file is part of libalkimia. * * * * libalkimia is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2.1 of * * the License or (at your option) version 3 or any later version. * * * * libalkimia is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see * ***************************************************************************/ #ifndef ALKONLINEQUOTESWIDGET_H #define ALKONLINEQUOTESWIDGET_H #include "alk_export.h" #include #include - -#include - -class ALK_NO_EXPORT AlkOnlineQuotesWidgetDecl : public QWidget, public Ui::AlkOnlineQuotesWidget -{ -public: - AlkOnlineQuotesWidgetDecl(QWidget *parent) : QWidget(parent) - { - setupUi(this); - } -}; +#include class QWebView; +class QListWidgetItem; -class ALK_EXPORT AlkOnlineQuotesWidget : public AlkOnlineQuotesWidgetDecl +class ALK_EXPORT AlkOnlineQuotesWidget : public QWidget { Q_OBJECT public: AlkOnlineQuotesWidget(QWidget *parent = 0); virtual ~AlkOnlineQuotesWidget(); - void writeConfig() - { - } - - void readConfig() - { - } - + void writeConfig(); + void readConfig(); void resetConfig(); void setView(QWebView *view); QString acceptLanguage() const; void setAcceptLanguage(const QString &text); -protected slots: - void slotNewProfile(); - void slotDeleteProfile(); - void slotSelectProfile(); - void slotLoadProfile(); - - void slotDeleteEntry(); - void slotUpdateEntry(); - void slotLoadWidgets(); - void slotEntryChanged(); - void slotNewEntry(); - void slotCheckEntry(); - void slotLogStatus(const QString &s); - void slotLogError(const QString &s); - void slotLogFailed(const QString &id, const QString &symbol); - void slotLogQuote(const QString &id, const QString &symbol, const QDate &date, double price); - void slotEntryRenamed(QListWidgetItem *item); - void slotStartRename(QListWidgetItem *item); - void slotInstallEntries(); - void slotUploadEntry(); - -protected: - void loadProfiles(); - void loadQuotesList(const bool updateResetList = false); - void clearIcons(); - void setupIcons(const AlkOnlineQuote::Errors &errors); - QString singleSymbol() const; - QStringList doubleSymbol() const; - QString expandedUrl() const; - private: class Private; Private *d; }; #endif diff --git a/tools/onlinequoteseditor/mainwindow.cpp b/tools/onlinequoteseditor/mainwindow.cpp index e7fd720..e8134d6 100644 --- a/tools/onlinequoteseditor/mainwindow.cpp +++ b/tools/onlinequoteseditor/mainwindow.cpp @@ -1,139 +1,140 @@ /*************************************************************************** * Copyright 2018 Ralf Habacker * * * * This file is part of libalkimia. * * * * libalkimia is free software; you can redistribute it and/or * * modify it under the terms of the GNU General Public License * * as published by the Free Software Foundation; either version 2.1 of * * the License or (at your option) version 3 or any later version. * * * * libalkimia is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program. If not, see * ***************************************************************************/ #include "mainwindow.h" #include "ui_mainwindow.h" #include "alkonlinequotesprofile.h" #include "alkonlinequotesprofilemanager.h" #include "alkonlinequoteswidget.h" #include #include +#include #include #include class MainWindow::Private { public: Private() : view(nullptr) , urlLine(nullptr) , quotesWidget(nullptr) { } ~Private() { delete view; delete quotesWidget; } QWebView *view; QLineEdit *urlLine; AlkOnlineQuotesWidget *quotesWidget; }; void MainWindow::slotUrlChanged(const QUrl &url) { d->urlLine->setText(url.toString()); } void MainWindow::slotEditingFinished() { QUrl url(d->urlLine->text()); QNetworkRequest request; request.setUrl(url); if (!d->quotesWidget->acceptLanguage().isEmpty()) request.setRawHeader("Accept-Language", d->quotesWidget->acceptLanguage().toLocal8Bit()); d->view->load(request); } void MainWindow::slotLanguageChanged(const QString &text) { d->quotesWidget->setAcceptLanguage(text); if (!d->urlLine->text().isEmpty()) slotEditingFinished(); } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , d(new Private) , ui(new Ui::MainWindow) { AlkOnlineQuotesProfileManager &manager = AlkOnlineQuotesProfileManager::instance(); manager.addProfile(new AlkOnlineQuotesProfile("alkimia", AlkOnlineQuotesProfile::Type::KMyMoney)); //manager.addProfile(new AlkOnlineQuotesProfile("onlinequoteseditor", AlkOnlineQuotesProfile::Type::GHNS, "alkimia-skrooge.knsrc")); //manager.addProfile(new AlkOnlineQuotesProfile("local", AlkOnlineQuotesProfile::Type::GHNS, "alkimia-skrooge-local.knsrc")); manager.addProfile(new AlkOnlineQuotesProfile("skrooge", AlkOnlineQuotesProfile::Type::GHNS, "alkimia-skrooge.knsrc")); manager.addProfile(new AlkOnlineQuotesProfile("kmymoney", AlkOnlineQuotesProfile::Type::KMyMoney)); ui->setupUi(this); QDockWidget *dockWidget = new QDockWidget(tr("Browser"), this); d->view = new QWebView; connect(d->view, SIGNAL(urlChanged(QUrl)), this, SLOT(slotUrlChanged(QUrl))); d->urlLine = new QLineEdit; connect(d->urlLine, SIGNAL(editingFinished()), this, SLOT(slotEditingFinished())); d->quotesWidget = new AlkOnlineQuotesWidget; d->quotesWidget->setView(d->view); setCentralWidget(d->quotesWidget); // setup language box QComboBox *box = new QComboBox; QList allLocales = QLocale::matchingLocales( QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); QStringList languages; foreach(const QLocale &locale, allLocales) { languages.append(locale.uiLanguages()); } languages.sort(); box->addItems(languages); d->quotesWidget->setAcceptLanguage(box->currentText()); connect(box, SIGNAL(currentIndexChanged(QString)), this, SLOT(slotLanguageChanged(QString))); // setup layouts QHBoxLayout *hLayout = new QHBoxLayout; hLayout->addWidget(d->urlLine); hLayout->addWidget(box); QVBoxLayout *layout = new QVBoxLayout; layout->addLayout(hLayout); layout->addWidget(d->view); QWidget *group = new QWidget; group->setLayout(layout); dockWidget->setWidget(group); addDockWidget(Qt::RightDockWidgetArea, dockWidget); // setup inspector d->view->page()->settings()->setAttribute(QWebSettings::DeveloperExtrasEnabled, true); QWebInspector *inspector = new QWebInspector; inspector->setPage(d->view->page()); } MainWindow::~MainWindow() { delete d; delete ui; }