From b586790421edbdca8c2b97385609d418efb7df01 Mon Sep 17 00:00:00 2001 From: twanvl Date: Wed, 6 Aug 2008 03:05:40 +0000 Subject: [PATCH] Cleaned up handling of what things should be drawn by using the DrawWhat enumeration type. git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@1072 0fc631ac-6414-0410-93d0-97cfa31319b6 --- src/data/draw_what.hpp | 29 +++++++++++++++++++++++++ src/gui/control/card_editor.cpp | 30 ++++++++++++-------------- src/gui/control/card_editor.hpp | 7 ++---- src/gui/control/native_look_editor.hpp | 1 - src/gui/control/text_ctrl.hpp | 1 - src/gui/value/text.cpp | 7 +++--- src/mse.vcproj | 3 +++ src/render/card/viewer.cpp | 22 +++++++++++++------ src/render/card/viewer.hpp | 20 ++++++----------- src/render/text/compound.cpp | 24 +++++++++++---------- src/render/text/element.hpp | 9 +------- src/render/text/viewer.cpp | 2 ++ src/render/value/image.cpp | 10 ++++----- src/render/value/text.cpp | 12 ++++------- src/render/value/viewer.cpp | 16 +++++++++++--- src/render/value/viewer.hpp | 2 ++ 16 files changed, 113 insertions(+), 82 deletions(-) create mode 100644 src/data/draw_what.hpp diff --git a/src/data/draw_what.hpp b/src/data/draw_what.hpp new file mode 100644 index 00000000..21be2cad --- /dev/null +++ b/src/data/draw_what.hpp @@ -0,0 +1,29 @@ +//+----------------------------------------------------------------------------+ +//| Description: Magic Set Editor - Program to make Magic (tm) cards | +//| Copyright: (C) 2001 - 2008 Twan van Laarhoven and "coppro" | +//| License: GNU General Public License 2 or later (see file COPYING) | +//+----------------------------------------------------------------------------+ + +#ifndef HEADER_DATA_DRAW_WHAT +#define HEADER_DATA_DRAW_WHAT + +// ----------------------------------------------------------------------------- : Includes + +#include + +// ----------------------------------------------------------------------------- : DrawWhat + +/// What should be drawn? +enum DrawWhat +{ DRAW_NOTHING = 0x00 +, DRAW_NORMAL = 0x01 // draw normal things, like the text +, DRAW_BORDERS = 0x10 // draw editor stuff, such as borders/lines, can be disabled. +, DRAW_BOXES = 0x20 // draw editor stuff, such as borders/lines, can be disabled. +, DRAW_EDITING = 0x40 // draw other editor stuff, can be disabled. +, DRAW_ERRORS = 0x80 // draw error indicators, can't be disabled +, DRAW_ACTIVE = 0x100 // draw active editor stuff, such as hidden separators and atom highlights +, DRAW_NATIVELOOK = 0x200 // use a native look +}; + +// ----------------------------------------------------------------------------- : EOF +#endif diff --git a/src/gui/control/card_editor.cpp b/src/gui/control/card_editor.cpp index f045b691..f38eafe1 100644 --- a/src/gui/control/card_editor.cpp +++ b/src/gui/control/card_editor.cpp @@ -39,26 +39,24 @@ ValueViewerP DataEditor::makeViewer(const StyleP& style) { // ----------------------------------------------------------------------------- : Utility for ValueViewers -bool DataEditor::drawBorders() const { - return !nativeLook() && - settings.stylesheetSettingsFor(set->stylesheetFor(card)).card_borders(); -} -bool DataEditor::drawEditing() const { - return nativeLook() || - settings.stylesheetSettingsFor(set->stylesheetFor(card)).card_draw_editing(); -} -bool DataEditor::drawFocus() const { - return FindFocus() == this; +DrawWhat DataEditor::drawWhat(const ValueViewer* viewer) const { + int what = DRAW_NORMAL + | DRAW_ACTIVE * viewerIsCurrent(viewer); + if (nativeLook()) { + what |= DRAW_BOXES | DRAW_EDITING | DRAW_NATIVELOOK; + } else { + StyleSheetSettings& ss = settings.stylesheetSettingsFor(set->stylesheetFor(card)); + what |= DRAW_BORDERS * ss.card_borders() + | (DRAW_BOXES | DRAW_EDITING) * ss.card_draw_editing() + | DRAW_ERRORS; + } + return (DrawWhat)what; } -wxPen DataEditor::borderPen(bool active) const { - return active ? wxPen(Color(0,128,255), 1, wxSOLID) - : wxPen(Color(128,128,128), 1, wxDOT); +bool DataEditor::viewerIsCurrent(const ValueViewer* viewer) const { + return viewer == current_viewer && FindFocus() == this; } -ValueViewer* DataEditor::focusedViewer() const { - return FindFocus() == this ? current_viewer : nullptr; -} void DataEditor::addAction(Action* action) { set->actions.addAction(action); diff --git a/src/gui/control/card_editor.hpp b/src/gui/control/card_editor.hpp index 0466f78b..f8b18e87 100644 --- a/src/gui/control/card_editor.hpp +++ b/src/gui/control/card_editor.hpp @@ -24,11 +24,8 @@ class DataEditor : public CardViewer { // --------------------------------------------------- : Utility for ValueViewers/Editors - virtual bool drawBorders() const; - virtual bool drawEditing() const; - virtual bool drawFocus() const; - virtual wxPen borderPen(bool active) const; - virtual ValueViewer* focusedViewer() const; + virtual DrawWhat drawWhat(const ValueViewer*) const; + virtual bool viewerIsCurrent(const ValueViewer*) const; virtual void addAction(Action* action); inline SetP getSetForActions() { return set; } diff --git a/src/gui/control/native_look_editor.hpp b/src/gui/control/native_look_editor.hpp index 951c3c37..7987ed4e 100644 --- a/src/gui/control/native_look_editor.hpp +++ b/src/gui/control/native_look_editor.hpp @@ -23,7 +23,6 @@ class NativeLookEditor : public DataEditor { /// Uses a native look virtual bool nativeLook() const { return true; } - virtual bool drawBorders() const { return false; } virtual Rotation getRotation() const; virtual void draw(DC& dc); diff --git a/src/gui/control/text_ctrl.hpp b/src/gui/control/text_ctrl.hpp index 0b0aac27..a93fff47 100644 --- a/src/gui/control/text_ctrl.hpp +++ b/src/gui/control/text_ctrl.hpp @@ -50,7 +50,6 @@ class TextCtrl : public DataEditor { /// Uses a native look virtual bool nativeLook() const { return true; } - virtual bool drawBorders() const { return false; } virtual Rotation getRotation() const; virtual void draw(DC& dc); diff --git a/src/gui/value/text.cpp b/src/gui/value/text.cpp index f98b0d1b..b16f2e82 100644 --- a/src/gui/value/text.cpp +++ b/src/gui/value/text.cpp @@ -1318,7 +1318,8 @@ void TextValueEditor::redrawWordListIndicators(bool toggling_dropdown) { void TextValueEditor::drawWordListIndicators(RotatedDC& dc, bool redrawing) { if (word_lists.empty()) return; - bool current = isCurrent(); + DrawWhat what = viewer.drawWhat(this); + bool current = what & DRAW_ACTIVE; // Draw lines around fields FOR_EACH(wl, word_lists) { RealRect& r = wl->rect; @@ -1345,7 +1346,7 @@ void TextValueEditor::drawWordListIndicators(RotatedDC& dc, bool redrawing) { if (!redrawing) { wl->behind = dc.GetBackground(RealRect(r.right(), r.top() - 1, 10, r.height + 3)); } - if (current || viewer.drawEditing()) { + if (what & (DRAW_ACTIVE | DRAW_BOXES)) { // draw rectangle around value dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(r.move(-1,-1,2,2)); @@ -1368,7 +1369,7 @@ void TextValueEditor::drawWordListIndicators(RotatedDC& dc, bool redrawing) { small = (wl.get() != hovered_words); } if (small) { - if (viewer.drawEditing()) { + if (what & DRAW_BOXES) { dc.DrawRectangle(RealRect(r.right(), r.top() - 1, 2, r.height + 2)); } } else { diff --git a/src/mse.vcproj b/src/mse.vcproj index b67862a4..3afffa0d 100644 --- a/src/mse.vcproj +++ b/src/mse.vcproj @@ -1853,6 +1853,9 @@ + + diff --git a/src/render/card/viewer.cpp b/src/render/card/viewer.cpp index f428f574..ea7fbe84 100644 --- a/src/render/card/viewer.cpp +++ b/src/render/card/viewer.cpp @@ -96,13 +96,21 @@ void DataViewer::updateStyles(bool only_content_dependent) { // ----------------------------------------------------------------------------- : Utility for ValueViewers -bool DataViewer::nativeLook() const { return false; } -bool DataViewer::drawBorders() const { return false; } -bool DataViewer::drawEditing() const { return false; } -bool DataViewer::drawFocus() const { return false; } -wxPen DataViewer::borderPen(bool) const { return wxPen(); } -ValueViewer* DataViewer::focusedViewer() const { return nullptr; } -Context& DataViewer::getContext() const { return set->getContext(card); } +bool DataViewer::nativeLook() const { + return false; +} + +DrawWhat DataViewer::drawWhat(const ValueViewer*) const { + return (DrawWhat)(DRAW_NORMAL | nativeLook() * DRAW_NATIVELOOK); +} + +bool DataViewer::viewerIsCurrent(const ValueViewer*) const { + return false; +} + +Context& DataViewer::getContext() const { + return set->getContext(card); +} Rotation DataViewer::getRotation() const { if (!stylesheet) stylesheet = set->stylesheet; diff --git a/src/render/card/viewer.hpp b/src/render/card/viewer.hpp index 4dc42651..19e16d0c 100644 --- a/src/render/card/viewer.hpp +++ b/src/render/card/viewer.hpp @@ -12,6 +12,7 @@ #include #include #include +#include DECLARE_POINTER_TYPE(Style); DECLARE_POINTER_TYPE(ValueViewer); @@ -39,20 +40,11 @@ class DataViewer : public SetView { /// Should the ValueViewers use a platform native look and feel? /** false by default, can be overloaded */ virtual bool nativeLook() const; - /// Should field borders be drawn? - /** false by default, can be overloaded */ - virtual bool drawBorders() const; - /// Should editing specific things be drawn? - /** false by default, can be overloaded */ - virtual bool drawEditing() const; - /// Should focus only editing specific things be drawn? - /** false by default, can be overloaded */ - virtual bool drawFocus() const; - /// Pens for drawing field borders (only called if drawBorders()) - virtual wxPen borderPen(bool active) const; - /// The viewer that is currently focused, may be null - /** null by default, can be overloaded */ - virtual ValueViewer* focusedViewer() const; + /// Which things should be drawn for the given viewer? + /** can be overloaded */ + virtual DrawWhat drawWhat(const ValueViewer*) const; + /// Is the given viewer currently selected? + virtual bool viewerIsCurrent(const ValueViewer*) const; /// Get a script context to use for scripts in the viewers Context& getContext() const; /// The rotation to use diff --git a/src/render/text/compound.cpp b/src/render/text/compound.cpp index bb9e9dfd..da93e023 100644 --- a/src/render/text/compound.cpp +++ b/src/render/text/compound.cpp @@ -39,17 +39,19 @@ void AtomTextElement::draw(RotatedDC& dc, double scale, const RealRect& rect, co void ErrorTextElement::draw(RotatedDC& dc, double scale, const RealRect& rect, const double* xs, DrawWhat what, size_t start, size_t end) const { // Draw wavy underline - dc.SetPen(*wxRED_PEN); - RealPoint pos = rect.bottomLeft() - dc.trInvS(RealSize(0,2)); - RealSize dx(dc.trInvS(2), 0), dy(0, dc.trInvS(1)); - while (pos.x + 1 < rect.right()) { - dc.DrawLine(pos - dy, pos + dx + dy); - pos += dx; - dy = -dy; - } - if (pos.x < rect.right()) { - // final piece - dc.DrawLine(pos - dy, pos + dx / 2); + if (what & DRAW_ERRORS) { + dc.SetPen(*wxRED_PEN); + RealPoint pos = rect.bottomLeft() - dc.trInvS(RealSize(0,2)); + RealSize dx(dc.trInvS(2), 0), dy(0, dc.trInvS(1)); + while (pos.x + 1 < rect.right()) { + dc.DrawLine(pos - dy, pos + dx + dy); + pos += dx; + dy = -dy; + } + if (pos.x < rect.right()) { + // final piece + dc.DrawLine(pos - dy, pos + dx / 2); + } } // Draw the contents CompoundTextElement::draw(dc, scale, rect, xs, what, start, end); diff --git a/src/render/text/element.hpp b/src/render/text/element.hpp index 34622eed..8d532f5e 100644 --- a/src/render/text/element.hpp +++ b/src/render/text/element.hpp @@ -13,6 +13,7 @@ #include #include #include +#include DECLARE_POINTER_TYPE(TextElement); DECLARE_POINTER_TYPE(Font); @@ -22,14 +23,6 @@ class SymbolFontRef; // ----------------------------------------------------------------------------- : TextElement -/// What should be drawn? -enum DrawWhat -{ DRAW_NOTHING = 0x00 -, DRAW_NORMAL = 0x01 // draw normal things, like the text -, DRAW_BORDERS = 0x02 // draw editor stuff, such as borders/lines -, DRAW_ACTIVE = 0x04 // draw active editor stuff, such as hidden separators and atom highlights -}; - /// Information on a linebreak enum LineBreak { BREAK_NO // no line break ever diff --git a/src/render/text/viewer.cpp b/src/render/text/viewer.cpp index a16c4fde..19e59b61 100644 --- a/src/render/text/viewer.cpp +++ b/src/render/text/viewer.cpp @@ -70,6 +70,8 @@ TextViewer::~TextViewer() {} void TextViewer::draw(RotatedDC& dc, const TextStyle& style, DrawWhat what) { assert(!lines.empty()); + // draw anything? + if (what == DRAW_NOTHING) return; // separator lines? // do this first, so pen is still set from drawing the field border if (what & DRAW_BORDERS) { diff --git a/src/render/value/image.cpp b/src/render/value/image.cpp index c12eb028..e2d2a13e 100644 --- a/src/render/value/image.cpp +++ b/src/render/value/image.cpp @@ -18,6 +18,7 @@ DECLARE_TYPEOF_COLLECTION(wxPoint); IMPLEMENT_VALUE_VIEWER(Image); void ImageValueViewer::draw(RotatedDC& dc) { + DrawWhat what = viewer.drawWhat(this); // reset? int w = max(0,(int)dc.trX(style().width)), h = max(0,(int)dc.trY(style().height)); int a = dc.trAngle(0); //% TODO : Add getAngle()? @@ -45,8 +46,8 @@ void ImageValueViewer::draw(RotatedDC& dc) { if (!image.Ok() && style().default_image.isReady()) { image = style().default_image.generate(GeneratedImage::Options(w, h, &getStylePackage(), &getLocalPackage())); is_default = true; - if (viewer.drawEditing()) { - bitmap = imagePlaceholder(dc, w, h, image, viewer.drawEditing()); + if (what & DRAW_EDITING) { + bitmap = imagePlaceholder(dc, w, h, image, what & DRAW_EDITING); if (alpha_mask || a) { image = bitmap.ConvertToImage(); // we need to convert back to an image } else { @@ -57,7 +58,7 @@ void ImageValueViewer::draw(RotatedDC& dc) { // checkerboard placeholder if (!image.Ok() && !bitmap.Ok() && style().width > 40) { // placeholder bitmap - bitmap = imagePlaceholder(dc, w, h, wxNullImage, viewer.drawEditing()); + bitmap = imagePlaceholder(dc, w, h, wxNullImage, what & DRAW_EDITING); if (alpha_mask || a) { // we need to convert back to an image image = bitmap.ConvertToImage(); @@ -83,8 +84,7 @@ void ImageValueViewer::draw(RotatedDC& dc) { void ImageValueViewer::drawFieldBorder(RotatedDC& dc) { if (!alpha_mask) { ValueViewer::drawFieldBorder(dc); - } else if (viewer.drawBorders() && field().editable) { - dc.SetPen(viewer.borderPen(isCurrent())); + } else if (setFieldBorderPen(dc)) { dc.SetBrush(*wxTRANSPARENT_BRUSH); vector points; alpha_mask->convexHull(points); diff --git a/src/render/value/text.cpp b/src/render/value/text.cpp index 3b4c8f3c..2d63d567 100644 --- a/src/render/value/text.cpp +++ b/src/render/value/text.cpp @@ -32,14 +32,10 @@ void TextValueViewer::draw(RotatedDC& dc) { v.prepare(dc, value().value(), style(), viewer.getContext()); dc.setStretch(getStretch()); } - if (viewer.drawFocus() && isCurrent()) { - v.draw(dc, style(), DRAW_ACTIVE); - } - if (viewer.drawBorders()) dc.SetPen(viewer.borderPen(isCurrent())); - v.draw(dc, style(), (DrawWhat)( - DRAW_NORMAL - | (viewer.drawBorders() ? DRAW_BORDERS : 0) - )); + DrawWhat what = viewer.drawWhat(this); + v.draw(dc, style(), (DrawWhat)(what & DRAW_ACTIVE)); + setFieldBorderPen(dc); + v.draw(dc, style(), (DrawWhat)(what & ~DRAW_ACTIVE)); } void TextValueViewer::onValueChange() { diff --git a/src/render/value/viewer.cpp b/src/render/value/viewer.cpp index 3f1ff07d..0fe5916a 100644 --- a/src/render/value/viewer.cpp +++ b/src/render/value/viewer.cpp @@ -40,9 +40,19 @@ Rotation ValueViewer::getRotation() const { return Rotation(getStyle()->angle, getStyle()->getExternalRect(), 1.0, getStretch()); } +bool ValueViewer::setFieldBorderPen(RotatedDC& dc) { + if (!getField()->editable) return false; + DrawWhat what = viewer.drawWhat(this); + if (!(what & DRAW_BORDERS)) return false; + dc.SetPen( (what & DRAW_ACTIVE) + ? wxPen(Color(0,128,255), 1, wxSOLID) + : wxPen(Color(128,128,128), 1, wxDOT) + ); + return true; +} + void ValueViewer::drawFieldBorder(RotatedDC& dc) { - if (viewer.drawBorders() && getField()->editable) { - dc.SetPen(viewer.borderPen(isCurrent())); + if (setFieldBorderPen(dc)) { dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(dc.getInternalRect().grow(dc.trInvS(1))); } @@ -56,7 +66,7 @@ bool ValueViewer::nativeLook() const { return viewer.nativeLook(); } bool ValueViewer::isCurrent() const { - return viewer.focusedViewer() == this; + return viewer.viewerIsCurrent(this); } void ValueViewer::onStyleChange(int changes) { diff --git a/src/render/value/viewer.hpp b/src/render/value/viewer.hpp index b87169af..8ca37e32 100644 --- a/src/render/value/viewer.hpp +++ b/src/render/value/viewer.hpp @@ -75,6 +75,8 @@ class ValueViewer : public StyleListener { protected: ValueP valueP; ///< The value we are currently viewing + /// Set the pen for drawing the border, returns true if a border needs to be drawn + bool setFieldBorderPen(RotatedDC& dc); /// Draws a border around the field void drawFieldBorder(RotatedDC& dc);