/*
* Copyright 2012, 2013 Thomas Schöps
* Copyright 2014 Thomas Schöps, Kai Pastor
*
* This file is part of OpenOrienteering.
*
* OpenOrienteering 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 3 of the License, or
* (at your option) any later version.
*
* OpenOrienteering is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenOrienteering. If not, see .
*/
#ifndef OPENORIENTEERING_MAIN_WINDOW_CONTROLLER_H
#define OPENORIENTEERING_MAIN_WINDOW_CONTROLLER_H
#include
#include
class QKeyEvent;
class QWidget;
namespace OpenOrienteering {
class MainWindow;
class FileFormat;
/** A MainWindowController provides the specific content and
* behaviours for a main window, for example map drawing or
* course setting functions.
*/
class MainWindowController : public QObject
{
Q_OBJECT
public:
~MainWindowController() override;
/**
* Returns true when the controller wants a menu bar to be shown.
*
* The default implementation returns false for mobile mode,
* true otherwise.
*/
virtual bool menuBarVisible();
/**
* Returns true when the controller wants a status bar to be shown.
*
* The default implementation returns false for mobile mode,
* true otherwise.
*/
virtual bool statusBarVisible();
/** Save to a file.
* @param path the path to save to
* @param format the file format
* @return true if saving was successful, false on errors
*/
virtual bool saveTo(const QString& path, const FileFormat& format);
/** Export to a file, but don't change modified state
* with regard to the original file.
* @param path the path to export to
* @return true if saving was successful, false on errors
*/
bool exportTo(const QString& path);
/** Export to a file, but don't change modified state
* with regard to the original file.
* @param path the path to export to
* @param format the file format
* @return true if saving was successful, false on errors
*/
virtual bool exportTo(const QString& path, const FileFormat& format);
/** Load from a file.
* @param path the path to load from
* @param dialog_parent Alternative parent widget for all dialogs.
* If nullptr, implementations should use MainWindowController::window.
* @return true if loading was successful, false on errors
*/
virtual bool loadFrom(const QString& path, const FileFormat& format, QWidget* dialog_parent = nullptr);
/** Attach the controller to a main window.
* The controller should create its user interface here.
*/
virtual void attach(MainWindow* window) = 0;
/** Detach the controller from a main window.
* The controller should delete its user interface here.
*/
virtual void detach();
/**
* Returns true when editing is in progress.
*
* "Editing in progress" means the file is an "unstable" state where no
* global operations like save, undo, redo shall not be applied.
*/
virtual bool isEditingInProgress() const;
/**
* @brief Receives key press events from the main window.
*
* QKeyEvent starts with isAccepted() == true, so the return value of this
* function decides if the event shall be stopped from being handled further.
*
* The default implementation simply returns false.
*
* @return True if the event shall be stopped from being handled further, false otherwise.
*/
virtual bool keyPressEventFilter(QKeyEvent* event);
/**
* @brief Receives key release events from the main window.
*
* QKeyEvent starts with isAccepted() == true, so the return value of this
* function decides if the event shall be stopped from being handled further.
*
* The default implementation simply returns false.
*
* @return True if the event shall be stopped from being handled further, false otherwise.
*/
virtual bool keyReleaseEventFilter(QKeyEvent* event);
/** Get the main window this controller is attached to.
*/
inline MainWindow* getWindow() const;
/** Get a controller suitable for a particular file.
* @param filename the name of the file
* @return a MainWindowController that is able to load the file
*/
static MainWindowController* controllerForFile(const QString& filename);
protected:
MainWindow* window;
};
//### MainWindowController inline code ###
inline
MainWindow* MainWindowController::getWindow() const
{
return window;
}
} // namespace OpenOrienteering
#endif