bool ItemDelegate::eventFilter(QObject *object, QEvent *event) { if (object->objectName() == "editor") { QPlainTextEdit *editor = qobject_cast<QPlainTextEdit*>(object); if (editor == NULL) return false; QEvent::Type type = event->type(); if ( type == QEvent::KeyPress ) { QKeyEvent *keyevent = static_cast<QKeyEvent *>(event); switch ( keyevent->key() ) { case Qt::Key_Enter: case Qt::Key_Return: // Commit data on Ctrl+Return or Enter? if (m_saveOnReturnKey) { if (keyevent->modifiers() == Qt::ControlModifier) { editor->insertPlainText("\n"); return true; } else if (keyevent->modifiers() != Qt::NoModifier) { return false; } } else { if (keyevent->modifiers() != Qt::ControlModifier) return false; } emit commitData(editor); emit closeEditor(editor); return true; case Qt::Key_S: // Commit data on Ctrl+S. if (keyevent->modifiers() != Qt::ControlModifier) return false; emit commitData(editor); emit closeEditor(editor); return true; case Qt::Key_F2: // Commit data on F2. emit commitData(editor); emit closeEditor(editor); return true; case Qt::Key_Escape: // Close editor without committing data. emit closeEditor(editor, QAbstractItemDelegate::RevertModelCache); return true; default: return false; } } else if ( type == QEvent::ContextMenu ) { QAction *act; QMenu *menu = editor->createStandardContextMenu(); connect( menu, SIGNAL(aboutToHide()), menu, SLOT(deleteLater()) ); menu->setParent(editor); act = menu->addAction( tr("&Save Item") ); act->setShortcut( QKeySequence(tr("F2, Ctrl+Enter")) ); connect( act, SIGNAL(triggered()), this, SLOT(editorSave()) ); act = menu->addAction( tr("Cancel Editing") ); act->setShortcut( QKeySequence(tr("Escape")) ); connect( act, SIGNAL(triggered()), this, SLOT(editorCancel()) ); QContextMenuEvent *menuEvent = static_cast<QContextMenuEvent *>(event); menu->popup( menuEvent->globalPos() ); } } else { // resize event for items if (event->type() == QEvent::Resize) { QResizeEvent *resize = static_cast<QResizeEvent *>(event); ItemWidget *item = dynamic_cast<ItemWidget *>(object); if (item != NULL) { item->widget()->resize(resize->size()); onItemChanged(item); return true; } } } return false; }
SimpleRichTextEdit::SimpleRichTextEdit(QWidget *parent) : KTextEdit(parent) { enableFindReplace(false); setCheckSpellingEnabled(true); setAutoFormatting(KTextEdit::AutoNone); setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere); QTextDocument *textDocument = document(); QTextOption textOption; textOption.setAlignment(Qt::AlignCenter); textOption.setWrapMode(QTextOption::NoWrap); textDocument->setDefaultTextOption(textOption); QFont defaultFont = font(); defaultFont.setPointSize(defaultFont.pointSize() + 2); textDocument->setDefaultFont(defaultFont); QString styleSheet("p {" " display: block;" " white-space: pre;" " margin-top: 0px;" " margin-bottom: 0px;" "}"); textDocument->setDefaultStyleSheet(styleSheet); setTextInteractionFlags(Qt::TextEditorInteraction); m_actions[Undo] = new QAction(this); m_actions[Undo]->setIcon(QIcon::fromTheme("edit-undo")); m_actions[Undo]->setText(i18n("Undo")); m_actions[Undo]->setShortcuts(KStandardShortcut::undo()); connect(m_actions[Undo], SIGNAL(triggered()), this, SLOT(undo())); m_actions[Redo] = new QAction(this); m_actions[Redo]->setIcon(QIcon::fromTheme("edit-redo")); m_actions[Redo]->setText(i18n("Redo")); m_actions[Redo]->setShortcuts(KStandardShortcut::redo()); connect(m_actions[Redo], SIGNAL(triggered()), this, SLOT(redo())); m_actions[Cut] = new QAction(this); m_actions[Cut]->setIcon(QIcon::fromTheme("edit-cut")); m_actions[Cut]->setText(i18n("Cut")); m_actions[Cut]->setShortcuts(KStandardShortcut::cut()); connect(m_actions[Cut], SIGNAL(triggered()), this, SLOT(cut())); m_actions[Copy] = new QAction(this); m_actions[Copy]->setIcon(QIcon::fromTheme("edit-copy")); m_actions[Copy]->setText(i18n("Copy")); m_actions[Copy]->setShortcuts(KStandardShortcut::copy()); connect(m_actions[Copy], SIGNAL(triggered()), this, SLOT(copy())); #if !defined(QT_NO_CLIPBOARD) m_actions[Paste] = new QAction(this); m_actions[Paste]->setIcon(QIcon::fromTheme("edit-paste")); m_actions[Paste]->setText(i18n("Paste")); m_actions[Paste]->setShortcuts(KStandardShortcut::paste()); connect(m_actions[Paste], SIGNAL(triggered()), this, SLOT(paste())); #endif m_actions[Delete] = new QAction(this); m_actions[Delete]->setIcon(QIcon::fromTheme("edit-delete")); m_actions[Delete]->setText(i18n("Delete")); m_actions[Delete]->setShortcut(QKeySequence::Delete); connect(m_actions[Delete], SIGNAL(triggered()), this, SLOT(deleteText())); m_actions[Clear] = new QAction(this); m_actions[Clear]->setIcon(QIcon::fromTheme("edit-clear")); m_actions[Clear]->setText(i18nc("@action:inmenu Clear all text", "Clear")); connect(m_actions[Clear], SIGNAL(triggered()), this, SLOT(undoableClear())); m_actions[SelectAll] = new QAction(this); m_actions[SelectAll]->setIcon(QIcon::fromTheme("edit-select-all")); m_actions[SelectAll]->setText(i18n("Select All")); m_actions[SelectAll]->setShortcut(QKeySequence::SelectAll); connect(m_actions[SelectAll], SIGNAL(triggered()), this, SLOT(selectAll())); m_actions[ToggleBold] = new QAction(this); m_actions[ToggleBold]->setIcon(QIcon::fromTheme("format-text-bold")); m_actions[ToggleBold]->setText(i18nc("@action:inmenu Toggle bold style", "Bold")); m_actions[ToggleBold]->setShortcut(QKeySequence("Ctrl+B")); connect(m_actions[ToggleBold], SIGNAL(triggered()), this, SLOT(toggleFontBold())); m_actions[ToggleItalic] = new QAction(this); m_actions[ToggleItalic]->setIcon(QIcon::fromTheme("format-text-italic")); m_actions[ToggleItalic]->setText(i18nc("@action:inmenu Toggle italic style", "Italic")); m_actions[ToggleItalic]->setShortcut(QKeySequence("Ctrl+I")); connect(m_actions[ToggleItalic], SIGNAL(triggered()), this, SLOT(toggleFontItalic())); m_actions[ToggleUnderline] = new QAction(this); m_actions[ToggleUnderline]->setIcon(QIcon::fromTheme("format-text-underline")); m_actions[ToggleUnderline]->setText(i18nc("@action:inmenu Toggle underline style", "Underline")); m_actions[ToggleUnderline]->setShortcut(QKeySequence("Ctrl+U")); connect(m_actions[ToggleUnderline], SIGNAL(triggered()), this, SLOT(toggleFontUnderline())); m_actions[ToggleStrikeOut] = new QAction(this); m_actions[ToggleStrikeOut]->setIcon(QIcon::fromTheme("format-text-strikethrough")); m_actions[ToggleStrikeOut]->setText(i18nc("@action:inmenu Toggle strike through style", "Strike Through")); m_actions[ToggleStrikeOut]->setShortcut(QKeySequence("Ctrl+T")); connect(m_actions[ToggleStrikeOut], SIGNAL(triggered()), this, SLOT(toggleFontStrikeOut())); m_actions[ChangeTextColor] = new QAction(this); m_actions[ChangeTextColor]->setIcon(QIcon::fromTheme("format-text-color")); m_actions[ChangeTextColor]->setText(i18nc("@action:inmenu Change Text Color", "Text Color")); m_actions[ChangeTextColor]->setShortcut(QKeySequence("Ctrl+Shift+C")); connect(m_actions[ChangeTextColor], SIGNAL(triggered()), this, SLOT(changeTextColor())); m_actions[CheckSpelling] = new QAction(this); m_actions[CheckSpelling]->setIcon(QIcon::fromTheme("tools-check-spelling")); m_actions[CheckSpelling]->setText(i18n("Check Spelling...")); connect(m_actions[CheckSpelling], SIGNAL(triggered()), this, SLOT(checkSpelling())); m_actions[ToggleAutoSpellChecking] = new QAction(this); m_actions[ToggleAutoSpellChecking]->setText(i18n("Auto Spell Check")); m_actions[ToggleAutoSpellChecking]->setCheckable(true); connect(m_actions[ToggleAutoSpellChecking], SIGNAL(triggered()), this, SLOT(toggleAutoSpellChecking())); m_actions[AllowTabulations] = new QAction(this); m_actions[AllowTabulations]->setText(i18n("Allow Tabulations")); connect(m_actions[AllowTabulations], SIGNAL(triggered()), this, SLOT(toggleTabChangesFocus())); QMenu *menu = createStandardContextMenu(); menu->setParent(this); QList<QAction *> actions = menu->actions(); m_insertUnicodeControlCharMenu = 0; for(QList<QAction *>::ConstIterator it = actions.constBegin(), end = actions.constEnd(); it != end; ++it) { if((*it)->menu()) { // this depends on Qt private implementation but at least is guaranteed // to behave reasonably if that implementation changes in the future. if(!strcmp((*it)->menu()->metaObject()->className(), "QUnicodeControlCharacterMenu")) { m_insertUnicodeControlCharMenu = (*it)->menu(); break; } } } }
MainWindow::MainWindow(QWidget *parent, Qt::WindowFlags flags) : QMainWindow(parent, flags) , mUi(new Ui::MainWindow) , mMapDocument(0) , mActionHandler(new MapDocumentActionHandler(this)) , mMapsDock(new MapsDock(this)) , mTilesetDock(new TilesetDock(this)) , mMiniMapDock(new MiniMapDock(this)) , mZoomable(0) , mZoomComboBox(new QComboBox) , mStatusInfoLabel(new QLabel) , mValidationErrorWidget(new QWidget) , mValidationErrorLabel(new QLabel) , mDocumentManager(DocumentManager::instance()) , mQuickStampManager(new QuickStampManager(this)) , mToolManager(new ToolManager(this)) , mKodableMapValidator(new KodableMapValidator(this)) { mUi->setupUi(this); setCentralWidget(mDocumentManager->widget()); #ifdef Q_OS_MAC MacSupport::addFullscreen(this); #endif Preferences *preferences = Preferences::instance(); QIcon redoIcon(QLatin1String(":images/16x16/edit-redo.png")); QIcon undoIcon(QLatin1String(":images/16x16/edit-undo.png")); QIcon windowIcon(QLatin1String(":images/kodable-editor-icon.png")); setWindowIcon(windowIcon); // Add larger icon versions for actions used in the tool bar QIcon newIcon = mUi->actionNew->icon(); QIcon openIcon = mUi->actionOpen->icon(); QIcon saveIcon = mUi->actionSave->icon(); newIcon.addFile(QLatin1String(":images/24x24/document-new.png")); openIcon.addFile(QLatin1String(":images/24x24/document-open.png")); saveIcon.addFile(QLatin1String(":images/24x24/document-save.png")); redoIcon.addFile(QLatin1String(":images/24x24/edit-redo.png")); undoIcon.addFile(QLatin1String(":images/24x24/edit-undo.png")); mUi->actionNew->setIcon(newIcon); mUi->actionOpen->setIcon(openIcon); mUi->actionSave->setIcon(saveIcon); QUndoGroup *undoGroup = mDocumentManager->undoGroup(); QAction *undoAction = undoGroup->createUndoAction(this, tr("Undo")); QAction *redoAction = undoGroup->createRedoAction(this, tr("Redo")); mUi->mainToolBar->setToolButtonStyle(Qt::ToolButtonFollowStyle); mUi->actionNew->setPriority(QAction::LowPriority); redoAction->setPriority(QAction::LowPriority); redoAction->setIcon(redoIcon); undoAction->setIcon(undoIcon); redoAction->setIconText(tr("Redo")); undoAction->setIconText(tr("Undo")); connect(undoGroup, SIGNAL(cleanChanged(bool)), SLOT(updateWindowTitle())); UndoDock *undoDock = new UndoDock(undoGroup, this); PropertiesDock *propertiesDock = new PropertiesDock(this); addDockWidget(Qt::LeftDockWidgetArea, undoDock); addDockWidget(Qt::LeftDockWidgetArea, mMapsDock); addDockWidget(Qt::RightDockWidgetArea, mMiniMapDock); addDockWidget(Qt::RightDockWidgetArea, mTilesetDock); addDockWidget(Qt::RightDockWidgetArea, propertiesDock); tabifyDockWidget(undoDock, mMapsDock); // These dock widgets may not be immediately useful to many people, so // they are hidden by default. undoDock->setVisible(false); mMapsDock->setVisible(false); mMiniMapDock->setVisible(false); QHBoxLayout *errorBoxLayout = new QHBoxLayout; QLabel *iconLabel = new QLabel; iconLabel->setPixmap(QPixmap(QLatin1String(":images/16x16/dialog-warning.png"))); errorBoxLayout->addWidget(iconLabel); errorBoxLayout->addWidget(mValidationErrorLabel); mValidationErrorWidget->setLayout(errorBoxLayout); mValidationErrorWidget->setVisible(false); statusBar()->addPermanentWidget(mValidationErrorWidget); statusBar()->addPermanentWidget(mZoomComboBox); mUi->actionNew->setShortcuts(QKeySequence::New); mUi->actionOpen->setShortcuts(QKeySequence::Open); mUi->actionSave->setShortcuts(QKeySequence::Save); mUi->actionSaveAs->setShortcuts(QKeySequence::SaveAs); mUi->actionClose->setShortcuts(QKeySequence::Close); mUi->actionQuit->setShortcuts(QKeySequence::Quit); mUi->actionCut->setShortcuts(QKeySequence::Cut); mUi->actionCopy->setShortcuts(QKeySequence::Copy); mUi->actionPaste->setShortcuts(QKeySequence::Paste); mUi->actionDelete->setShortcuts(QKeySequence::Delete); undoAction->setShortcuts(QKeySequence::Undo); redoAction->setShortcuts(QKeySequence::Redo); mUi->actionShowGrid->setChecked(preferences->showGrid()); mUi->actionShowTileObjectOutlines->setChecked(preferences->showTileObjectOutlines()); mUi->actionShowTileAnimations->setChecked(preferences->showTileAnimations()); mUi->actionSnapToGrid->setChecked(preferences->snapToGrid()); mUi->actionSnapToFineGrid->setChecked(preferences->snapToFineGrid()); mUi->actionHighlightCurrentLayer->setChecked(preferences->highlightCurrentLayer()); QShortcut *reloadTilesetsShortcut = new QShortcut(QKeySequence(tr("Ctrl+T")), this); connect(reloadTilesetsShortcut, SIGNAL(activated()), this, SLOT(reloadTilesets())); // Make sure Ctrl+= also works for zooming in QList<QKeySequence> keys = QKeySequence::keyBindings(QKeySequence::ZoomIn); keys += QKeySequence(tr("Ctrl+=")); keys += QKeySequence(tr("+")); mUi->actionZoomIn->setShortcuts(keys); keys = QKeySequence::keyBindings(QKeySequence::ZoomOut); keys += QKeySequence(tr("-")); mUi->actionZoomOut->setShortcuts(keys); mUi->menuEdit->insertAction(mUi->actionCut, undoAction); mUi->menuEdit->insertAction(mUi->actionCut, redoAction); mUi->menuEdit->insertSeparator(mUi->actionCut); mUi->menuEdit->insertAction(mUi->actionPreferences, mActionHandler->actionSelectAll()); mUi->menuEdit->insertAction(mUi->actionPreferences, mActionHandler->actionSelectNone()); mUi->menuEdit->insertSeparator(mUi->actionPreferences); mUi->mainToolBar->addAction(undoAction); mUi->mainToolBar->addAction(redoAction); mUi->mainToolBar->addSeparator(); mLayerMenu = new QMenu(tr("&Layer"), this); mLayerMenu->addAction(mActionHandler->actionLayerProperties()); menuBar()->insertMenu(mUi->menuHelp->menuAction(), mLayerMenu); connect(mUi->actionNew, SIGNAL(triggered()), SLOT(newMap())); connect(mUi->actionOpen, SIGNAL(triggered()), SLOT(openFile())); connect(mUi->actionClearRecentFiles, SIGNAL(triggered()), SLOT(clearRecentFiles())); connect(mUi->actionSave, SIGNAL(triggered()), SLOT(saveFile())); connect(mUi->actionSaveAs, SIGNAL(triggered()), SLOT(saveFileAs())); connect(mUi->actionSaveAsImage, SIGNAL(triggered()), SLOT(saveAsImage())); connect(mUi->actionExport, SIGNAL(triggered()), SLOT(exportAs())); connect(mUi->actionClose, SIGNAL(triggered()), SLOT(closeFile())); connect(mUi->actionCloseAll, SIGNAL(triggered()), SLOT(closeAllFiles())); connect(mUi->actionQuit, SIGNAL(triggered()), SLOT(close())); connect(mUi->actionCut, SIGNAL(triggered()), SLOT(cut())); connect(mUi->actionCopy, SIGNAL(triggered()), SLOT(copy())); connect(mUi->actionPaste, SIGNAL(triggered()), SLOT(paste())); connect(mUi->actionDelete, SIGNAL(triggered()), SLOT(delete_())); connect(mUi->actionPreferences, SIGNAL(triggered()), SLOT(openPreferences())); connect(mUi->actionShowGrid, SIGNAL(toggled(bool)), preferences, SLOT(setShowGrid(bool))); connect(mUi->actionShowTileObjectOutlines, SIGNAL(toggled(bool)), preferences, SLOT(setShowTileObjectOutlines(bool))); connect(mUi->actionShowTileAnimations, SIGNAL(toggled(bool)), preferences, SLOT(setShowTileAnimations(bool))); connect(mUi->actionSnapToGrid, SIGNAL(toggled(bool)), preferences, SLOT(setSnapToGrid(bool))); connect(mUi->actionSnapToFineGrid, SIGNAL(toggled(bool)), preferences, SLOT(setSnapToFineGrid(bool))); connect(mUi->actionHighlightCurrentLayer, SIGNAL(toggled(bool)), preferences, SLOT(setHighlightCurrentLayer(bool))); connect(mUi->actionZoomIn, SIGNAL(triggered()), SLOT(zoomIn())); connect(mUi->actionZoomOut, SIGNAL(triggered()), SLOT(zoomOut())); connect(mUi->actionZoomNormal, SIGNAL(triggered()), SLOT(zoomNormal())); connect(mUi->actionNewTileset, SIGNAL(triggered()), SLOT(newTileset())); connect(mUi->actionAddExternalTileset, SIGNAL(triggered()), SLOT(addExternalTileset())); connect(mUi->actionOffsetMap, SIGNAL(triggered()), SLOT(offsetMap())); connect(mUi->actionMapProperties, SIGNAL(triggered()), SLOT(editMapProperties())); connect(mUi->actionAbout, SIGNAL(triggered()), SLOT(aboutTiled())); connect(mUi->actionAboutQt, SIGNAL(triggered()), qApp, SLOT(aboutQt())); connect(mTilesetDock, SIGNAL(tilesetsDropped(QStringList)), SLOT(newTilesets(QStringList))); // Add recent file actions to the recent files menu for (int i = 0; i < MaxRecentFiles; ++i) { mRecentFiles[i] = new QAction(this); mUi->menuRecentFiles->insertAction(mUi->actionClearRecentFiles, mRecentFiles[i]); mRecentFiles[i]->setVisible(false); connect(mRecentFiles[i], SIGNAL(triggered()), this, SLOT(openRecentFile())); } mUi->menuRecentFiles->insertSeparator(mUi->actionClearRecentFiles); setThemeIcon(mUi->actionNew, "document-new"); setThemeIcon(mUi->actionOpen, "document-open"); setThemeIcon(mUi->menuRecentFiles, "document-open-recent"); setThemeIcon(mUi->actionClearRecentFiles, "edit-clear"); setThemeIcon(mUi->actionSave, "document-save"); setThemeIcon(mUi->actionSaveAs, "document-save-as"); setThemeIcon(mUi->actionClose, "window-close"); setThemeIcon(mUi->actionQuit, "application-exit"); setThemeIcon(mUi->actionCut, "edit-cut"); setThemeIcon(mUi->actionCopy, "edit-copy"); setThemeIcon(mUi->actionPaste, "edit-paste"); setThemeIcon(mUi->actionDelete, "edit-delete"); setThemeIcon(redoAction, "edit-redo"); setThemeIcon(undoAction, "edit-undo"); setThemeIcon(mUi->actionZoomIn, "zoom-in"); setThemeIcon(mUi->actionZoomOut, "zoom-out"); setThemeIcon(mUi->actionZoomNormal, "zoom-original"); setThemeIcon(mUi->actionNewTileset, "document-new"); setThemeIcon(mUi->actionMapProperties, "document-properties"); setThemeIcon(mUi->actionAbout, "help-about"); mStampBrush = new StampBrush(this); mBucketFillTool = new BucketFillTool(this); connect(mTilesetDock, SIGNAL(currentTilesChanged(const TileLayer*)), this, SLOT(setStampBrush(const TileLayer*))); connect(mStampBrush, SIGNAL(currentTilesChanged(const TileLayer*)), this, SLOT(setStampBrush(const TileLayer*))); QToolBar *toolBar = mUi->toolsToolBar; toolBar->addAction(mToolManager->registerTool(mStampBrush)); toolBar->addAction(mToolManager->registerTool(mBucketFillTool)); toolBar->addAction(mToolManager->registerTool(new Eraser(this))); toolBar->addAction(mToolManager->registerTool(new TileSelectionTool(this))); mDocumentManager->setSelectedTool(mToolManager->selectedTool()); connect(mToolManager, SIGNAL(selectedToolChanged(AbstractTool*)), mDocumentManager, SLOT(setSelectedTool(AbstractTool*))); statusBar()->addWidget(mStatusInfoLabel); connect(mToolManager, SIGNAL(statusInfoChanged(QString)), this, SLOT(updateStatusInfoLabel(QString))); // Add the 'Views and Toolbars' submenu. This needs to happen after all // the dock widgets and toolbars have been added to the main window. mViewsAndToolbarsMenu = new QAction(tr("Views and Toolbars"), this); QMenu *popupMenu = createPopupMenu(); popupMenu->setParent(this); mViewsAndToolbarsMenu->setMenu(popupMenu); mUi->menuView->insertAction(mUi->actionShowGrid, mViewsAndToolbarsMenu); mUi->menuView->insertSeparator(mUi->actionShowGrid); connect(ClipboardManager::instance(), SIGNAL(hasMapChanged()), SLOT(updateActions())); connect(mDocumentManager, SIGNAL(currentDocumentChanged(MapDocument*)), SLOT(mapDocumentChanged(MapDocument*))); connect(mDocumentManager, SIGNAL(documentCloseRequested(int)), this, SLOT(closeMapDocument(int))); QShortcut *switchToLeftDocument = new QShortcut(tr("Alt+Left"), this); connect(switchToLeftDocument, SIGNAL(activated()), mDocumentManager, SLOT(switchToLeftDocument())); QShortcut *switchToLeftDocument1 = new QShortcut(tr("Ctrl+Shift+Tab"), this); connect(switchToLeftDocument1, SIGNAL(activated()), mDocumentManager, SLOT(switchToLeftDocument())); QShortcut *switchToRightDocument = new QShortcut(tr("Alt+Right"), this); connect(switchToRightDocument, SIGNAL(activated()), mDocumentManager, SLOT(switchToRightDocument())); QShortcut *switchToRightDocument1 = new QShortcut(tr("Ctrl+Tab"), this); connect(switchToRightDocument1, SIGNAL(activated()), mDocumentManager, SLOT(switchToRightDocument())); new QShortcut(tr("X"), this, SLOT(flipHorizontally())); new QShortcut(tr("Y"), this, SLOT(flipVertically())); new QShortcut(tr("Z"), this, SLOT(rotateRight())); new QShortcut(tr("Shift+Z"), this, SLOT(rotateLeft())); QShortcut *copyPositionShortcut = new QShortcut(tr("Alt+C"), this); connect(copyPositionShortcut, SIGNAL(activated()), mActionHandler, SLOT(copyPosition())); updateActions(); readSettings(); setupQuickStamps(); connect(undoGroup, SIGNAL(indexChanged(int)), mKodableMapValidator, SLOT(validateCurrentMap())); connect(mKodableMapValidator, SIGNAL(errorChanged(QString)), this, SLOT(setValidationError(QString))); }