/*************************************************************************** * Copyright (C) 2004-2005 by Albert Astals Cid * * tsdgeos@terra.es * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * ***************************************************************************/ #include #include #include #include #include #include #include "map.h" #include "mapasker.h" #include "mapwidget.h" mapAsker::mapAsker(TQWidget *parent, KGmap *m, TQWidget *w, bool asker, uint count) : askWidget(parent, m, w, count, asker), p_popupManager(this), p_asker(asker), p_firstShow(true) { TQGridLayout *lay = new TQGridLayout(this, 2, 2); p_mapWidget = new mapWidget(this); lay -> addWidget(p_mapWidget, 0, 0); p_hsb = new TQScrollBar(Qt::Horizontal, this); lay -> addWidget(p_hsb, 1, 0); p_vsb = new TQScrollBar(Qt::Vertical, this); lay -> addWidget(p_vsb, 0, 1); lay -> setRowStretch(2, 1); lay -> setColStretch(2, 1); p_shouldClearPopup = false; connect(p_mapWidget, TQT_SIGNAL(clicked(TQRgb, const TQPoint&)), this, TQT_SLOT(handleMapClick(TQRgb, const TQPoint&))); connect(p_mapWidget, TQT_SIGNAL(setMoveActionChecked(bool)), this, TQT_SIGNAL(setMoveActionChecked(bool))); connect(p_mapWidget, TQT_SIGNAL(setZoomActionChecked(bool)), this, TQT_SIGNAL(setZoomActionChecked(bool))); connect(p_mapWidget, TQT_SIGNAL(setMoveActionEnabled(bool)), this, TQT_SIGNAL(setMoveActionEnabled(bool))); connect(p_mapWidget, TQT_SIGNAL(setMoveActionEnabled(bool)), this, TQT_SLOT(showScrollBars(bool))); connect(p_mapWidget, TQT_SIGNAL(updatePosition(int, int)), this, TQT_SLOT(setScrollBarsPosition(int, int))); connect(p_mapWidget, TQT_SIGNAL(updateVisibleSize(int, int)), this, TQT_SLOT(setScrollBarsVisibleSize(int, int))); connect(p_mapWidget, TQT_SIGNAL(updateMaximumSize(int, int)), this, TQT_SLOT(setScrollBarsMaximumSize(int, int))); connect(p_hsb, TQT_SIGNAL(valueChanged(int)), p_mapWidget, TQT_SLOT(updateHPosition(int))); connect(p_vsb, TQT_SIGNAL(valueChanged(int)), p_mapWidget, TQT_SLOT(updateVPosition(int))); if (asker) { TQBoxLayout *vbl = dynamic_cast(w -> layout()); p_next = new TQLabel(w); p_next -> setAlignment(AlignTop | AlignHCenter); p_fill = new TQWidget(w); p_fill -> show(); vbl -> setStretchFactor(p_fill, 1); nextQuestion(); } else { p_next = 0; p_fill = 0; } } mapAsker::~mapAsker() { delete p_next; delete p_fill; } bool mapAsker::isAsker() const { return p_answers; } void mapAsker::mousePressEvent(TQMouseEvent*) { p_popupManager.clear(); } void mapAsker::setMovement(bool b) { p_mapWidget -> setMapMove(b); p_popupManager.clear(); } void mapAsker::setZoom(bool b) { p_mapWidget -> setMapZoom(b); p_popupManager.clear(); } void mapAsker::setOriginalZoom() { p_mapWidget -> setOriginalImage(); p_popupManager.clear(); } void mapAsker::handleMapClick(TQRgb c, const TQPoint &p) { TQString aux, cap; aux = p_map -> getWhatIs(c, !p_asker); if (aux == "nothing") KMessageBox::error(this, i18n("You have found a bug in a map. Please contact the author and tell the %1 map has nothing associated to color %2,%3,%4.").arg(p_map -> getFile()).arg(tqRed(c)).arg(tqGreen(c)).arg(tqBlue(c))); else if (p_shouldClearPopup) { p_popupManager.clear(); p_shouldClearPopup = false; } else if (!p_asker) { TQString flagFile; cap = p_map -> getDivisionCapital(aux); if (!cap.isEmpty()) { flagFile = p_map -> getDivisionFlagFile(aux); cap = i18n(p_map -> getFileName().utf8(), cap.utf8()); } aux = i18n(p_map -> getFileName().utf8(), aux.utf8()); if (!flagFile.isEmpty()) p_popupManager.show(aux, cap, p, flagFile); else if (!cap.isEmpty()) p_popupManager.show(aux, cap, p); else p_popupManager.show(aux, p); } else if (!aux.isEmpty()) { p_currentAnswer.setAnswer(TQColor(c)); questionAnswered(aux == lastDivisionAsked()); nextQuestion(); } } void mapAsker::showScrollBars(bool b) { if (b) { p_hsb -> show(); p_vsb -> show(); } else { p_hsb -> hide(); p_vsb -> hide(); } } void mapAsker::setScrollBarsPosition(int x, int y) { p_hsb -> setValue(x); p_vsb -> setValue(y); } void mapAsker::setScrollBarsVisibleSize(int w, int h) { p_hsb -> setMaxValue(p_hsbms - w); p_hsb -> setPageStep(w); p_vsb -> setMaxValue(p_vsbms - h); p_vsb -> setPageStep(h); } void mapAsker::setScrollBarsMaximumSize(int w, int h) { p_hsbms = w; p_vsbms = h; } void mapAsker::nextQuestionHook(const TQString &division) { TQString sw = i18n("There are two ways of dealing with the translation of \"Please click on: %1\". The first option simply replaces %1 with the translated name of the relevant region/city. If the grammar of your language allows this, choose this option by setting the translation of this message to 1, and leave untranslated the translations of \"Please click on: %1\" that have the placename embedded (or translate them as - if you wish to show the file as fully translated. The second option is to translate all messages in full - this is likely to be required in the case of highly-inflected languages like Russian. To choose this option, set the translation of this message to 0, and translate all the messages.", "0"); if (sw == "1") { TQString divisionName = i18n(p_map -> getFileName().utf8(), division.utf8()); TQString text = i18n("Please click on:\n%1"); p_next -> setText(text.arg(divisionName)); } else { TQString s = TQString("Please click on:\n%1").arg(division); p_next -> setText(i18n(p_map -> getFileName().utf8(), s.utf8())); } p_currentAnswer.setQuestion(i18n(p_map -> getFileName().utf8(), division.utf8())); p_next -> show(); p_currentAnswer.setCorrectAnswer(p_map -> getColor(division)); } TQString mapAsker::getQuestionHook() const { return i18n("Division in Map"); } void mapAsker::showEvent(TQShowEvent *) { if (p_firstShow) { p_mapWidget -> init(p_map -> getMapFile(), p_vsb->width(), p_hsb->height()); p_firstShow = false; } } TQSize mapAsker::mapSize() const { return p_mapWidget -> mapSize(); } #include "mapasker.moc"