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"