File indexing completed on 2024-05-12 04:06:27

0001 /*
0002     SPDX-FileCopyrightText: 2009 Stefan Majewsky <majewsky@gmx.net>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #include "puzzletablewidget.h"
0008 #include "loadingwidget.h"
0009 #include "../engine/scene.h"
0010 #include "../engine/view.h"
0011 #include "../engine/zoomwidget.h"
0012 #include "settings.h"
0013 #include "palapeli_debug.h"
0014 
0015 #include <QToolBar>
0016 #include <QProgressBar>
0017 #include <QStackedWidget>
0018 #include <KLocalizedString>
0019 #include <QHBoxLayout>
0020 #include <QVBoxLayout>
0021 
0022 //BEGIN Palapeli::TextProgressBar
0023 
0024 namespace Palapeli
0025 {
0026     class TextProgressBar : public QProgressBar
0027     {
0028         public:
0029             TextProgressBar(QWidget* parent = nullptr) : QProgressBar(parent) {}
0030 
0031             QString text() const override { return m_text; }
0032             void setText(const QString& text) { m_text = text; update(); }
0033         private:
0034             QString m_text;
0035     };
0036 }
0037 
0038 //END Palapeli::TextProgressBar
0039 
0040 Palapeli::PuzzleTableWidget::PuzzleTableWidget()
0041     : m_zoomAdjustable(true)
0042     , m_stack(new QStackedWidget)
0043     , m_loadingWidget(new Palapeli::LoadingWidget)
0044     , m_view(new Palapeli::View)
0045     , m_progressBar(new Palapeli::TextProgressBar(this))
0046     , m_zoomWidget(new Palapeli::ZoomWidget(this))
0047 {
0048     //setup progress bar
0049     m_progressBar->setText(i18n("No puzzle loaded"));
0050     //setup zoom widget
0051     m_zoomWidget->setLevel((View::MaximumZoomLevel+View::MinimumZoomLevel)/2);
0052     connect(m_zoomWidget, &Palapeli::ZoomWidget::levelChanged, m_view, &Palapeli::View::zoomSliderInput);
0053     connect(m_zoomWidget, &Palapeli::ZoomWidget::zoomInRequest, m_view, &Palapeli::View::zoomIn);
0054     connect(m_zoomWidget, &Palapeli::ZoomWidget::zoomOutRequest, m_view, &Palapeli::View::zoomOut);
0055     connect(m_view, &Palapeli::View::zoomLevelChanged, m_zoomWidget, &Palapeli::ZoomWidget::setLevel);
0056     connect(m_view, &Palapeli::View::zoomAdjustable, this, &PuzzleTableWidget::setZoomAdjustable);
0057     connect(m_zoomWidget, &ZoomWidget::constrainedChanged, m_view->scene(), &Scene::setConstrained);
0058     connect(m_view->scene(), &Scene::constrainedChanged, m_zoomWidget, &ZoomWidget::setConstrained);
0059     //setup widget stack
0060     // /* IDW test. Disable LOADING WIDGET.
0061     m_stack->addWidget(m_loadingWidget);
0062     // */
0063     m_stack->addWidget(m_view);
0064     // /* IDW test. Disable LOADING WIDGET.
0065     m_stack->setCurrentWidget(m_loadingWidget);
0066     // */
0067     m_stack->setCurrentWidget(m_view);
0068 
0069     //setup layout
0070     // IDW TODO - Make the background look like a toolbar? Below succeeds,
0071     //            but nothing gets painted on it. Try QToolBar::addWidget().
0072     // QToolBar* pseudoStatusBar = new QToolBar(this);
0073     QWidget* pseudoStatusBar = new QWidget(this);
0074     QHBoxLayout* barLayout = new QHBoxLayout(pseudoStatusBar);
0075     barLayout->addWidget(m_progressBar, 3);     // Need not be long.
0076     barLayout->addWidget(m_zoomWidget, 2);      // Must hold 200 steps.
0077     barLayout->setContentsMargins(10, 0, 10, 0);    // Margins at ends.
0078 
0079     QVBoxLayout* mainLayout = new QVBoxLayout(this);
0080     mainLayout->setContentsMargins(0, 0, 0, 0); // No margins.
0081     mainLayout->setSpacing(0);          // No wasted gray space.
0082     mainLayout->addWidget(m_stack, 30);     // Max puzzle height.
0083     mainLayout->addWidget(pseudoStatusBar, 1);  // Min bar height.
0084 }
0085 
0086 Palapeli::View* Palapeli::PuzzleTableWidget::view() const
0087 {
0088     return m_view;
0089 }
0090 
0091 void Palapeli::PuzzleTableWidget::showStatusBar(bool visible)
0092 {
0093     //apply setting
0094     m_progressBar->setVisible(visible);
0095     m_zoomWidget->setVisible(visible);
0096     //save setting
0097     Settings::setShowStatusBar(visible);
0098     Settings::self()->save();
0099 }
0100 
0101 void Palapeli::PuzzleTableWidget::reportProgress(int pieceCount, int partCount)
0102 {
0103     qCDebug(PALAPELI_LOG) << "PuzzleTableWidget::reportProgress(" << pieceCount << partCount;
0104     m_zoomWidget->setEnabled(pieceCount > 0); //zoom does not work reliably when no puzzle is loaded
0105     if (m_progressBar->minimum() != 0)
0106         m_progressBar->setMinimum(0);
0107     if (m_progressBar->maximum() != pieceCount - 1)
0108         m_progressBar->setMaximum(pieceCount - 1);
0109     if (m_progressBar->minimum() == m_progressBar->maximum())
0110         m_progressBar->setMaximum(m_progressBar->minimum());
0111     else
0112     {
0113         const int value = pieceCount - partCount;
0114         if (m_progressBar->value() != value)
0115         {
0116             m_progressBar->setValue(value);
0117             if (partCount == 1)
0118                 m_progressBar->setText(i18n("You finished the puzzle."));
0119             else
0120             {
0121                 int percentFinished = qreal(value) / qreal(pieceCount - 1) * 100;
0122                 m_progressBar->setText(i18nc("Progress display", "%1% finished", percentFinished));
0123             }
0124         }
0125     }
0126     if (pieceCount > 0)
0127         m_stack->setCurrentWidget(m_view);
0128     else
0129         // ; /* // IDW test. Disable LOADING WIDGET.
0130         m_stack->setCurrentWidget(m_loadingWidget);
0131         // */
0132 }
0133 
0134 void Palapeli::PuzzleTableWidget::setZoomAdjustable(bool adjustable)
0135 {
0136     m_zoomAdjustable = adjustable;
0137     m_zoomWidget->setVisible(Settings::showStatusBar() && adjustable);
0138 }
0139 
0140 #include "moc_puzzletablewidget.cpp"