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
This commit is contained in:
twanvl
2008-08-06 03:05:40 +00:00
parent 6c782bb033
commit b586790421
16 changed files with 113 additions and 82 deletions
+15 -7
View File
@@ -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;
+6 -14
View File
@@ -12,6 +12,7 @@
#include <util/prec.hpp>
#include <util/rotation.hpp>
#include <data/set.hpp>
#include <data/draw_what.hpp>
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
+13 -11
View File
@@ -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);
+1 -8
View File
@@ -13,6 +13,7 @@
#include <util/rotation.hpp>
#include <util/real_point.hpp>
#include <data/font.hpp>
#include <data/draw_what.hpp>
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
+2
View File
@@ -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) {
+5 -5
View File
@@ -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<wxPoint> points;
alpha_mask->convexHull(points);
+4 -8
View File
@@ -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() {
+13 -3
View File
@@ -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) {
+2
View File
@@ -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);