meos-2024/code/qf_editor.h
2024-03-19 08:51:20 +01:00

117 lines
3.5 KiB
C++

#pragma once
/************************************************************************
MeOS - Orienteering Software
Copyright (C) 2009-2024 Melin Software HB
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 3 of the License, or
(at your option) any later version.
This program 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 this program. If not, see <http://www.gnu.org/licenses/>.
Melin Software HB - software@melin.nu - www.melin.nu
Eksoppsvägen 16, SE-75646 UPPSALA, Sweden
************************************************************************/
class gdioutput;
class oEvent;
class QualificationFinal;
#include <vector>
#include <memory>
#include "qualification_final.h"
#include "autocompletehandler.h"
class oClass;
class QFEditor : public GuiHandler {
private:
enum SaveType {NotSaved, SavedInside, SavedFile};
shared_ptr<QualificationFinal> currentQF;
wstring savedFileName;
bool dirtyExt = false;
bool dirtyInt = false;
SaveType lastSaved = NotSaved;
oClass* cls;
/// Check and ask if there are changes to save
bool checkSave(gdioutput &gdi);
void edit(gdioutput& gdi);
void updateActions(gdioutput& gdi);
vector<pair<size_t, vector<QFClass>>> data; // First is number of classes (for convenient undo)
size_t numLevels = 0; // Allow larger data than levels (for convenient "undo")
void showLevels(gdioutput& gdi) const;
void showLevel(gdioutput& gdi, int level, size_t numRaces, const vector<QFClass>& classes) const;
static int code(int level, int cls) {
return level * 256 + cls;
}
static pair<int, int> decode(int c) {
return make_pair(c / 256, c % 256);
}
QFClass& getQFClass(int id);
const QFClass& getQFClass(int id) const;
void loadQualificationView(gdioutput &gdi, const QFClass &cls, int code);
int getLinearIndex(int level, int ix) const;
QFClass &getQFClassFromIndex(int linearIndex);
pair<int, int> getLevelIndexFromLinear(int linearIndex) const;
vector<pair<int, int>> getLevelIndex() const;
void updateLevelMap(const vector<pair<int, int>>& oldIndex);
vector<pair<wstring, size_t>> getRules(const QFClass& cls) const;
void emptyScheme();
static string getKeyTag(int level, int ix);
string infoTextTag;
gdioutput *infoTextGdi = nullptr;
void updateQInfo(const QFClass& cls);
void makeQF();
int extraSelPosX = 0;
int extraSelPosY = 0;
void updateExtraField(gdioutput &gdi, const QFClass &cls, int code);
RECT rcRuleForm;
void endAddRuleForm(gdioutput& gdi);
void addRuleOther(int cCcode, gdioutput& gdi);
void addRuleClassPlace(int cCode, gdioutput& gdi);
void addRuleTime(int cCode, gdioutput& gdi);
void use();
bool save(gdioutput &gdi);
public:
QFEditor();
virtual ~QFEditor();
enum class DirtyFlag { MakeDirty, ClearDirty, NoTouch };
void makeDirty(DirtyFlag inside, DirtyFlag outside);
void load(const shared_ptr<QualificationFinal>& qf);
void show(gdioutput &gdi);
void setClass(oClass* cls) { this->cls = cls; }
// Inherited via GuiHandler
virtual void handle(gdioutput& gdi, BaseInfo& info, GuiEventType type);
};