tibia-rme/source/palette_waypoints.cpp
2023-10-09 19:12:16 -07:00

224 lines
6.8 KiB
C++

//////////////////////////////////////////////////////////////////////
// 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 <http://www.gnu.org/licenses/>.
//////////////////////////////////////////////////////////////////////
// ============================================================================
// Waypoint palette
#include "main.h"
#include "gui.h"
#include "palette_waypoints.h"
#include "waypoint_brush.h"
#include "map.h"
BEGIN_EVENT_TABLE(WaypointPalettePanel, PalettePanel)
EVT_BUTTON(PALETTE_WAYPOINT_ADD_WAYPOINT, WaypointPalettePanel::OnClickAddWaypoint)
EVT_BUTTON(PALETTE_WAYPOINT_REMOVE_WAYPOINT, WaypointPalettePanel::OnClickRemoveWaypoint)
EVT_LIST_BEGIN_LABEL_EDIT(PALETTE_WAYPOINT_LISTBOX, WaypointPalettePanel::OnBeginEditWaypointLabel)
EVT_LIST_END_LABEL_EDIT(PALETTE_WAYPOINT_LISTBOX, WaypointPalettePanel::OnEditWaypointLabel)
EVT_LIST_ITEM_SELECTED(PALETTE_WAYPOINT_LISTBOX, WaypointPalettePanel::OnClickWaypoint)
END_EVENT_TABLE()
WaypointPalettePanel::WaypointPalettePanel(wxWindow* parent, wxWindowID id) :
PalettePanel(parent, id),
map(nullptr) {
wxSizer* sidesizer = newd wxStaticBoxSizer(wxVERTICAL, this, "Waypoints");
waypoint_list = newd wxListCtrl(this, PALETTE_WAYPOINT_LISTBOX, wxDefaultPosition, wxDefaultSize, wxLC_REPORT | wxLC_SINGLE_SEL | wxLC_EDIT_LABELS | wxLC_NO_HEADER);
waypoint_list->InsertColumn(0, "UNNAMED", wxLIST_FORMAT_LEFT, 200);
sidesizer->Add(waypoint_list, 1, wxEXPAND);
wxSizer* tmpsizer = newd wxBoxSizer(wxHORIZONTAL);
tmpsizer->Add(add_waypoint_button = newd wxButton(this, PALETTE_WAYPOINT_ADD_WAYPOINT, "Add", wxDefaultPosition, wxSize(50, -1)), 1, wxEXPAND);
tmpsizer->Add(remove_waypoint_button = newd wxButton(this, PALETTE_WAYPOINT_REMOVE_WAYPOINT, "Remove", wxDefaultPosition, wxSize(70, -1)), 1, wxEXPAND);
sidesizer->Add(tmpsizer, 0, wxEXPAND);
SetSizerAndFit(sidesizer);
}
WaypointPalettePanel::~WaypointPalettePanel() {
////
}
void WaypointPalettePanel::OnSwitchIn() {
PalettePanel::OnSwitchIn();
}
void WaypointPalettePanel::OnSwitchOut() {
PalettePanel::OnSwitchOut();
}
void WaypointPalettePanel::SetMap(Map* m) {
map = m;
this->Enable(m && m->getVersion().otbm >= MAP_OTBM_3);
}
void WaypointPalettePanel::SelectFirstBrush() {
// SelectWaypointBrush();
}
Brush* WaypointPalettePanel::GetSelectedBrush() const {
long item = waypoint_list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
g_gui.waypoint_brush->setWaypoint(
item == -1 ? nullptr : map->waypoints.getWaypoint(nstr(waypoint_list->GetItemText(item)))
);
return g_gui.waypoint_brush;
}
bool WaypointPalettePanel::SelectBrush(const Brush* whatbrush) {
ASSERT(whatbrush == g_gui.waypoint_brush);
return false;
}
int WaypointPalettePanel::GetSelectedBrushSize() const {
return 0;
}
PaletteType WaypointPalettePanel::GetType() const {
return TILESET_WAYPOINT;
}
wxString WaypointPalettePanel::GetName() const {
return "Waypoint Palette";
}
void WaypointPalettePanel::OnUpdate() {
if (wxTextCtrl* tc = waypoint_list->GetEditControl()) {
Waypoint* wp = map->waypoints.getWaypoint(nstr(tc->GetValue()));
if (wp && !wp->pos.isValid()) {
if (map->getTile(wp->pos)) {
map->getTileL(wp->pos)->decreaseWaypointCount();
}
map->waypoints.removeWaypoint(wp->name);
}
}
waypoint_list->DeleteAllItems();
if (!map) {
waypoint_list->Enable(false);
add_waypoint_button->Enable(false);
remove_waypoint_button->Enable(false);
} else {
waypoint_list->Enable(true);
add_waypoint_button->Enable(true);
remove_waypoint_button->Enable(true);
Waypoints &waypoints = map->waypoints;
for (WaypointMap::const_iterator iter = waypoints.begin(); iter != waypoints.end(); ++iter) {
waypoint_list->InsertItem(0, wxstr(iter->second->name));
}
}
}
void WaypointPalettePanel::OnClickWaypoint(wxListEvent &event) {
if (!map) {
return;
}
std::string wpname = nstr(event.GetText());
Waypoint* wp = map->waypoints.getWaypoint(wpname);
if (wp) {
g_gui.SetScreenCenterPosition(wp->pos);
g_gui.waypoint_brush->setWaypoint(wp);
}
}
void WaypointPalettePanel::OnBeginEditWaypointLabel(wxListEvent &event) {
// We need to disable all hotkeys, so we can type properly
g_gui.DisableHotkeys();
}
void WaypointPalettePanel::OnEditWaypointLabel(wxListEvent &event) {
std::string wpname = nstr(event.GetLabel());
std::string oldwpname = nstr(waypoint_list->GetItemText(event.GetIndex()));
Waypoint* wp = map->waypoints.getWaypoint(oldwpname);
if (event.IsEditCancelled()) {
return;
}
if (wpname == "") {
map->waypoints.removeWaypoint(oldwpname);
g_gui.RefreshPalettes();
} else if (wp) {
if (wpname == oldwpname) {
; // do nothing
} else {
if (map->waypoints.getWaypoint(wpname)) {
// Already exists a waypoint with this name!
g_gui.SetStatusText("There already is a waypoint with this name.");
event.Veto();
if (oldwpname == "") {
map->waypoints.removeWaypoint(oldwpname);
g_gui.RefreshPalettes();
}
} else {
Waypoint* nwp = newd Waypoint(*wp);
nwp->name = wpname;
Waypoint* rwp = map->waypoints.getWaypoint(oldwpname);
if (rwp) {
if (map->getTile(rwp->pos)) {
map->getTileL(rwp->pos)->decreaseWaypointCount();
}
map->waypoints.removeWaypoint(rwp->name);
}
map->waypoints.addWaypoint(nwp);
g_gui.waypoint_brush->setWaypoint(nwp);
// Refresh other palettes
refresh_timer.Start(300, true);
}
}
}
if (event.IsAllowed()) {
g_gui.EnableHotkeys();
}
}
void WaypointPalettePanel::OnClickAddWaypoint(wxCommandEvent &event) {
if (map) {
map->waypoints.addWaypoint(newd Waypoint());
long i = waypoint_list->InsertItem(0, "");
waypoint_list->EditLabel(i);
// g_gui.RefreshPalettes();
}
}
void WaypointPalettePanel::OnClickRemoveWaypoint(wxCommandEvent &event) {
if (!map) {
return;
}
long item = waypoint_list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
if (item != -1) {
Waypoint* wp = map->waypoints.getWaypoint(nstr(waypoint_list->GetItemText(item)));
if (wp) {
if (map->getTile(wp->pos)) {
map->getTileL(wp->pos)->decreaseWaypointCount();
}
map->waypoints.removeWaypoint(wp->name);
}
waypoint_list->DeleteItem(item);
refresh_timer.Start(300, true);
}
}