////////////////////////////////////////////////////////////////////// // This file is part of Remere's Map Editor ////////////////////////////////////////////////////////////////////// // Remere's Map Editor 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. // // Remere's Map Editor 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 . ////////////////////////////////////////////////////////////////////// #include "main.h" #include #ifdef __linux__ #include #endif #include "gui.h" #include "editor.h" #include "map.h" #include "sprites.h" #include "map_tab.h" #include "editor_tabs.h" #include "map_display.h" MapTab::MapTab(MapTabbook* aui, Editor* editor) : EditorTab(), MapWindow(aui->notebook, *editor), aui(aui) { iref = newd InternalReference; iref->editor = editor; iref->owner_count = 1; aui->AddTab(this, true); FitToMap(); } MapTab::MapTab(const MapTab* other) : EditorTab(), MapWindow(other->aui->notebook, *other->iref->editor), aui(other->aui), iref(other->iref) { iref->owner_count++; aui->AddTab(this, true); FitToMap(); int x, y; other->GetCanvas()->GetScreenCenter(&x, &y); SetScreenCenterPosition(Position(x, y, other->GetCanvas()->GetFloor())); } MapTab::~MapTab() { iref->owner_count--; if (iref->owner_count <= 0) { Editor* ed = iref->editor; iref->editor = nullptr; delete iref; if (ed->IsLive()) { ed->CloseLiveServer(); } std::thread([ed]() { delete ed; #ifdef __linux__ malloc_trim(0); #endif }).detach(); } } bool MapTab::IsUniqueReference() const { return iref->owner_count == 1; } wxWindow* MapTab::GetWindow() const { return const_cast(this); } MapCanvas* MapTab::GetCanvas() const { return canvas; } MapWindow* MapTab::GetView() const { return const_cast((const MapWindow*)this); } wxString MapTab::GetTitle() const { wxString ss; const Map &map = iref->editor->getMap(); ss << wxstr(map.getName()) << (map.hasChanged() ? "*" : ""); return ss; } Editor* MapTab::GetEditor() const { return &editor; } Map* MapTab::GetMap() const { return &editor.getMap(); } void MapTab::VisibilityCheck() { EditorTab* editorTab = aui->GetCurrentTab(); MapTab* mapTab = dynamic_cast(editorTab); UpdateDialogs(mapTab && HasSameReference(mapTab)); } void MapTab::OnSwitchEditorMode(EditorMode mode) { gem->SetSprite(mode == DRAWING_MODE ? EDITOR_SPRITE_DRAWING_GEM : EDITOR_SPRITE_SELECTION_GEM); if (mode == SELECTION_MODE) { canvas->EnterSelectionMode(); } else { canvas->EnterDrawingMode(); } }