From d4e46e06d89cf442c8478dad395b4acff515369e Mon Sep 17 00:00:00 2001 From: twanvl Date: Sat, 7 Jul 2007 18:04:02 +0000 Subject: [PATCH] 'Edit' and 'gallery' button for symbol editor git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@522 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/gui/value/symbol.cpp | 90 +++++++++++++++++++++++++++++++- src/gui/value/symbol.hpp | 12 +++++ src/render/value/information.cpp | 1 + src/render/value/symbol.cpp | 7 --- src/render/value/symbol.hpp | 2 +- src/util/rotation.cpp | 2 +- 6 files changed, 103 insertions(+), 11 deletions(-) diff --git a/src/gui/value/symbol.cpp b/src/gui/value/symbol.cpp index f2a65bcf..29e58d32 100644 --- a/src/gui/value/symbol.cpp +++ b/src/gui/value/symbol.cpp @@ -11,10 +11,96 @@ // ----------------------------------------------------------------------------- : SymbolValueEditor -IMPLEMENT_VALUE_EDITOR(Symbol) {} +IMPLEMENT_VALUE_EDITOR(Symbol) + , button_down(-2) +{} + +void SymbolValueEditor::draw(RotatedDC& dc) { + SymbolValueViewer::draw(dc); + // draw helper text if there are no symbols + if (symbols.empty()) { + dc.SetFont(wxFont(10,wxSWISS,wxNORMAL,wxNORMAL)); + dc.SetTextForeground(*wxBLACK); + RealSize text_size = dc.GetTextExtent(_("double click to edit symbol")); + dc.DrawText(_("double click to edit symbol"), align_in_rect(ALIGN_MIDDLE_CENTER, text_size, style().getRect())); + } + if (nativeLook()) { + // draw editor buttons + dc.SetFont(*wxNORMAL_FONT); + drawButton(dc, 0, _("Edit")); + drawButton(dc, 1, _("Gallery")); + } +} +void SymbolValueEditor::drawButton(RotatedDC& dc, int button, const String& text) { + bool down = button == button_down; + double size = style().height; + double x = style().right - size - (size + 1) * button; + double y = style().top; + // draw button + dc.SetPen(*wxTRANSPARENT_PEN); + dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_BTNFACE)); + dc.DrawRectangle(RealRect(x, y, size, size)); + dc.SetPen(wxSystemSettings::GetColour(down ? wxSYS_COLOUR_BTNSHADOW : wxSYS_COLOUR_BTNHIGHLIGHT)); + dc.DrawLine(RealPoint(x,y),RealPoint(x+size,y)); + dc.DrawLine(RealPoint(x,y),RealPoint(x,y+size)); + dc.SetPen(wxSystemSettings::GetColour(down ? wxSYS_COLOUR_BTNHIGHLIGHT : wxSYS_COLOUR_BTNSHADOW)); + dc.DrawLine(RealPoint(x+size-1,y),RealPoint(x+size-1,y+size)); + dc.DrawLine(RealPoint(x,y+size-1),RealPoint(x+size,y+size-1)); + // draw text + RealSize text_size = dc.GetTextExtent(text); + dc.DrawText(text, align_in_rect((Alignment)(ALIGN_BOTTOM | ALIGN_CENTER), text_size, RealRect(x, y, size,size*0.9))); +} + +int SymbolValueEditor::findButton(const RealPoint& pos) { + if (pos.y < style().top || pos.y >= style().bottom) return -1; + int button = (int)floor( (style().right - pos.x) / (style().height + 1) ); + if (button >= 0 && button <= 1) return button; + return -1; +} + +bool SymbolValueEditor::onLeftDown(const RealPoint& pos, wxMouseEvent&) { + if (!nativeLook()) return false; + int button = findButton(pos); + if (button != button_down) { + button_down = button; + viewer.redraw(*this); + } + return true; +} +bool SymbolValueEditor::onMotion(const RealPoint& pos, wxMouseEvent& ev) { + if (button_down != -2) { + int button = findButton(pos); + if (button != button_down) { + button_down = button; + viewer.redraw(*this); + } + } + return true; +} + +bool SymbolValueEditor::onLeftUp(const RealPoint& pos, wxMouseEvent&) { + if (!nativeLook()) return false; + if (button_down == 0) { + // edit + button_down = -2; + viewer.redraw(*this); + SymbolWindow* wnd = new SymbolWindow(nullptr, valueP(), viewer.getSet()); + wnd->Show(); + return true; + } else if (button_down == 1) { + // gallery + button_down = -2; + viewer.redraw(*this); + // TODO + return true; + } else { + button_down = -2; + return false; + } +} bool SymbolValueEditor::onLeftDClick(const RealPoint& pos, wxMouseEvent&) { - // TODO : use SetWindow as parent? Maybe not, the symbol editor will stay open when mainwindow closes + // Use SetWindow as parent? Maybe not, the symbol editor will stay open when mainwindow closes SymbolWindow* wnd = new SymbolWindow(nullptr, valueP(), viewer.getSet()); wnd->Show(); return true; diff --git a/src/gui/value/symbol.hpp b/src/gui/value/symbol.hpp index 817b09a0..fa3183ee 100644 --- a/src/gui/value/symbol.hpp +++ b/src/gui/value/symbol.hpp @@ -20,8 +20,20 @@ class SymbolValueEditor : public SymbolValueViewer, public ValueEditor { public: DECLARE_VALUE_EDITOR(Symbol); + virtual void draw(RotatedDC& dc); + virtual bool onLeftDown (const RealPoint& pos, wxMouseEvent&); + virtual bool onLeftUp (const RealPoint& pos, wxMouseEvent&); virtual bool onLeftDClick(const RealPoint& pos, wxMouseEvent&); + virtual bool onMotion (const RealPoint& pos, wxMouseEvent&); virtual void determineSize(bool); + private: + /// Draw a button, buttons are numbered from the right + void drawButton(RotatedDC& dc, int button, const String& text); + /// Is there a button at the given position? returns the button index, or -1 if there is no button + int findButton(const RealPoint& pos); + + // button, or -1 for mouse down, but not on button, or -2 for mouse not down + int button_down; }; // ----------------------------------------------------------------------------- : EOF diff --git a/src/render/value/information.cpp b/src/render/value/information.cpp index 3df86daf..f2efa783 100644 --- a/src/render/value/information.cpp +++ b/src/render/value/information.cpp @@ -12,6 +12,7 @@ // ----------------------------------------------------------------------------- : InfoValueViewer void InfoValueViewer::draw(RotatedDC& dc) { + dc.SetPen(*wxTRANSPARENT_PEN); if (nativeLook()) { dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_APPWORKSPACE)); diff --git a/src/render/value/symbol.cpp b/src/render/value/symbol.cpp index 1160f5ce..0ec7336c 100644 --- a/src/render/value/symbol.cpp +++ b/src/render/value/symbol.cpp @@ -43,13 +43,6 @@ void SymbolValueViewer::draw(RotatedDC& dc) { // todo : labels? dc.DrawBitmap(symbols[i], style().getPos() + RealSize(i * (wh + 2), 0)); } - // draw helper text if there are no symbols - if (symbols.empty()) { - dc.SetFont(wxFont(10,wxSWISS,wxNORMAL,wxNORMAL)); - dc.SetTextForeground(*wxBLACK); - RealSize text_size = dc.GetTextExtent(_("double click to edit symbol")); - dc.DrawText(_("double click to edit symbol"), align_in_rect(ALIGN_MIDDLE_CENTER, text_size, style().getRect())); - } } void SymbolValueViewer::onValueChange() { diff --git a/src/render/value/symbol.hpp b/src/render/value/symbol.hpp index d3c03038..2fe0ecd9 100644 --- a/src/render/value/symbol.hpp +++ b/src/render/value/symbol.hpp @@ -23,7 +23,7 @@ class SymbolValueViewer : public ValueViewer { virtual void draw(RotatedDC& dc); void onValueChange(); - private: + protected: vector symbols; ///< Cached images }; diff --git a/src/util/rotation.cpp b/src/util/rotation.cpp index e2f09076..46ef6675 100644 --- a/src/util/rotation.cpp +++ b/src/util/rotation.cpp @@ -120,7 +120,7 @@ Rotater::~Rotater() { // ----------------------------------------------------------------------------- : RotatedDC RotatedDC::RotatedDC(DC& dc, int angle, const RealRect& rect, double zoom, RenderQuality quality, bool is_internal) - : Rotation(angle, rect, zoom, is_internal) + : Rotation(angle, rect, zoom, 1.0, is_internal) , dc(dc), quality(quality) {}