mirror of
https://github.com/amyinspace/MagicSetEditor2.git
synced 2026-06-11 05:07:00 -04:00
Card list for selecting cards; window using that list; print function using that window (actual printing todo)
git-svn-id: svn://svn.code.sf.net/p/magicseteditor/code/trunk@116 0fc631ac-6414-0410-93d0-97cfa31319b6
This commit is contained in:
@@ -0,0 +1,132 @@
|
||||
//+----------------------------------------------------------------------------+
|
||||
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
|
||||
//| Copyright: (C) 2001 - 2006 Twan van Laarhoven |
|
||||
//| License: GNU General Public License 2 or later (see file COPYING) |
|
||||
//+----------------------------------------------------------------------------+
|
||||
|
||||
// ----------------------------------------------------------------------------- : Includes
|
||||
|
||||
#include <gui/print_window.hpp>
|
||||
#include <gui/card_select_window.hpp>
|
||||
#include <gui/util.hpp>
|
||||
#include <data/set.hpp>
|
||||
|
||||
DECLARE_TYPEOF_COLLECTION(CardP);
|
||||
|
||||
// ----------------------------------------------------------------------------- : Buffering DC
|
||||
|
||||
/// MemoryDC that buffers calls to write text
|
||||
/** The printer device doesn't support alpha channels (at least not in wxMSW)
|
||||
* This would result in black backgrounds where symbols should be transparent
|
||||
* Our solution is:
|
||||
* 1. Write all bitmaps to a buffer DC, initially white
|
||||
* 2. When drawing with alpha: blend with the buffer
|
||||
* 3. When drawing text: buffer the call
|
||||
* 4. Draw the buffer image to the device
|
||||
* 5. Replay the buffered text draw calls
|
||||
* To simplify things this class itself is a fullblown DC, only text calls are buffered for later
|
||||
* Actually buffering text separatly would not be necessary at all, but if we don't the text will be
|
||||
* printed in a low resolution.
|
||||
*/
|
||||
class TextBufferDC : public wxMemoryDC {
|
||||
public:
|
||||
TextBufferDC(UInt width, UInt height);
|
||||
|
||||
virtual void DoDrawText(const String& str, int x, int y);
|
||||
virtual void DoDrawRotatedText(const String& str, int x, int y, double angle);
|
||||
|
||||
/// Copy the contents of the DC to a target device, this DC becomes invalid
|
||||
void drawToDevice(DC& dc, int x = 0, int y = 0);
|
||||
|
||||
private:
|
||||
// A call to DrawText
|
||||
struct TextDraw {
|
||||
wxFont font;
|
||||
Color color;
|
||||
int x, y;
|
||||
String text;
|
||||
double angle;
|
||||
|
||||
TextDraw(wxFont font, Color color, int x, int y, String text, double angle = 0)
|
||||
: font(font), color(color), x(x), y(y), text(text), angle(angle)
|
||||
{}
|
||||
};
|
||||
public:
|
||||
typedef shared_ptr<TextDraw> TextDrawP;
|
||||
private:
|
||||
vector<TextDrawP> text;
|
||||
Bitmap buffer;
|
||||
};
|
||||
|
||||
TextBufferDC::TextBufferDC(UInt width, UInt height)
|
||||
: buffer(width, height, 32)
|
||||
{
|
||||
SelectObject(buffer);
|
||||
// initialize to white
|
||||
clearDC(*this,*wxWHITE_BRUSH);
|
||||
}
|
||||
void TextBufferDC::DoDrawText(const String& str, int x, int y) {
|
||||
text.push_back( new_shared5<TextDraw>(GetFont(), GetTextForeground(), x, y, str) );
|
||||
}
|
||||
void TextBufferDC::DoDrawRotatedText(const String& str, int x, int y, double angle) {
|
||||
text.push_back( new_shared6<TextDraw>(GetFont(), GetTextForeground(), x, y, str, angle) );
|
||||
}
|
||||
|
||||
DECLARE_TYPEOF_COLLECTION(TextBufferDC::TextDrawP);
|
||||
|
||||
void TextBufferDC::drawToDevice(DC& dc, int x, int y) {
|
||||
SelectObject(wxNullBitmap);
|
||||
dc.DrawBitmap(buffer, x, y);
|
||||
FOR_EACH(t, text) {
|
||||
dc.SetFont (t->font);
|
||||
dc.SetTextForeground(t->color);
|
||||
if (t->angle) {
|
||||
dc.DrawRotatedText(t->text, t->x + x, t->y + y, t->angle);
|
||||
} else {
|
||||
dc.DrawText(t->text, t->x + x, t->y + y);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------- : Printout
|
||||
|
||||
// ----------------------------------------------------------------------------- : PrintWindow
|
||||
|
||||
void print_preview(Window* parent, const SetP& set) {
|
||||
// Let the user choose cards
|
||||
CardSelectWindow wnd(parent, set, _LABEL_("select cards print"));
|
||||
if (wnd.ShowModal() != wxID_OK) {
|
||||
return; // cancel
|
||||
}
|
||||
vector<CardP> selected;
|
||||
FOR_EACH(c, set->cards) {
|
||||
if (wnd.isSelected(c)) selected.push_back(c);
|
||||
}
|
||||
/* // Show the print preview
|
||||
wxPreviewFrame frame = new wxPreviewFrame(
|
||||
new wxPrintPreview(
|
||||
new CardsPrintout(set, selected),
|
||||
new CardsPrintout(set, selected)
|
||||
), parent, _TITLE_("print preview"));
|
||||
frame->Initialize();
|
||||
frame->Maximize(true);
|
||||
frame->Show();
|
||||
*/
|
||||
}
|
||||
|
||||
void print_set(Window* parent, const SetP& set) {
|
||||
// Let the user choose cards
|
||||
CardSelectWindow wnd(parent, set, _LABEL_("select cards print"));
|
||||
if (wnd.ShowModal() != wxID_OK) {
|
||||
return; // cancel
|
||||
}
|
||||
vector<CardP> selected;
|
||||
FOR_EACH(c, set->cards) {
|
||||
if (wnd.isSelected(c)) selected.push_back(c);
|
||||
}
|
||||
/* // Print the cards
|
||||
wxPrinter p;
|
||||
CardsPrintout pout(set, selected);
|
||||
p.Print(parent, &pout, true);
|
||||
*/
|
||||
}
|
||||
Reference in New Issue
Block a user