mirror of
https://github.com/opentibiabr/remeres-map-editor
synced 2026-08-15 18:26:04 -04:00
837 lines
27 KiB
C++
837 lines
27 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/>.
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
#include "main.h"
|
|
|
|
#include "palette_common.h"
|
|
#include "brush.h"
|
|
#include "sprites.h"
|
|
#include "gui.h"
|
|
#include "common_windows.h"
|
|
#include "application.h"
|
|
#include "palette_waypoints.h"
|
|
|
|
// ============================================================================
|
|
// Palette Panel
|
|
|
|
BEGIN_EVENT_TABLE(PalettePanel, wxPanel)
|
|
EVT_TIMER(PALETTE_DELAYED_REFRESH_TIMER, WaypointPalettePanel::OnRefreshTimer)
|
|
END_EVENT_TABLE()
|
|
|
|
PalettePanel::PalettePanel(wxWindow* parent, wxWindowID id, long style) :
|
|
wxPanel(parent, id, wxDefaultPosition, wxDefaultSize, style),
|
|
refresh_timer(this, PALETTE_DELAYED_REFRESH_TIMER),
|
|
last_brush_size(0) {
|
|
////
|
|
}
|
|
|
|
PalettePanel::~PalettePanel() {
|
|
////
|
|
}
|
|
|
|
PaletteWindow* PalettePanel::GetParentPalette() const {
|
|
const wxWindow* w = this;
|
|
while ((w = w->GetParent()) && dynamic_cast<const PaletteWindow*>(w) == nullptr)
|
|
;
|
|
return const_cast<PaletteWindow*>(static_cast<const PaletteWindow*>(w));
|
|
}
|
|
|
|
void PalettePanel::InvalidateContents() {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->InvalidateContents();
|
|
}
|
|
}
|
|
|
|
void PalettePanel::LoadCurrentContents() {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->OnSwitchIn();
|
|
}
|
|
Fit();
|
|
}
|
|
|
|
void PalettePanel::LoadAllContents() {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->LoadAllContents();
|
|
}
|
|
}
|
|
|
|
void PalettePanel::AddToolPanel(PalettePanel* panel) {
|
|
wxSizer* sp_sizer = newd wxStaticBoxSizer(wxVERTICAL, this, panel->GetName());
|
|
sp_sizer->Add(panel, 0, wxEXPAND);
|
|
GetSizer()->Add(sp_sizer, 0, wxEXPAND);
|
|
|
|
// GetSizer()->SetDimension(wxDefaultCoord, wxDefaultCoord, wxDefaultCoord, wxDefaultCoord);
|
|
// GetSizer()->Layout();
|
|
Fit();
|
|
//
|
|
|
|
tool_bars.push_back(panel);
|
|
}
|
|
|
|
void PalettePanel::SetToolbarIconSize(bool large_icons) {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->SetToolbarIconSize(large_icons);
|
|
}
|
|
}
|
|
|
|
wxString PalettePanel::GetName() const {
|
|
switch (GetType()) {
|
|
case TILESET_TERRAIN:
|
|
return "Terrain Palette";
|
|
case TILESET_DOODAD:
|
|
return "Doodad Palette";
|
|
case TILESET_ITEM:
|
|
return "Item Palette";
|
|
case TILESET_MONSTER:
|
|
return "Monster Palette";
|
|
case TILESET_NPC:
|
|
return "Npc Palette";
|
|
case TILESET_HOUSE:
|
|
return "House Palette";
|
|
case TILESET_RAW:
|
|
return "RAW Palette";
|
|
case TILESET_WAYPOINT:
|
|
return "Waypoint Palette";
|
|
case TILESET_ZONES:
|
|
return "Zones Palette";
|
|
case TILESET_UNKNOWN:
|
|
return "Unknown";
|
|
}
|
|
return wxEmptyString;
|
|
}
|
|
|
|
PaletteType PalettePanel::GetType() const {
|
|
return TILESET_UNKNOWN;
|
|
}
|
|
|
|
Brush* PalettePanel::GetSelectedBrush() const {
|
|
return nullptr;
|
|
}
|
|
|
|
int PalettePanel::GetSelectedBrushSize() const {
|
|
return 0;
|
|
}
|
|
|
|
void PalettePanel::SelectFirstBrush() {
|
|
// Do nothing
|
|
}
|
|
|
|
bool PalettePanel::SelectBrush(const Brush* whatbrush) {
|
|
return false;
|
|
}
|
|
|
|
void PalettePanel::OnUpdateBrushSize(BrushShape shape, int size) {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->OnUpdateBrushSize(shape, size);
|
|
}
|
|
}
|
|
|
|
void PalettePanel::OnSwitchIn() {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->OnSwitchIn();
|
|
}
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushSize(last_brush_size);
|
|
}
|
|
|
|
void PalettePanel::OnSwitchOut() {
|
|
last_brush_size = g_gui.GetBrushSize();
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->OnSwitchOut();
|
|
}
|
|
}
|
|
|
|
void PalettePanel::OnUpdate() {
|
|
for (ToolBarList::iterator iter = tool_bars.begin(); iter != tool_bars.end(); ++iter) {
|
|
(*iter)->OnUpdate();
|
|
}
|
|
}
|
|
|
|
void PalettePanel::RefreshOtherPalettes() {
|
|
refresh_timer.Start(100, true);
|
|
}
|
|
|
|
void PalettePanel::OnRefreshTimer(wxTimerEvent &) {
|
|
g_gui.RefreshOtherPalettes(GetParentPalette());
|
|
}
|
|
|
|
// ============================================================================
|
|
// Size Page
|
|
|
|
BEGIN_EVENT_TABLE(BrushSizePanel, wxPanel)
|
|
EVT_TOGGLEBUTTON(PALETTE_BRUSHSHAPE_SQUARE, BrushSizePanel::OnClickSquareBrush)
|
|
EVT_TOGGLEBUTTON(PALETTE_BRUSHSHAPE_CIRCLE, BrushSizePanel::OnClickCircleBrush)
|
|
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_0, BrushSizePanel::OnClickBrushSize0)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_1, BrushSizePanel::OnClickBrushSize1)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_2, BrushSizePanel::OnClickBrushSize2)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_4, BrushSizePanel::OnClickBrushSize4)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_6, BrushSizePanel::OnClickBrushSize6)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_8, BrushSizePanel::OnClickBrushSize8)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_BRUSHSIZE_11, BrushSizePanel::OnClickBrushSize11)
|
|
END_EVENT_TABLE()
|
|
|
|
BrushSizePanel::BrushSizePanel(wxWindow* parent) :
|
|
PalettePanel(parent, wxID_ANY),
|
|
loaded(false),
|
|
large_icons(true),
|
|
brushshapeSquareButton(nullptr),
|
|
brushshapeCircleButton(nullptr),
|
|
brushsize0Button(nullptr),
|
|
brushsize1Button(nullptr),
|
|
brushsize2Button(nullptr),
|
|
brushsize4Button(nullptr),
|
|
brushsize6Button(nullptr),
|
|
brushsize8Button(nullptr),
|
|
brushsize11Button(nullptr) {
|
|
////
|
|
}
|
|
|
|
void BrushSizePanel::InvalidateContents() {
|
|
if (loaded) {
|
|
DestroyChildren();
|
|
SetSizer(nullptr);
|
|
|
|
brushshapeSquareButton = brushshapeCircleButton = brushsize0Button = brushsize1Button = brushsize2Button = brushsize4Button = brushsize6Button = brushsize8Button = brushsize11Button = nullptr;
|
|
|
|
loaded = false;
|
|
}
|
|
}
|
|
|
|
void BrushSizePanel::LoadCurrentContents() {
|
|
LoadAllContents();
|
|
}
|
|
|
|
void BrushSizePanel::LoadAllContents() {
|
|
if (loaded) {
|
|
return;
|
|
}
|
|
|
|
wxSizer* size_sizer = newd wxBoxSizer(wxVERTICAL);
|
|
;
|
|
wxSizer* sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
RenderSize render_size;
|
|
|
|
if (large_icons) {
|
|
// 32x32
|
|
render_size = RENDER_SIZE_32x32;
|
|
} else {
|
|
// 16x16
|
|
render_size = RENDER_SIZE_16x16;
|
|
}
|
|
|
|
sub_sizer->Add(brushshapeSquareButton = newd DCButton(this, PALETTE_BRUSHSHAPE_SQUARE, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_9x9));
|
|
brushshapeSquareButton->SetToolTip("Square brush");
|
|
|
|
sub_sizer->Add(brushshapeCircleButton = newd DCButton(this, PALETTE_BRUSHSHAPE_CIRCLE, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_CD_9x9));
|
|
brushshapeCircleButton->SetToolTip("Circle brush");
|
|
brushshapeSquareButton->SetValue(true);
|
|
|
|
if (large_icons) {
|
|
sub_sizer->AddSpacer(36);
|
|
} else {
|
|
sub_sizer->AddSpacer(18);
|
|
}
|
|
|
|
sub_sizer->Add(brushsize0Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_0, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_CD_1x1));
|
|
brushsize0Button->SetToolTip("Brush size 1");
|
|
brushsize0Button->SetValue(true);
|
|
|
|
sub_sizer->Add(brushsize1Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_1, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_3x3));
|
|
brushsize1Button->SetToolTip("Brush size 2");
|
|
|
|
if (large_icons) {
|
|
size_sizer->Add(sub_sizer);
|
|
sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
}
|
|
|
|
sub_sizer->Add(brushsize2Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_2, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_5x5));
|
|
brushsize2Button->SetToolTip("Brush size 3");
|
|
|
|
sub_sizer->Add(brushsize4Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_4, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_7x7));
|
|
brushsize4Button->SetToolTip("Brush size 5");
|
|
|
|
sub_sizer->Add(brushsize6Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_6, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_9x9));
|
|
brushsize6Button->SetToolTip("Brush size 7");
|
|
|
|
sub_sizer->Add(brushsize8Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_8, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_15x15));
|
|
brushsize8Button->SetToolTip("Brush size 9");
|
|
|
|
sub_sizer->Add(brushsize11Button = newd DCButton(this, PALETTE_TERRAIN_BRUSHSIZE_11, wxDefaultPosition, DC_BTN_TOGGLE, render_size, EDITOR_SPRITE_BRUSH_SD_19x19));
|
|
brushsize11Button->SetToolTip("Brush size 12");
|
|
|
|
size_sizer->Add(sub_sizer);
|
|
SetSizerAndFit(size_sizer);
|
|
|
|
loaded = true;
|
|
}
|
|
|
|
wxString BrushSizePanel::GetName() const {
|
|
return "Brush Size";
|
|
}
|
|
|
|
void BrushSizePanel::SetToolbarIconSize(bool d) {
|
|
InvalidateContents();
|
|
large_icons = d;
|
|
}
|
|
|
|
void BrushSizePanel::OnSwitchIn() {
|
|
LoadCurrentContents();
|
|
}
|
|
|
|
void BrushSizePanel::OnUpdateBrushSize(BrushShape shape, int size) {
|
|
if (shape == BRUSHSHAPE_SQUARE) {
|
|
brushshapeCircleButton->SetValue(false);
|
|
brushshapeSquareButton->SetValue(true);
|
|
|
|
brushsize0Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_1x1);
|
|
brushsize1Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_3x3);
|
|
brushsize2Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_5x5);
|
|
brushsize4Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_7x7);
|
|
brushsize6Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_9x9);
|
|
brushsize8Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_15x15);
|
|
brushsize11Button->SetSprite(EDITOR_SPRITE_BRUSH_SD_19x19);
|
|
} else {
|
|
brushshapeSquareButton->SetValue(false);
|
|
brushshapeCircleButton->SetValue(true);
|
|
|
|
brushsize0Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_1x1);
|
|
brushsize1Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_3x3);
|
|
brushsize2Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_5x5);
|
|
brushsize4Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_7x7);
|
|
brushsize6Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_9x9);
|
|
brushsize8Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_15x15);
|
|
brushsize11Button->SetSprite(EDITOR_SPRITE_BRUSH_CD_19x19);
|
|
}
|
|
|
|
if (brushsize0Button) {
|
|
brushsize0Button->SetValue(false);
|
|
}
|
|
if (brushsize1Button) {
|
|
brushsize1Button->SetValue(false);
|
|
}
|
|
if (brushsize2Button) {
|
|
brushsize2Button->SetValue(false);
|
|
}
|
|
if (brushsize4Button) {
|
|
brushsize4Button->SetValue(false);
|
|
}
|
|
if (brushsize6Button) {
|
|
brushsize6Button->SetValue(false);
|
|
}
|
|
if (brushsize8Button) {
|
|
brushsize8Button->SetValue(false);
|
|
}
|
|
if (brushsize11Button) {
|
|
brushsize11Button->SetValue(false);
|
|
}
|
|
|
|
switch (size) {
|
|
case 0:
|
|
brushsize0Button->SetValue(true);
|
|
break;
|
|
case 1:
|
|
brushsize1Button->SetValue(true);
|
|
break;
|
|
case 2:
|
|
brushsize2Button->SetValue(true);
|
|
break;
|
|
case 4:
|
|
brushsize4Button->SetValue(true);
|
|
break;
|
|
case 6:
|
|
brushsize6Button->SetValue(true);
|
|
break;
|
|
case 8:
|
|
brushsize8Button->SetValue(true);
|
|
break;
|
|
case 11:
|
|
brushsize11Button->SetValue(true);
|
|
break;
|
|
default:
|
|
brushsize0Button->SetValue(true);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void BrushSizePanel::OnClickCircleBrush(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushShape(BRUSHSHAPE_CIRCLE);
|
|
}
|
|
|
|
void BrushSizePanel::OnClickSquareBrush(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushShape(BRUSHSHAPE_SQUARE);
|
|
}
|
|
|
|
void BrushSizePanel::OnClickBrushSize(int which) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushSize(which);
|
|
}
|
|
|
|
// ============================================================================
|
|
// Tool Brush Panel
|
|
|
|
BEGIN_EVENT_TABLE(BrushToolPanel, PalettePanel)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_OPTIONAL_BORDER_TOOL, BrushToolPanel::OnClickGravelButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_ERASER, BrushToolPanel::OnClickEraserButton)
|
|
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_NORMAL_DOOR, BrushToolPanel::OnClickNormalDoorButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_LOCKED_DOOR, BrushToolPanel::OnClickLockedDoorButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_MAGIC_DOOR, BrushToolPanel::OnClickMagicDoorButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_QUEST_DOOR, BrushToolPanel::OnClickQuestDoorButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_HATCH_DOOR, BrushToolPanel::OnClickHatchDoorButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_WINDOW_DOOR, BrushToolPanel::OnClickWindowDoorButton)
|
|
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_PZ_TOOL, BrushToolPanel::OnClickPZBrushButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_NOPVP_TOOL, BrushToolPanel::OnClickNOPVPBrushButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_NOLOGOUT_TOOL, BrushToolPanel::OnClickNoLogoutBrushButton)
|
|
EVT_TOGGLEBUTTON(PALETTE_TERRAIN_PVPZONE_TOOL, BrushToolPanel::OnClickPVPZoneBrushButton)
|
|
END_EVENT_TABLE()
|
|
|
|
BrushToolPanel::BrushToolPanel(wxWindow* parent) :
|
|
PalettePanel(parent, wxID_ANY),
|
|
loaded(false),
|
|
large_icons(true),
|
|
optionalBorderButton(nullptr),
|
|
eraserButton(nullptr),
|
|
normalDoorButton(nullptr),
|
|
lockedDoorButton(nullptr),
|
|
magicDoorButton(nullptr),
|
|
questDoorButton(nullptr),
|
|
hatchDoorButton(nullptr),
|
|
windowDoorButton(nullptr),
|
|
pzBrushButton(nullptr),
|
|
nopvpBrushButton(nullptr),
|
|
nologBrushButton(nullptr),
|
|
pvpzoneBrushButton(nullptr) {
|
|
////
|
|
}
|
|
|
|
BrushToolPanel::~BrushToolPanel() {
|
|
////
|
|
}
|
|
|
|
void BrushToolPanel::InvalidateContents() {
|
|
if (loaded) {
|
|
DestroyChildren();
|
|
SetSizer(nullptr);
|
|
|
|
optionalBorderButton = eraserButton = normalDoorButton = lockedDoorButton = magicDoorButton = questDoorButton = hatchDoorButton = windowDoorButton = pzBrushButton = nopvpBrushButton = nologBrushButton = pvpzoneBrushButton = nullptr;
|
|
|
|
loaded = false;
|
|
}
|
|
}
|
|
|
|
void BrushToolPanel::LoadCurrentContents() {
|
|
LoadAllContents();
|
|
}
|
|
|
|
void BrushToolPanel::LoadAllContents() {
|
|
if (loaded) {
|
|
return;
|
|
}
|
|
|
|
wxSizer* size_sizer = newd wxBoxSizer(wxVERTICAL);
|
|
;
|
|
wxSizer* sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
|
|
/*RenderSize render_size;
|
|
if(large_icons) {
|
|
// 32x32
|
|
render_size = RENDER_SIZE_32x32;
|
|
} else {
|
|
// 16x16
|
|
render_size = RENDER_SIZE_16x16;
|
|
}*/
|
|
|
|
if (large_icons) {
|
|
// Create the tool page with 32x32 icons
|
|
|
|
ASSERT(g_gui.optional_brush);
|
|
sub_sizer->Add(optionalBorderButton = newd BrushButton(this, g_gui.optional_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_OPTIONAL_BORDER_TOOL));
|
|
optionalBorderButton->SetToolTip("Optional Border Tool");
|
|
|
|
ASSERT(g_gui.eraser);
|
|
sub_sizer->Add(eraserButton = newd BrushButton(this, g_gui.eraser, RENDER_SIZE_32x32, PALETTE_TERRAIN_ERASER));
|
|
eraserButton->SetToolTip("Eraser");
|
|
|
|
ASSERT(g_gui.pz_brush);
|
|
sub_sizer->Add(pzBrushButton = newd BrushButton(this, g_gui.pz_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_PZ_TOOL));
|
|
pzBrushButton->SetToolTip("PZ Tool");
|
|
|
|
ASSERT(g_gui.rook_brush);
|
|
sub_sizer->Add(nopvpBrushButton = newd BrushButton(this, g_gui.rook_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_NOPVP_TOOL));
|
|
nopvpBrushButton->SetToolTip("NO PVP Tool");
|
|
|
|
ASSERT(g_gui.nolog_brush);
|
|
sub_sizer->Add(nologBrushButton = newd BrushButton(this, g_gui.nolog_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_NOLOGOUT_TOOL));
|
|
nologBrushButton->SetToolTip("No Logout Tool");
|
|
|
|
ASSERT(g_gui.pvp_brush);
|
|
sub_sizer->Add(pvpzoneBrushButton = newd BrushButton(this, g_gui.pvp_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_PVPZONE_TOOL));
|
|
pvpzoneBrushButton->SetToolTip("PVP Zone Tool");
|
|
|
|
// New row
|
|
size_sizer->Add(sub_sizer);
|
|
sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
|
|
ASSERT(g_gui.normal_door_brush);
|
|
sub_sizer->Add(normalDoorButton = newd BrushButton(this, g_gui.normal_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_NORMAL_DOOR));
|
|
normalDoorButton->SetToolTip("Normal Door Tool");
|
|
|
|
ASSERT(g_gui.locked_door_brush);
|
|
sub_sizer->Add(lockedDoorButton = newd BrushButton(this, g_gui.locked_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_LOCKED_DOOR));
|
|
lockedDoorButton->SetToolTip("Locked Door Tool");
|
|
|
|
ASSERT(g_gui.magic_door_brush);
|
|
sub_sizer->Add(magicDoorButton = newd BrushButton(this, g_gui.magic_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_MAGIC_DOOR));
|
|
magicDoorButton->SetToolTip("Magic Door Tool");
|
|
|
|
ASSERT(g_gui.quest_door_brush);
|
|
sub_sizer->Add(questDoorButton = newd BrushButton(this, g_gui.quest_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_QUEST_DOOR));
|
|
questDoorButton->SetToolTip("Quest Door Tool");
|
|
|
|
ASSERT(g_gui.hatch_door_brush);
|
|
sub_sizer->Add(hatchDoorButton = newd BrushButton(this, g_gui.hatch_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_HATCH_DOOR));
|
|
hatchDoorButton->SetToolTip("Hatch Window Tool");
|
|
|
|
ASSERT(g_gui.window_door_brush);
|
|
sub_sizer->Add(windowDoorButton = newd BrushButton(this, g_gui.window_door_brush, RENDER_SIZE_32x32, PALETTE_TERRAIN_WINDOW_DOOR));
|
|
windowDoorButton->SetToolTip("Window Tool");
|
|
} else {
|
|
// Create the tool page with 16x16 icons
|
|
// Create tool window #1
|
|
|
|
ASSERT(g_gui.optional_brush);
|
|
sub_sizer->Add(optionalBorderButton = newd BrushButton(this, g_gui.optional_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_OPTIONAL_BORDER_TOOL));
|
|
optionalBorderButton->SetToolTip("Optional Border Tool");
|
|
|
|
ASSERT(g_gui.eraser);
|
|
sub_sizer->Add(eraserButton = newd BrushButton(this, g_gui.eraser, RENDER_SIZE_16x16, PALETTE_TERRAIN_ERASER));
|
|
eraserButton->SetToolTip("Eraser");
|
|
|
|
sub_sizer->AddSpacer(20);
|
|
|
|
ASSERT(g_gui.normal_door_brush);
|
|
sub_sizer->Add(normalDoorButton = newd BrushButton(this, g_gui.normal_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_NORMAL_DOOR));
|
|
normalDoorButton->SetToolTip("Normal Door Tool");
|
|
|
|
ASSERT(g_gui.locked_door_brush);
|
|
sub_sizer->Add(lockedDoorButton = newd BrushButton(this, g_gui.locked_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_LOCKED_DOOR));
|
|
lockedDoorButton->SetToolTip("Locked Door Tool");
|
|
|
|
ASSERT(g_gui.magic_door_brush);
|
|
sub_sizer->Add(magicDoorButton = newd BrushButton(this, g_gui.magic_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_MAGIC_DOOR));
|
|
magicDoorButton->SetToolTip("Magic Door Tool");
|
|
|
|
ASSERT(g_gui.quest_door_brush);
|
|
sub_sizer->Add(questDoorButton = newd BrushButton(this, g_gui.quest_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_QUEST_DOOR));
|
|
questDoorButton->SetToolTip("Quest Door Tool");
|
|
|
|
ASSERT(g_gui.hatch_door_brush);
|
|
sub_sizer->Add(hatchDoorButton = newd BrushButton(this, g_gui.hatch_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_HATCH_DOOR));
|
|
hatchDoorButton->SetToolTip("Hatch Window Tool");
|
|
|
|
ASSERT(g_gui.window_door_brush);
|
|
sub_sizer->Add(windowDoorButton = newd BrushButton(this, g_gui.window_door_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_WINDOW_DOOR));
|
|
windowDoorButton->SetToolTip("Window Tool");
|
|
|
|
// Next row
|
|
size_sizer->Add(sub_sizer);
|
|
sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
|
|
ASSERT(g_gui.pz_brush);
|
|
sub_sizer->Add(pzBrushButton = newd BrushButton(this, g_gui.pz_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_PZ_TOOL));
|
|
pzBrushButton->SetToolTip("PZ Tool");
|
|
|
|
ASSERT(g_gui.rook_brush);
|
|
sub_sizer->Add(nopvpBrushButton = newd BrushButton(this, g_gui.rook_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_NOPVP_TOOL));
|
|
nopvpBrushButton->SetToolTip("NO PVP Tool");
|
|
|
|
ASSERT(g_gui.nolog_brush);
|
|
sub_sizer->Add(nologBrushButton = newd BrushButton(this, g_gui.nolog_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_NOLOGOUT_TOOL));
|
|
nologBrushButton->SetToolTip("No Logout Tool");
|
|
|
|
ASSERT(g_gui.pvp_brush);
|
|
sub_sizer->Add(pvpzoneBrushButton = newd BrushButton(this, g_gui.pvp_brush, RENDER_SIZE_16x16, PALETTE_TERRAIN_PVPZONE_TOOL));
|
|
pvpzoneBrushButton->SetToolTip("PVP Zone Tool");
|
|
}
|
|
|
|
size_sizer->Add(sub_sizer);
|
|
SetSizerAndFit(size_sizer);
|
|
|
|
loaded = true;
|
|
}
|
|
|
|
wxString BrushToolPanel::GetName() const {
|
|
return "Tools";
|
|
}
|
|
|
|
void BrushToolPanel::SetToolbarIconSize(bool d) {
|
|
InvalidateContents();
|
|
large_icons = d;
|
|
}
|
|
|
|
void BrushToolPanel::DeselectAll() {
|
|
if (loaded) {
|
|
optionalBorderButton->SetValue(false);
|
|
eraserButton->SetValue(false);
|
|
normalDoorButton->SetValue(false);
|
|
lockedDoorButton->SetValue(false);
|
|
magicDoorButton->SetValue(false);
|
|
questDoorButton->SetValue(false);
|
|
hatchDoorButton->SetValue(false);
|
|
windowDoorButton->SetValue(false);
|
|
pzBrushButton->SetValue(false);
|
|
nopvpBrushButton->SetValue(false);
|
|
nologBrushButton->SetValue(false);
|
|
pvpzoneBrushButton->SetValue(false);
|
|
}
|
|
}
|
|
|
|
Brush* BrushToolPanel::GetSelectedBrush() const {
|
|
if (optionalBorderButton->GetValue()) {
|
|
return g_gui.optional_brush;
|
|
}
|
|
if (eraserButton->GetValue()) {
|
|
return g_gui.eraser;
|
|
}
|
|
if (normalDoorButton->GetValue()) {
|
|
return g_gui.normal_door_brush;
|
|
}
|
|
if (lockedDoorButton->GetValue()) {
|
|
return g_gui.locked_door_brush;
|
|
}
|
|
if (magicDoorButton->GetValue()) {
|
|
return g_gui.magic_door_brush;
|
|
}
|
|
if (questDoorButton->GetValue()) {
|
|
return g_gui.quest_door_brush;
|
|
}
|
|
if (hatchDoorButton->GetValue()) {
|
|
return g_gui.hatch_door_brush;
|
|
}
|
|
if (windowDoorButton->GetValue()) {
|
|
return g_gui.window_door_brush;
|
|
}
|
|
if (pzBrushButton->GetValue()) {
|
|
return g_gui.pz_brush;
|
|
}
|
|
if (nopvpBrushButton->GetValue()) {
|
|
return g_gui.rook_brush;
|
|
}
|
|
if (nologBrushButton->GetValue()) {
|
|
return g_gui.nolog_brush;
|
|
}
|
|
if (pvpzoneBrushButton->GetValue()) {
|
|
return g_gui.pvp_brush;
|
|
}
|
|
return nullptr;
|
|
}
|
|
|
|
bool BrushToolPanel::SelectBrush(const Brush* whatbrush) {
|
|
BrushButton* button = nullptr;
|
|
if (whatbrush == g_gui.optional_brush) {
|
|
button = optionalBorderButton;
|
|
} else if (whatbrush == g_gui.eraser) {
|
|
button = eraserButton;
|
|
} else if (whatbrush == g_gui.normal_door_brush) {
|
|
button = normalDoorButton;
|
|
} else if (whatbrush == g_gui.locked_door_brush) {
|
|
button = lockedDoorButton;
|
|
} else if (whatbrush == g_gui.magic_door_brush) {
|
|
button = magicDoorButton;
|
|
} else if (whatbrush == g_gui.quest_door_brush) {
|
|
button = questDoorButton;
|
|
} else if (whatbrush == g_gui.hatch_door_brush) {
|
|
button = hatchDoorButton;
|
|
} else if (whatbrush == g_gui.window_door_brush) {
|
|
button = windowDoorButton;
|
|
} else if (whatbrush == g_gui.pz_brush) {
|
|
button = pzBrushButton;
|
|
} else if (whatbrush == g_gui.rook_brush) {
|
|
button = nopvpBrushButton;
|
|
} else if (whatbrush == g_gui.nolog_brush) {
|
|
button = nologBrushButton;
|
|
} else if (whatbrush == g_gui.pvp_brush) {
|
|
button = pvpzoneBrushButton;
|
|
}
|
|
|
|
DeselectAll();
|
|
if (button) {
|
|
button->SetValue(true);
|
|
return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void BrushToolPanel::OnSwitchIn() {
|
|
LoadCurrentContents();
|
|
}
|
|
|
|
void BrushToolPanel::OnClickGravelButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.optional_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickEraserButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.eraser);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickNormalDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.normal_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickLockedDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.locked_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickMagicDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.magic_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickQuestDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.quest_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickHatchDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.hatch_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickWindowDoorButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.window_door_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickPZBrushButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.pz_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickNOPVPBrushButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.rook_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickNoLogoutBrushButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.nolog_brush);
|
|
}
|
|
|
|
void BrushToolPanel::OnClickPVPZoneBrushButton(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SelectBrush(g_gui.pvp_brush);
|
|
}
|
|
|
|
// ============================================================================
|
|
// Brush Button
|
|
|
|
BEGIN_EVENT_TABLE(BrushButton, ItemToggleButton)
|
|
EVT_KEY_DOWN(BrushButton::OnKey)
|
|
END_EVENT_TABLE()
|
|
|
|
BrushButton::BrushButton(wxWindow* parent, Brush* _brush, RenderSize sz, uint32_t id) :
|
|
ItemToggleButton(parent, sz, uint16_t(0), id),
|
|
brush(_brush) {
|
|
ASSERT(sz != RENDER_SIZE_64x64);
|
|
ASSERT(brush);
|
|
SetSprite(brush->getLookID());
|
|
SetToolTip(wxstr(brush->getName()));
|
|
}
|
|
|
|
BrushButton::~BrushButton() {
|
|
////
|
|
}
|
|
|
|
void BrushButton::OnKey(wxKeyEvent &event) {
|
|
g_gui.AddPendingCanvasEvent(event);
|
|
}
|
|
|
|
// ============================================================================
|
|
// Brush Thickness Panel
|
|
|
|
BEGIN_EVENT_TABLE(BrushThicknessPanel, PalettePanel)
|
|
#ifdef __WINDOWS__
|
|
// This only works in wxmsw
|
|
EVT_COMMAND_SCROLL_CHANGED(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
#else
|
|
EVT_COMMAND_SCROLL_TOP(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_BOTTOM(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_LINEUP(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_LINEDOWN(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_PAGEUP(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_PAGEDOWN(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
EVT_COMMAND_SCROLL_THUMBRELEASE(PALETTE_DOODAD_SLIDER, BrushThicknessPanel::OnScroll)
|
|
#endif
|
|
|
|
EVT_CHECKBOX(PALETTE_DOODAD_USE_THICKNESS, BrushThicknessPanel::OnClickCustomThickness)
|
|
END_EVENT_TABLE()
|
|
|
|
BrushThicknessPanel::BrushThicknessPanel(wxWindow* parent) :
|
|
PalettePanel(parent, wxID_ANY) {
|
|
wxSizer* thickness_sizer = newd wxBoxSizer(wxVERTICAL);
|
|
|
|
wxSizer* thickness_sub_sizer = newd wxBoxSizer(wxHORIZONTAL);
|
|
thickness_sub_sizer->Add(20, 10);
|
|
use_button = newd wxCheckBox(this, PALETTE_DOODAD_USE_THICKNESS, "Use custom thickness");
|
|
thickness_sub_sizer->Add(use_button);
|
|
thickness_sizer->Add(thickness_sub_sizer, 1, wxEXPAND);
|
|
|
|
slider = newd wxSlider(this, PALETTE_DOODAD_SLIDER, 5, 1, 10, wxDefaultPosition);
|
|
thickness_sizer->Add(slider, 1, wxEXPAND);
|
|
|
|
SetSizerAndFit(thickness_sizer);
|
|
}
|
|
|
|
BrushThicknessPanel::~BrushThicknessPanel() {
|
|
////
|
|
}
|
|
|
|
wxString BrushThicknessPanel::GetName() const {
|
|
return "Brush Thickness";
|
|
}
|
|
|
|
void BrushThicknessPanel::OnScroll(wxScrollEvent &event) {
|
|
static const int lookup_table[10] = { 1, 2, 3, 5, 8, 13, 23, 35, 50, 80 };
|
|
use_button->SetValue(true);
|
|
|
|
ASSERT(event.GetPosition() >= 1);
|
|
ASSERT(event.GetPosition() <= 10);
|
|
|
|
// printf("SELECT[%d] = %d\n", event.GetPosition()-1, lookup_table[event.GetPosition()-1]);
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushThickness(true, lookup_table[event.GetPosition() - 1], 100);
|
|
}
|
|
|
|
void BrushThicknessPanel::OnClickCustomThickness(wxCommandEvent &event) {
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushThickness(event.IsChecked());
|
|
}
|
|
|
|
void BrushThicknessPanel::OnSwitchIn() {
|
|
static const int lookup_table[10] = { 1, 2, 3, 5, 8, 13, 23, 35, 50, 80 };
|
|
g_gui.ActivatePalette(GetParentPalette());
|
|
g_gui.SetBrushThickness(lookup_table[slider->GetValue() - 1], 100);
|
|
}
|