From f3bfe3c9a80574f10c7a16b2dab8a130ad32ead1 Mon Sep 17 00:00:00 2001 From: Alexander Borsuk Date: Tue, 5 Dec 2023 10:02:23 +0100 Subject: [PATCH] [desktop] Show wikipedia articles in a separate dialog Signed-off-by: Alexander Borsuk --- qt/place_page_dialog.cpp | 50 +++++++++++++++++++----------------- qt/qt_common/CMakeLists.txt | 2 ++ qt/qt_common/text_dialog.cpp | 36 ++++++++++++++++++++++++++ qt/qt_common/text_dialog.hpp | 14 ++++++++++ 4 files changed, 79 insertions(+), 23 deletions(-) create mode 100644 qt/qt_common/text_dialog.cpp create mode 100644 qt/qt_common/text_dialog.hpp diff --git a/qt/place_page_dialog.cpp b/qt/place_page_dialog.cpp index efa6d764ce..ef5afd1e9b 100644 --- a/qt/place_page_dialog.cpp +++ b/qt/place_page_dialog.cpp @@ -1,16 +1,16 @@ #include "qt/place_page_dialog.hpp" -#include "map/place_page_info.hpp" +#include "qt/qt_common/text_dialog.hpp" -#include +#include "map/place_page_info.hpp" #include #include #include #include #include -#include +#include PlacePageDialog::PlacePageDialog(QWidget * parent, place_page::Info const & info, search::ReverseGeocoder::Address const & address) @@ -41,7 +41,8 @@ PlacePageDialog::PlacePageDialog(QWidget * parent, place_page::Info const & info addEntry("CountryId", info.GetCountryId()); - if (auto const & title = info.GetTitle(); !title.empty()) + auto const & title = info.GetTitle(); + if (!title.empty()) addEntry("Title", title); if (auto const & subTitle = info.GetSubtitle(); !subTitle.empty()) @@ -82,13 +83,28 @@ PlacePageDialog::PlacePageDialog(QWidget * parent, place_page::Info const & info if (auto cuisines = info.FormatCuisines(); !cuisines.empty()) addEntry(DebugPrint(PropID::FMD_CUISINE), cuisines); + QDialogButtonBox * dbb = new QDialogButtonBox(); + QPushButton * closeButton = new QPushButton("Close"); + closeButton->setDefault(true); + connect(closeButton, &QAbstractButton::clicked, this, &PlacePageDialog::OnClose); + dbb->addButton(closeButton, QDialogButtonBox::RejectRole); + + if (info.ShouldShowEditPlace()) + { + QPushButton * editButton = new QPushButton("Edit Place"); + connect(editButton, &QAbstractButton::clicked, this, &PlacePageDialog::OnEdit); + dbb->addButton(editButton, QDialogButtonBox::AcceptRole); + } + if (auto const & descr = info.GetWikiDescription(); !descr.empty()) { - QLabel * value = addEntry("Wiki Description", {}); - auto const qWikiDescription = QString::fromStdString(descr); - QString clippedText = QFontMetrics{value->font()}.elidedText(qWikiDescription, Qt::ElideRight, value->width()); - value->setText(clippedText); - value->setToolTip(qWikiDescription); + QPushButton * wikiButton = new QPushButton("Wiki Description"); + connect(wikiButton, &QAbstractButton::clicked, this, [this, descr, title]() + { + auto textDialog = TextDialog(this, QString::fromStdString(descr), QString::fromStdString("Wikipedia: " + title)); + textDialog.exec(); + }); + dbb->addButton(wikiButton, QDialogButtonBox::ActionRole); } info.ForEachMetadataReadable([&addEntry](PropID id, std::string const & value) @@ -114,23 +130,11 @@ PlacePageDialog::PlacePageDialog(QWidget * parent, place_page::Info const & info addEntry(DebugPrint(id), value, isLink); }); - QDialogButtonBox * dbb = new QDialogButtonBox(); - QPushButton * closeButton = new QPushButton("Close"); - closeButton->setDefault(true); - connect(closeButton, &QAbstractButton::clicked, this, &PlacePageDialog::OnClose); - dbb->addButton(closeButton, QDialogButtonBox::RejectRole); - - if (info.ShouldShowEditPlace()) - { - QPushButton * editButton = new QPushButton("Edit Place"); - connect(editButton, &QAbstractButton::clicked, this, &PlacePageDialog::OnEdit); - dbb->addButton(editButton, QDialogButtonBox::AcceptRole); - } grid->addWidget(dbb); setLayout(grid); - auto const title = std::string("Place Page") + (info.IsBookmark() ? " (bookmarked)" : ""); - setWindowTitle(title.c_str()); + auto const ppTitle = std::string("Place Page") + (info.IsBookmark() ? " (bookmarked)" : ""); + setWindowTitle(ppTitle.c_str()); } void PlacePageDialog::OnClose() { reject(); } diff --git a/qt/qt_common/CMakeLists.txt b/qt/qt_common/CMakeLists.txt index 6391244e87..2f975c35f5 100644 --- a/qt/qt_common/CMakeLists.txt +++ b/qt/qt_common/CMakeLists.txt @@ -19,6 +19,8 @@ set(SRC scale_slider.hpp spinner.cpp spinner.hpp + text_dialog.cpp + text_dialog.hpp ) omim_add_library(${PROJECT_NAME} ${SRC} ${RESOURCES}) diff --git a/qt/qt_common/text_dialog.cpp b/qt/qt_common/text_dialog.cpp new file mode 100644 index 0000000000..a59035fa63 --- /dev/null +++ b/qt/qt_common/text_dialog.cpp @@ -0,0 +1,36 @@ +#include "qt/qt_common/text_dialog.hpp" + +#include +#include +#include +#include + + +TextDialog::TextDialog(QWidget * parent, QString const & htmlOrText, QString const & title) + : QDialog(parent) +{ + auto * textEdit = new QTextEdit(this); + textEdit->setReadOnly(true); + textEdit->setHtml(htmlOrText); + + auto * closeButton = new QPushButton("Close"); + closeButton->setDefault(true); + connect(closeButton, &QAbstractButton::clicked, this, &TextDialog::OnClose); + + auto * dbb = new QDialogButtonBox(); + dbb->addButton(closeButton, QDialogButtonBox::RejectRole); + + auto * vBoxLayout = new QVBoxLayout(this); + vBoxLayout->addWidget(textEdit); + vBoxLayout->addWidget(dbb); + setLayout(vBoxLayout); + + setWindowTitle(title); + + if (htmlOrText.size() > 10000) + setWindowState(Qt::WindowMaximized); + else + resize(parent->size()); +} + +void TextDialog::OnClose() { reject(); } diff --git a/qt/qt_common/text_dialog.hpp b/qt/qt_common/text_dialog.hpp new file mode 100644 index 0000000000..2f841bc2f5 --- /dev/null +++ b/qt/qt_common/text_dialog.hpp @@ -0,0 +1,14 @@ +#pragma once + +#include + +/// A reusable dialog that shows text or HTML. +class TextDialog : public QDialog +{ + Q_OBJECT +public: + TextDialog(QWidget * parent, QString const & htmlOrText, QString const & title = ""); + +private slots: + void OnClose(); +};