annotate widgets/TipDialog.cpp @ 282:d9319859a4cf tip

(none)
author benoitrigolleau
date Fri, 31 Oct 2008 11:00:24 +0000
parents fc9323a41f5a
children
rev   line source
lbajardsilogic@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
lbajardsilogic@0 2
lbajardsilogic@0 3 /*
lbajardsilogic@0 4 Sonic Visualiser
lbajardsilogic@0 5 An audio file viewer and annotation editor.
lbajardsilogic@0 6 Centre for Digital Music, Queen Mary, University of London.
lbajardsilogic@0 7 This file copyright 2007 QMUL.
lbajardsilogic@0 8
lbajardsilogic@0 9 This program is free software; you can redistribute it and/or
lbajardsilogic@0 10 modify it under the terms of the GNU General Public License as
lbajardsilogic@0 11 published by the Free Software Foundation; either version 2 of the
lbajardsilogic@0 12 License, or (at your option) any later version. See the file
lbajardsilogic@0 13 COPYING included with this distribution for more information.
lbajardsilogic@0 14 */
lbajardsilogic@0 15
lbajardsilogic@0 16 #include "TipDialog.h"
lbajardsilogic@0 17
lbajardsilogic@0 18 #include <QLabel>
lbajardsilogic@0 19 #include <QPushButton>
lbajardsilogic@0 20 #include <QSettings>
lbajardsilogic@0 21 #include <QLabel>
lbajardsilogic@0 22 #include <QLocale>
lbajardsilogic@0 23 #include <QXmlInputSource>
lbajardsilogic@0 24 #include <QFileInfo>
lbajardsilogic@0 25 #include <QGridLayout>
lbajardsilogic@0 26 #include <QGroupBox>
lbajardsilogic@0 27 #include <QCheckBox>
lbajardsilogic@0 28
lbajardsilogic@0 29 #include <iostream>
lbajardsilogic@0 30
lbajardsilogic@0 31 TipDialog::TipDialog(QWidget *parent, Qt::WFlags flags) :
lbajardsilogic@0 32 QDialog(parent, flags),
lbajardsilogic@0 33 m_tipNumber(0),
lbajardsilogic@0 34 m_label(0),
lbajardsilogic@0 35 m_caption(tr("Tip of the Day"))
lbajardsilogic@0 36 {
lbajardsilogic@0 37 readTips();
lbajardsilogic@0 38
lbajardsilogic@0 39 QSettings settings;
lbajardsilogic@0 40 settings.beginGroup("TipOfTheDay");
lbajardsilogic@0 41
lbajardsilogic@0 42 if (!settings.value("showonstartup", true).toBool()) return;
lbajardsilogic@0 43
lbajardsilogic@0 44 m_tipNumber = settings.value("nexttip", 0).toInt();
lbajardsilogic@0 45
lbajardsilogic@0 46 setWindowTitle(m_caption);
lbajardsilogic@0 47
lbajardsilogic@0 48 QGridLayout *grid = new QGridLayout;
lbajardsilogic@0 49 setLayout(grid);
lbajardsilogic@0 50
lbajardsilogic@0 51 QGroupBox *groupBox = new QGroupBox;
lbajardsilogic@0 52 // groupBox->setTitle(m_caption);
lbajardsilogic@0 53 grid->addWidget(groupBox, 0, 0);
lbajardsilogic@0 54
lbajardsilogic@0 55 QGridLayout *subgrid = new QGridLayout;
lbajardsilogic@0 56 groupBox->setLayout(subgrid);
lbajardsilogic@0 57
lbajardsilogic@0 58 m_label = new QLabel;
lbajardsilogic@0 59 subgrid->addWidget(m_label, 0, 0);
lbajardsilogic@0 60 m_label->setWordWrap(true);
lbajardsilogic@0 61
lbajardsilogic@0 62 QHBoxLayout *hbox = new QHBoxLayout;
lbajardsilogic@0 63 grid->addLayout(hbox, 1, 0);
lbajardsilogic@0 64
lbajardsilogic@0 65 QCheckBox *show = new QCheckBox(tr("Show tip on startup"));
lbajardsilogic@0 66 hbox->addWidget(show);
lbajardsilogic@0 67
lbajardsilogic@0 68 hbox->addSpacing(20);
lbajardsilogic@0 69 hbox->addStretch(10);
lbajardsilogic@0 70
lbajardsilogic@0 71 QPushButton *prev = new QPushButton(tr("<< Previous"));
lbajardsilogic@0 72 hbox->addWidget(prev);
lbajardsilogic@0 73 connect(prev, SIGNAL(clicked()), this, SLOT(previous()));
lbajardsilogic@0 74
lbajardsilogic@0 75 QPushButton *next = new QPushButton(tr("Next >>"));
lbajardsilogic@0 76 hbox->addWidget(next);
lbajardsilogic@0 77 connect(next, SIGNAL(clicked()), this, SLOT(next()));
lbajardsilogic@0 78
lbajardsilogic@0 79 QPushButton *close = new QPushButton(tr("Close"));
lbajardsilogic@0 80 hbox->addWidget(close);
lbajardsilogic@0 81 connect(close, SIGNAL(clicked()), this, SLOT(accept()));
lbajardsilogic@0 82
lbajardsilogic@0 83 close->setDefault(true);
lbajardsilogic@0 84
lbajardsilogic@0 85 showTip();
lbajardsilogic@0 86 }
lbajardsilogic@0 87
lbajardsilogic@0 88 TipDialog::~TipDialog()
lbajardsilogic@0 89 {
lbajardsilogic@0 90 }
lbajardsilogic@0 91
lbajardsilogic@0 92 void
lbajardsilogic@0 93 TipDialog::next()
lbajardsilogic@0 94 {
lbajardsilogic@0 95 if (++m_tipNumber >= int(m_tips.size())) {
lbajardsilogic@0 96 //!!! The tips file should define where we loop back to -- the
lbajardsilogic@0 97 // first one at least is likely to be a generic welcome message
lbajardsilogic@0 98 m_tipNumber = 0;
lbajardsilogic@0 99 }
lbajardsilogic@0 100
lbajardsilogic@0 101 showTip();
lbajardsilogic@0 102 }
lbajardsilogic@0 103
lbajardsilogic@0 104 void
lbajardsilogic@0 105 TipDialog::previous()
lbajardsilogic@0 106 {
lbajardsilogic@0 107 if (--m_tipNumber < 0) {
lbajardsilogic@0 108 m_tipNumber = m_tips.size() - 1;
lbajardsilogic@0 109 }
lbajardsilogic@0 110
lbajardsilogic@0 111 showTip();
lbajardsilogic@0 112 }
lbajardsilogic@0 113
lbajardsilogic@0 114 void
lbajardsilogic@0 115 TipDialog::readTips()
lbajardsilogic@0 116 {
lbajardsilogic@0 117 std::cerr << "TipDialog::readTips" << std::endl;
lbajardsilogic@0 118
lbajardsilogic@0 119 QString language = QLocale::system().name();
lbajardsilogic@0 120 QString filename = QString(":i18n/tips_%1.xml").arg(language);
lbajardsilogic@0 121
lbajardsilogic@0 122 if (!QFileInfo(filename).exists()) {
lbajardsilogic@0 123
lbajardsilogic@0 124 QString base = language.section('_', 0, 0);
lbajardsilogic@0 125 filename = QString(":i18n/tips_%1.xml").arg(base);
lbajardsilogic@0 126
lbajardsilogic@0 127 if (!QFileInfo(filename).exists()) {
lbajardsilogic@0 128
lbajardsilogic@0 129 filename = QString(":i18n/tips.xml");
lbajardsilogic@0 130
lbajardsilogic@0 131 if (!QFileInfo(filename).exists()) return;
lbajardsilogic@0 132 }
lbajardsilogic@0 133 }
lbajardsilogic@0 134
lbajardsilogic@0 135 QFile file(filename);
lbajardsilogic@0 136
lbajardsilogic@0 137 std::cerr << "TipDialog::readTips from " << filename.toStdString() << std::endl;
lbajardsilogic@0 138
lbajardsilogic@0 139 QXmlInputSource source(&file);
lbajardsilogic@0 140
lbajardsilogic@0 141 TipFileParser parser(this);
lbajardsilogic@0 142 parser.parse(source);
lbajardsilogic@0 143 }
lbajardsilogic@0 144
lbajardsilogic@0 145 void
lbajardsilogic@0 146 TipDialog::showTip()
lbajardsilogic@0 147 {
lbajardsilogic@0 148 if (m_tipNumber < int(m_tips.size())) {
lbajardsilogic@0 149 std::cerr << "Tip " << m_tipNumber << " is: " << m_tips[m_tipNumber].toStdString() << std::endl;
lbajardsilogic@0 150 m_label->setText(m_tips[m_tipNumber]);
lbajardsilogic@0 151 } else {
lbajardsilogic@0 152 accept();
lbajardsilogic@0 153 }
lbajardsilogic@0 154
lbajardsilogic@0 155 int tn = m_tipNumber;
lbajardsilogic@0 156 if (++tn >= int(m_tips.size())) tn = 0; //!!! as above
lbajardsilogic@0 157
lbajardsilogic@0 158 QSettings settings;
lbajardsilogic@0 159 settings.beginGroup("TipOfTheDay");
lbajardsilogic@0 160 settings.setValue("nexttip", tn);
lbajardsilogic@0 161 }
lbajardsilogic@0 162
lbajardsilogic@0 163 TipDialog::TipFileParser::TipFileParser(TipDialog *dialog) :
lbajardsilogic@0 164 m_dialog(dialog),
lbajardsilogic@0 165 m_inTip(false),
lbajardsilogic@0 166 m_inText(false),
lbajardsilogic@0 167 m_inHtml(false)
lbajardsilogic@0 168 {
lbajardsilogic@0 169 }
lbajardsilogic@0 170
lbajardsilogic@0 171 TipDialog::TipFileParser::~TipFileParser()
lbajardsilogic@0 172 {
lbajardsilogic@0 173 }
lbajardsilogic@0 174
lbajardsilogic@0 175 void
lbajardsilogic@0 176 TipDialog::TipFileParser::parse(QXmlInputSource &source)
lbajardsilogic@0 177 {
lbajardsilogic@0 178 QXmlSimpleReader reader;
lbajardsilogic@0 179 reader.setContentHandler(this);
lbajardsilogic@0 180 reader.setErrorHandler(this);
lbajardsilogic@0 181 reader.parse(source);
lbajardsilogic@0 182 }
lbajardsilogic@0 183
lbajardsilogic@0 184 bool
lbajardsilogic@0 185 TipDialog::TipFileParser::startElement(const QString &, const QString &,
lbajardsilogic@0 186 const QString &qName,
lbajardsilogic@0 187 const QXmlAttributes &attributes)
lbajardsilogic@0 188 {
lbajardsilogic@0 189 QString name = qName.toLower();
lbajardsilogic@0 190
lbajardsilogic@0 191 std::cerr << "TipFileParser::startElement(" << name.toStdString() << ")" << std::endl;
lbajardsilogic@0 192
lbajardsilogic@0 193 if (name == "tips") {
lbajardsilogic@0 194 QString caption = attributes.value("caption");
lbajardsilogic@0 195 std::cerr << "TipFileParser::caption = " << caption.toStdString() << std::endl;
lbajardsilogic@0 196 if (caption != "") m_dialog->m_caption = caption;
lbajardsilogic@0 197 } else if (name == "tip") {
lbajardsilogic@0 198 if (m_inTip) {
lbajardsilogic@0 199 std::cerr << "WARNING: TipFileParser: nested <tip> elements" << std::endl;
lbajardsilogic@0 200 }
lbajardsilogic@0 201 m_inTip = true;
lbajardsilogic@0 202 } else if (name == "text") {
lbajardsilogic@0 203 if (m_inTip) {
lbajardsilogic@0 204 m_inText = true;
lbajardsilogic@0 205 std::cerr << "TipFileParser: adding new tip" << std::endl;
lbajardsilogic@0 206 m_dialog->m_tips.push_back("");
lbajardsilogic@0 207 } else {
lbajardsilogic@0 208 std::cerr << "WARNING: TipFileParser: <text> outside <tip> element" << std::endl;
lbajardsilogic@0 209 }
lbajardsilogic@0 210 } else if (name == "html") {
lbajardsilogic@0 211 if (m_inTip) {
lbajardsilogic@0 212 m_inHtml = true;
lbajardsilogic@0 213 std::cerr << "TipFileParser: adding new tip" << std::endl;
lbajardsilogic@0 214 m_dialog->m_tips.push_back("");
lbajardsilogic@0 215 } else {
lbajardsilogic@0 216 std::cerr << "WARNING: TipFileParser: <html> outside <tip> element" << std::endl;
lbajardsilogic@0 217 }
lbajardsilogic@0 218 } else if (m_inHtml) {
lbajardsilogic@0 219 m_dialog->m_tips[m_dialog->m_tips.size()-1] += "<" + qName;
lbajardsilogic@0 220 for (int i = 0; i < attributes.count(); ++i) {
lbajardsilogic@0 221 m_dialog->m_tips[m_dialog->m_tips.size()-1] +=
lbajardsilogic@0 222 " " + attributes.qName(i) + "=\"" + attributes.value(i) + "\"";
lbajardsilogic@0 223 }
lbajardsilogic@0 224 m_dialog->m_tips[m_dialog->m_tips.size()-1] += ">";
lbajardsilogic@0 225 }
lbajardsilogic@0 226
lbajardsilogic@0 227 std::cerr << "TipFileParser::startElement done" << std::endl;
lbajardsilogic@0 228 return true;
lbajardsilogic@0 229 }
lbajardsilogic@0 230
lbajardsilogic@0 231 bool
lbajardsilogic@0 232 TipDialog::TipFileParser::endElement(const QString &, const QString &,
lbajardsilogic@0 233 const QString &qName)
lbajardsilogic@0 234 {
lbajardsilogic@0 235 QString name = qName.toLower();
lbajardsilogic@0 236
lbajardsilogic@0 237 if (name == "text") {
lbajardsilogic@0 238 if (!m_inText) {
lbajardsilogic@0 239 std::cerr << "WARNING: TipFileParser: </text> without <text>" << std::endl;
lbajardsilogic@0 240 }
lbajardsilogic@0 241 m_inText = false;
lbajardsilogic@0 242 } else if (name == "html") {
lbajardsilogic@0 243 if (!m_inHtml) {
lbajardsilogic@0 244 std::cerr << "WARNING: TipFileParser: </html> without <html>" << std::endl;
lbajardsilogic@0 245 }
lbajardsilogic@0 246 m_inHtml = false;
lbajardsilogic@0 247 } else if (name == "tip") {
lbajardsilogic@0 248 if (m_inText) {
lbajardsilogic@0 249 std::cerr << "WARNING: TipFileParser: <text> without </text>" << std::endl;
lbajardsilogic@0 250 } else if (m_inHtml) {
lbajardsilogic@0 251 std::cerr << "WARNING: TipFileParser: <html> without </html>" << std::endl;
lbajardsilogic@0 252 } else if (!m_inTip) {
lbajardsilogic@0 253 std::cerr << "WARNING: TipFileParser: </tip> without <tip>" << std::endl;
lbajardsilogic@0 254 }
lbajardsilogic@0 255 m_inTip = false;
lbajardsilogic@0 256 } else if (m_inHtml) {
lbajardsilogic@0 257 m_dialog->m_tips[m_dialog->m_tips.size()-1] += "</" + qName + ">";
lbajardsilogic@0 258 }
lbajardsilogic@0 259
lbajardsilogic@0 260 return true;
lbajardsilogic@0 261 }
lbajardsilogic@0 262
lbajardsilogic@0 263 bool
lbajardsilogic@0 264 TipDialog::TipFileParser::characters(const QString &text)
lbajardsilogic@0 265 {
lbajardsilogic@0 266 std::cerr << "TipFileParser::characters(" << text.toStdString() << ")" << std::endl;
lbajardsilogic@0 267
lbajardsilogic@0 268 if (m_inText || m_inHtml) {
lbajardsilogic@0 269 m_dialog->m_tips[m_dialog->m_tips.size()-1] += text;
lbajardsilogic@0 270 }
lbajardsilogic@0 271
lbajardsilogic@0 272 return true;
lbajardsilogic@0 273 }
lbajardsilogic@0 274
lbajardsilogic@0 275 bool
lbajardsilogic@0 276 TipDialog::TipFileParser::error(const QXmlParseException &exception)
lbajardsilogic@0 277 {
lbajardsilogic@0 278 QString errorString =
lbajardsilogic@0 279 QString("ERROR: TipFileParser: %1 at line %2, column %3")
lbajardsilogic@0 280 .arg(exception.message())
lbajardsilogic@0 281 .arg(exception.lineNumber())
lbajardsilogic@0 282 .arg(exception.columnNumber());
lbajardsilogic@0 283 std::cerr << errorString.toStdString() << std::endl;
lbajardsilogic@0 284 return QXmlDefaultHandler::error(exception);
lbajardsilogic@0 285 }
lbajardsilogic@0 286
lbajardsilogic@0 287 bool
lbajardsilogic@0 288 TipDialog::TipFileParser::fatalError(const QXmlParseException &exception)
lbajardsilogic@0 289 {
lbajardsilogic@0 290 QString errorString =
lbajardsilogic@0 291 QString("FATAL ERROR: TipFileParser: %1 at line %2, column %3")
lbajardsilogic@0 292 .arg(exception.message())
lbajardsilogic@0 293 .arg(exception.lineNumber())
lbajardsilogic@0 294 .arg(exception.columnNumber());
lbajardsilogic@0 295 std::cerr << errorString.toStdString() << std::endl;
lbajardsilogic@0 296 return QXmlDefaultHandler::fatalError(exception);
lbajardsilogic@0 297 }