1 /*
2 For general Scribus (>=1.3.2) copyright and licensing information please refer
3 to the COPYING file provided with the program. Following this notice may exist
4 a copyright and/or license notice that predates the release of Scribus 1.3.2
5 for which a new license (GPL+exception) is in place.
6 */
7 #include "pageselector.h"
8
9 #include <QByteArray>
10 #include <QComboBox>
11 #include <QDebug>
12 #include <QEvent>
13 #include <QHBoxLayout>
14 #include <QLabel>
15 #include <QLineEdit>
16 #include <QPixmap>
17 #include <QPushButton>
18 #include <QRegExp>
19 #include <QSignalBlocker>
20 #include <QToolTip>
21 #include <QValidator>
22
23 #include "scpaths.h"
24 #include "scribusapp.h"
25 #include "iconmanager.h"
26 #include "util.h"
27
PageSelector(QWidget * parent,int maximumPage)28 PageSelector::PageSelector( QWidget* parent, int maximumPage ) : QWidget( parent, Qt::WindowFlags() )
29 {
30 pageCountString = "%1";
31 m_lastPage = maximumPage;
32 pageSelectorLayout = new QHBoxLayout( this );
33 pageSelectorLayout->setContentsMargins(0, 0, 0, 0);
34 pageSelectorLayout->setSpacing(1);
35
36 startButton = new QPushButton( this );
37 backButton = new QPushButton( this );
38 forwardButton = new QPushButton( this );
39 lastButton = new QPushButton( this );
40
41 startButton->setDefault( false );
42 backButton->setDefault( false );
43 forwardButton->setDefault( false );
44 lastButton->setDefault( false );
45
46 startButton->setAutoDefault( false );
47 backButton->setAutoDefault( false );
48 forwardButton->setAutoDefault( false );
49 lastButton->setAutoDefault( false );
50
51 startButton->setIcon(IconManager::instance().loadIcon("16/go-first.png"));
52 backButton->setIcon(IconManager::instance().loadIcon("16/go-previous.png"));
53 forwardButton->setIcon(IconManager::instance().loadIcon("16/go-next.png"));
54 lastButton->setIcon(IconManager::instance().loadIcon("16/go-last.png"));
55
56 startButton->setFocusPolicy(Qt::NoFocus);
57 backButton->setFocusPolicy(Qt::NoFocus);
58 forwardButton->setFocusPolicy(Qt::NoFocus);
59 lastButton->setFocusPolicy(Qt::NoFocus);
60
61 forwardButton->setAutoRepeat(true);
62 backButton->setAutoRepeat(true);
63
64 m_validator = new QIntValidator(1, m_lastPage, this);
65 m_pageCombo = new QComboBox( this );
66 m_pageCombo->setEditable(true);
67 m_pageCombo->setDuplicatesEnabled( false );
68 m_pageCombo->setInsertPolicy(QComboBox::NoInsert);
69 m_pageCombo->lineEdit()->setAlignment(Qt::AlignHCenter);
70 for (int i = 0; i < m_lastPage; ++i)
71 m_pageCombo->addItem(QString::number(i+1));
72 m_pageCombo->setValidator(m_validator);
73 m_pageCombo->setMinimumSize(fontMetrics().horizontalAdvance( "9999" )+20, 20);
74 m_pageCombo->setFocusPolicy(Qt::ClickFocus);
75 m_pageCombo->setObjectName("pageCombo");
76
77 pageCountLabel = new QLabel(pageCountString.arg(m_lastPage), this);
78
79 forwardButton->setEnabled(true);
80 lastButton->setEnabled(true);
81 backButton->setEnabled(false);
82 startButton->setEnabled(false);
83 if (m_currentPage == m_lastPage)
84 {
85 forwardButton->setEnabled(false);
86 lastButton->setEnabled(false);
87 }
88
89 iconSetChange();
90
91 pageSelectorLayout->addWidget( startButton );
92 pageSelectorLayout->addWidget( backButton );
93 pageSelectorLayout->addWidget( m_pageCombo );
94 pageSelectorLayout->addWidget( pageCountLabel );
95 pageSelectorLayout->addWidget( forwardButton );
96 pageSelectorLayout->addWidget( lastButton );
97
98 languageChange();
99
100 // signals and slots connections
101 connect(ScQApp, SIGNAL(iconSetChanged()), this, SLOT(iconSetChange()));
102
103 connect( m_pageCombo, SIGNAL( activated(int) ), this, SLOT( gotoPage(int) ) );
104 connect( backButton, SIGNAL( clicked() ), this, SLOT( goBackward()) );
105 connect( startButton, SIGNAL( clicked() ), this, SLOT( goToStart() ) );
106 connect( forwardButton, SIGNAL( clicked() ), this, SLOT( goForward() ) );
107 connect( lastButton, SIGNAL( clicked() ), this, SLOT( goToEnd() ) );
108 }
109
hasFocus()110 bool PageSelector::hasFocus()
111 {
112 return m_pageCombo->hasFocus();
113 }
114
clearFocus()115 void PageSelector::clearFocus()
116 {
117 m_pageCombo->clearFocus();
118 }
119
focusPolicy(Qt::FocusPolicy policy)120 void PageSelector::focusPolicy(Qt::FocusPolicy policy)
121 {
122 m_pageCombo->setFocusPolicy(policy);
123 }
124
setFont(const QFont & font)125 void PageSelector::setFont(const QFont& font)
126 {
127 pageCountLabel->setFont(font);
128 QWidget::setFont(font);
129 }
130
getCurrentPage()131 int PageSelector::getCurrentPage()
132 {
133 return m_currentPage;
134 }
135
gotoPage(int i)136 void PageSelector::gotoPage(int i)
137 {
138 clearFocus();
139 setGUIForPage(i);
140 emit pageChanged(i + 1);
141 }
142
setGUIForPage(int i)143 void PageSelector::setGUIForPage(int i)
144 {
145 QSignalBlocker signalBlocker(m_pageCombo);
146 m_pageCombo->setCurrentIndex(i);
147 m_currentPage = i + 1;
148 setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
149 backButton->setEnabled(i != 0);
150 startButton->setEnabled(i != 0);
151 forwardButton->setEnabled(i != m_lastPage - 1);
152 lastButton->setEnabled(i != m_lastPage - 1);
153 }
154
setMaximum(int i)155 void PageSelector::setMaximum(int i)
156 {
157 QSignalBlocker signalBlocker(m_pageCombo);
158 m_pageCombo->clear();
159 m_lastPage = i;
160 m_validator->setRange(1, m_lastPage);
161 for (int b = 0; b < m_lastPage; ++b)
162 {
163 m_pageCombo->addItem(QString::number(b + 1));
164 }
165 setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
166 pageCountLabel->setText(pageCountString.arg(m_lastPage));
167 }
168
goToStart()169 void PageSelector::goToStart()
170 {
171 if (m_currentPage == 1)
172 return;
173 gotoPage(0);
174 }
175
goToEnd()176 void PageSelector::goToEnd()
177 {
178 if (m_currentPage == m_lastPage)
179 return;
180 gotoPage(m_lastPage - 1);
181 }
182
goBackward()183 void PageSelector::goBackward()
184 {
185 m_currentPage--;
186 if (m_currentPage < 1)
187 m_currentPage = 1;
188 gotoPage(m_currentPage - 1);
189 }
190
goForward()191 void PageSelector::goForward()
192 {
193 m_currentPage++;
194 if (m_currentPage > m_lastPage)
195 m_currentPage = m_lastPage;
196 gotoPage(m_currentPage - 1);
197 }
198
changeEvent(QEvent * e)199 void PageSelector::changeEvent(QEvent *e)
200 {
201 if (e->type() == QEvent::LanguageChange)
202 languageChange();
203 else
204 QWidget::changeEvent(e);
205 }
206
iconSetChange()207 void PageSelector::iconSetChange()
208 {
209 QByteArray stylesheet;
210 if (loadRawText(ScPaths::instance().libDir() + "scribus.css", stylesheet))
211 {
212 QString downArrow(IconManager::instance().pathForIcon("16/go-down.png"));
213 QByteArray da;
214 da.append(downArrow.toUtf8());
215 stylesheet.replace("___downArrow___", da);
216 setStyleSheet(QString(stylesheet));
217 }
218 }
219
languageChange()220 void PageSelector::languageChange()
221 {
222 startButton->setToolTip( tr("Go to the first page") );
223 backButton->setToolTip( tr("Go to the previous page") );
224 forwardButton->setToolTip( tr("Go to the next page") );
225 lastButton->setToolTip( tr("Go to the last page") );
226 m_pageCombo->setToolTip( tr("Select the current page") );
227 pageCountString = tr(" of %1", "number of pages in document");
228 pageCountLabel->setText(pageCountString.arg(m_lastPage));
229 setCurrentComboItem(m_pageCombo, QString::number(m_currentPage));
230 }
231
232