From 29b571499a38273c6c693334512e44f4162171a5 Mon Sep 17 00:00:00 2001 From: Shamus Hammons Date: Thu, 19 Mar 2009 21:01:07 +0000 Subject: [PATCH] Separated out app object, added character window. --- Makefile | 54 +- src/charwindow.cpp | 167 ++++- src/charwindow.h | 25 +- src/editwindow.cpp | 1619 +------------------------------------------- src/editwindow.h | 41 -- src/ttedit.cpp | 327 +-------- src/ttedit.h | 75 +- ttedit.pro | 6 + 8 files changed, 273 insertions(+), 2041 deletions(-) diff --git a/Makefile b/Makefile index 8dc2ae1..baaff93 100755 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: ttedit -# Generated by qmake (2.01a) (Qt 4.5.0-rc1) on: Fri Mar 13 16:09:54 2009 +# Generated by qmake (2.01a) (Qt 4.5.0) on: Thu Mar 19 15:27:43 2009 # Project: ttedit.pro # Template: app # Command: /usr/bin/qmake -unix -o Makefile ttedit.pro @@ -43,25 +43,31 @@ OBJECTS_DIR = obj/ ####### Files SOURCES = src/ttedit.cpp \ + src/ttemainwindow.cpp \ src/editwindow.cpp \ src/glyphpoints.cpp \ src/debug.cpp \ src/toolwindow.cpp \ + src/charwindow.cpp \ src/vector.cpp \ - src/graphicprimitives.cpp obj/moc_ttedit.cpp \ + src/graphicprimitives.cpp obj/moc_ttemainwindow.cpp \ obj/moc_editwindow.cpp \ obj/moc_toolwindow.cpp \ + obj/moc_charwindow.cpp \ obj/qrc_ttedit.cpp OBJECTS = obj/ttedit.o \ + obj/ttemainwindow.o \ obj/editwindow.o \ obj/glyphpoints.o \ obj/debug.o \ obj/toolwindow.o \ + obj/charwindow.o \ obj/vector.o \ obj/graphicprimitives.o \ - obj/moc_ttedit.o \ + obj/moc_ttemainwindow.o \ obj/moc_editwindow.o \ obj/moc_toolwindow.o \ + obj/moc_charwindow.o \ obj/qrc_ttedit.o DIST = /usr/share/qt4/mkspecs/common/g++.conf \ /usr/share/qt4/mkspecs/common/unix.conf \ @@ -159,7 +165,7 @@ qmake: FORCE dist: @$(CHK_DIR_EXISTS) obj/ttedit1.0.0 || $(MKDIR) obj/ttedit1.0.0 - $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/ttedit1.0.0/ && $(COPY_FILE) --parents src/ttedit.h src/editwindow.h src/glyphpoints.h src/types.h src/debug.h src/toolwindow.h src/vector.h src/graphicprimitives.h src/list.h obj/ttedit1.0.0/ && $(COPY_FILE) --parents ttedit.qrc obj/ttedit1.0.0/ && $(COPY_FILE) --parents src/ttedit.cpp src/editwindow.cpp src/glyphpoints.cpp src/debug.cpp src/toolwindow.cpp src/vector.cpp src/graphicprimitives.cpp obj/ttedit1.0.0/ && (cd `dirname obj/ttedit1.0.0` && $(TAR) ttedit1.0.0.tar ttedit1.0.0 && $(COMPRESS) ttedit1.0.0.tar) && $(MOVE) `dirname obj/ttedit1.0.0`/ttedit1.0.0.tar.gz . && $(DEL_FILE) -r obj/ttedit1.0.0 + $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/ttedit1.0.0/ && $(COPY_FILE) --parents src/ttedit.h src/ttemainwindow.h src/editwindow.h src/glyphpoints.h src/types.h src/debug.h src/toolwindow.h src/charwindow.h src/vector.h src/graphicprimitives.h src/list.h obj/ttedit1.0.0/ && $(COPY_FILE) --parents ttedit.qrc obj/ttedit1.0.0/ && $(COPY_FILE) --parents src/ttedit.cpp src/ttemainwindow.cpp src/editwindow.cpp src/glyphpoints.cpp src/debug.cpp src/toolwindow.cpp src/charwindow.cpp src/vector.cpp src/graphicprimitives.cpp obj/ttedit1.0.0/ && (cd `dirname obj/ttedit1.0.0` && $(TAR) ttedit1.0.0.tar ttedit1.0.0 && $(COMPRESS) ttedit1.0.0.tar) && $(MOVE) `dirname obj/ttedit1.0.0`/ttedit1.0.0.tar.gz . && $(DEL_FILE) -r obj/ttedit1.0.0 clean:compiler_clean @@ -178,22 +184,26 @@ mocclean: compiler_moc_header_clean compiler_moc_source_clean mocables: compiler_moc_header_make_all compiler_moc_source_make_all -compiler_moc_header_make_all: obj/moc_ttedit.cpp obj/moc_editwindow.cpp obj/moc_toolwindow.cpp +compiler_moc_header_make_all: obj/moc_ttemainwindow.cpp obj/moc_editwindow.cpp obj/moc_toolwindow.cpp obj/moc_charwindow.cpp compiler_moc_header_clean: - -$(DEL_FILE) obj/moc_ttedit.cpp obj/moc_editwindow.cpp obj/moc_toolwindow.cpp -obj/moc_ttedit.cpp: src/ttedit.h - /usr/bin/moc $(DEFINES) $(INCPATH) src/ttedit.h -o obj/moc_ttedit.cpp + -$(DEL_FILE) obj/moc_ttemainwindow.cpp obj/moc_editwindow.cpp obj/moc_toolwindow.cpp obj/moc_charwindow.cpp +obj/moc_ttemainwindow.cpp: src/ttemainwindow.h + /usr/bin/moc $(DEFINES) $(INCPATH) src/ttemainwindow.h -o obj/moc_ttemainwindow.cpp obj/moc_editwindow.cpp: src/types.h \ src/toolwindow.h \ src/glyphpoints.h \ - src/ttedit.h \ src/editwindow.h /usr/bin/moc $(DEFINES) $(INCPATH) src/editwindow.h -o obj/moc_editwindow.cpp obj/moc_toolwindow.cpp: src/toolwindow.h /usr/bin/moc $(DEFINES) $(INCPATH) src/toolwindow.h -o obj/moc_toolwindow.cpp +obj/moc_charwindow.cpp: src/glyphpoints.h \ + src/types.h \ + src/charwindow.h + /usr/bin/moc $(DEFINES) $(INCPATH) src/charwindow.h -o obj/moc_charwindow.cpp + compiler_rcc_make_all: obj/qrc_ttedit.cpp compiler_rcc_clean: -$(DEL_FILE) obj/qrc_ttedit.cpp @@ -232,12 +242,16 @@ compiler_clean: compiler_moc_header_clean compiler_rcc_clean ####### Compile obj/ttedit.o: src/ttedit.cpp src/ttedit.h \ + src/ttemainwindow.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/ttedit.o src/ttedit.cpp + +obj/ttemainwindow.o: src/ttemainwindow.cpp src/ttemainwindow.h \ src/editwindow.h \ src/types.h \ src/toolwindow.h \ src/glyphpoints.h \ src/charwindow.h \ - src/tte_res.h \ + src/ttedit.h \ src/debug.h \ res/cur1.xpm \ res/cur2.xpm \ @@ -251,16 +265,17 @@ obj/ttedit.o: src/ttedit.cpp src/ttedit.h \ res/tool1.xpm \ res/tool2.xpm \ res/tool3.xpm - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/ttedit.o src/ttedit.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/ttemainwindow.o src/ttemainwindow.cpp obj/editwindow.o: src/editwindow.cpp src/editwindow.h \ src/types.h \ src/toolwindow.h \ src/glyphpoints.h \ - src/ttedit.h \ src/graphicprimitives.h \ src/debug.h \ - src/vector.h + src/vector.h \ + src/charwindow.h \ + src/ttedit.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/editwindow.o src/editwindow.cpp obj/glyphpoints.o: src/glyphpoints.cpp src/glyphpoints.h \ @@ -275,6 +290,12 @@ obj/toolwindow.o: src/toolwindow.cpp src/toolwindow.h \ src/types.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/toolwindow.o src/toolwindow.cpp +obj/charwindow.o: src/charwindow.cpp src/charwindow.h \ + src/glyphpoints.h \ + src/types.h \ + src/debug.h + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/charwindow.o src/charwindow.cpp + obj/vector.o: src/vector.cpp src/vector.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/vector.o src/vector.cpp @@ -282,8 +303,8 @@ obj/graphicprimitives.o: src/graphicprimitives.cpp src/graphicprimitives.h \ src/types.h $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/graphicprimitives.o src/graphicprimitives.cpp -obj/moc_ttedit.o: obj/moc_ttedit.cpp - $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_ttedit.o obj/moc_ttedit.cpp +obj/moc_ttemainwindow.o: obj/moc_ttemainwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_ttemainwindow.o obj/moc_ttemainwindow.cpp obj/moc_editwindow.o: obj/moc_editwindow.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_editwindow.o obj/moc_editwindow.cpp @@ -291,6 +312,9 @@ obj/moc_editwindow.o: obj/moc_editwindow.cpp obj/moc_toolwindow.o: obj/moc_toolwindow.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_toolwindow.o obj/moc_toolwindow.cpp +obj/moc_charwindow.o: obj/moc_charwindow.cpp + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/moc_charwindow.o obj/moc_charwindow.cpp + obj/qrc_ttedit.o: obj/qrc_ttedit.cpp $(CXX) -c $(CXXFLAGS) $(INCPATH) -o obj/qrc_ttedit.o obj/qrc_ttedit.cpp diff --git a/src/charwindow.cpp b/src/charwindow.cpp index 4c601c8..d9e6ee3 100755 --- a/src/charwindow.cpp +++ b/src/charwindow.cpp @@ -8,19 +8,181 @@ // Who When What // --- ---------- ------------------------------------------------------------- // JLH 08/28/2008 Created this file +// JLH 03/19/2009 Converted from wxWidgets to Qt // // FIXED: // // STILL TO BE DONE: // -// - Fix problem with owned window causing main window refresh problems -// (ironically enough, it doesn't seem to be a problem anymore...) +// - Fix "window disappears when tool win comes up" problem +// - Render of main window points // #include "charwindow.h" +#include "debug.h" + +CharWindow::CharWindow(QWidget * parent/*= NULL*/): QWidget(parent, Qt::Tool), path(NULL) +{ + setWindowTitle("Character: Unknown"); +} + +void CharWindow::MakePathFromPoints(GlyphPoints * gp) +{ + if (gp == NULL) + return; + + if (path != NULL) + delete path; + + path = new QPainterPath(); + +#if 0 + try + { + path->moveTo(gp->GetX(0), gp->GetY(0)); + } + catch (int e) + { + if (e == GP_OUT_OF_RANGE) + WriteLogMsg("CharWindow: Caught GP_OUT_OF_RANGE exception.\n"); + } + + for(int i=1; iGetNumPoints(); i++) + { + } +#endif + + // Draw curve formed by points + + for(int poly=0; polyGetNumPolys(); poly++) + { + if (gp->GetNumPoints(poly) > 2) + { + // Initial move... + // If it's not on curve, then move to it, otherwise move to last point... + + int x, y; + + if (gp->GetOnCurve(poly, gp->GetNumPoints(poly) - 1)) + x = (int)gp->GetX(poly, gp->GetNumPoints(poly) - 1), y = (int)gp->GetY(poly, gp->GetNumPoints(poly) - 1); + else + x = (int)gp->GetX(poly, 0), y = (int)gp->GetY(poly, 0); + + path->moveTo(x, y); + + for(int i=0; iGetNumPoints(poly); i++) + { + if (gp->GetOnCurve(poly, i)) + { +// p.drawLine(x, y, gp->GetX(poly, i), gp->GetY(poly, i)); + x = (int)gp->GetX(poly, i), y = (int)gp->GetY(poly, i); + path->lineTo(x, y); + } + else + { + uint32 prev = gp->GetPrev(poly, i), next = gp->GetNext(poly, i); + float px = gp->GetX(poly, prev), py = gp->GetY(poly, prev), + nx = gp->GetX(poly, next), ny = gp->GetY(poly, next); + + if (!gp->GetOnCurve(poly, prev)) + px = (px + gp->GetX(poly, i)) / 2.0f, + py = (py + gp->GetY(poly, i)) / 2.0f; + + if (!gp->GetOnCurve(poly, next)) + nx = (nx + gp->GetX(poly, i)) / 2.0f, + ny = (ny + gp->GetY(poly, i)) / 2.0f; + +// Bezier(p, point(px, py), point(gp->GetX(poly, i), gp->GetY(poly, i)), point(nx, ny)); +// path->moveTo(px, py); + path->quadTo(gp->GetX(poly, i), gp->GetY(poly, i), nx, ny); + x = (int)nx, y = (int)ny; + + if (gp->GetOnCurve(poly, next)) + i++; // Following point is on curve, so move past it + } + } + + path->closeSubpath(); + } + } + + +#if 0 + // Draw curve formed by points + + for(int poly=0; poly 2) + { + // Initial move... + // If it's not on curve, then move to it, otherwise move to last point... + + int x, y; + + if (pts.GetOnCurve(poly, pts.GetNumPoints(poly) - 1)) + x = (int)pts.GetX(poly, pts.GetNumPoints(poly) - 1), y = (int)pts.GetY(poly, pts.GetNumPoints(poly) - 1); + else + x = (int)pts.GetX(poly, 0), y = (int)pts.GetY(poly, 0); + + for(int i=0; i +#include "glyphpoints.h" + +class CharWindow: public QWidget +{ + Q_OBJECT + + public: + CharWindow(QWidget * parent = NULL); + void MakePathFromPoints(GlyphPoints * gp); + + protected: + QSize minimumSizeHint() const; + QSize sizeHint() const; + void paintEvent(QPaintEvent * event); + + private: + QImage img; + QPainterPath * path; +}; + +#if 0 #include // So that whoever uses this can without having // to pull in a bunch of references manually #include @@ -29,5 +51,6 @@ class CharWindow: public wxMiniFrame DECLARE_EVENT_TABLE() }; +#endif #endif // __CHARWINDOW_H__ diff --git a/src/editwindow.cpp b/src/editwindow.cpp index b0952ca..97546ef 100755 --- a/src/editwindow.cpp +++ b/src/editwindow.cpp @@ -38,8 +38,10 @@ #include "graphicprimitives.h" #include "debug.h" #include "vector.h" +#include "charwindow.h" +#include "ttedit.h" -EditWindow::EditWindow(QWidget * parent/*=NULL*/): QWidget(parent), +EditWindow::EditWindow(QWidget * parent/*= NULL*/): QWidget(parent), scale(1.0), offsetX(-10), offsetY(-10), tool(TOOLSelect), ptHighlight(-1), oldPtHighlight(-1), ptNextHighlight(-1), oldPtNextHighlight(-1), polyFirstPoint(true) @@ -81,8 +83,8 @@ QPoint EditWindow::GetAdjustedMousePosition(QMouseEvent * event) { QSize winSize = size(); // This is undoing the transform, e.g. going from client coords to local coords. - // In essence, the height - y is height + (y * -1), the (y * -1) term doing the conversion - // of the y-axis from increasing bottom to top. + // In essence, the height - y is height + (y * -1), the (y * -1) term doing the + // conversion of the y-axis from increasing bottom to top. return QPoint(offsetX + event->x(), offsetY + (winSize.height() - event->y())); } @@ -94,6 +96,13 @@ QPoint EditWindow::GetAdjustedClientPosition(int x, int y) return QPoint(-offsetX + x, (winSize.height() - (-offsetY + y)) * +1.0); } +/* +TODO: + o Different colors for polys on selected points + o Different colors for handles on non-selected polys + o Line of sight (dashed, dotted) for off-curve points + o Repaints for press/release of CTRL/SHIFT during point creation +*/ void EditWindow::paintEvent(QPaintEvent * /*event*/) { QPainter p(this); @@ -541,1608 +550,10 @@ void EditWindow::mouseReleaseEvent(QMouseEvent * event) { // if (tool == TOOLScroll || tool == TOOLZoom) // ReleaseMouse(); +//this is prolly too much + ((TTEdit *)qApp)->charWnd->MakePathFromPoints(&pts); + ((TTEdit *)qApp)->charWnd->update(); } event->accept(); } - - - -#if 0 -#include "editwindow.h" -#include "graphicprimitives.h" -#include "toolwindow.h" -#include "debug.h" -#include "vector.h" - - -BEGIN_EVENT_TABLE(TTEditWindow, wxWindow) - EVT_PAINT(TTEditWindow::OnPaint) - EVT_MOUSE_EVENTS(TTEditWindow::OnMouseEvent) -END_EVENT_TABLE() - -TTEditWindow::TTEditWindow(wxFrame * parent, const wxPoint &pos, const wxSize &size, long style): - wxWindow(parent, -1, pos, size, style | wxFULL_REPAINT_ON_RESIZE), - app(wxGetApp()), scale(1.0), offsetX(-10), offsetY(-10), tool(TOOLSelect), - ptHighlight(-1), oldPtHighlight(-1), ptNextHighlight(-1), oldPtNextHighlight(-1), - polyFirstPoint(true), bmp(NULL) -{ - SetCursor(*(app.cur[tool])); - SetBackgroundColour(wxColour(0xFF, 0xFF, 0xFF)); - - wxString s; - s.Printf(_("Zoom: %.2f%%"), scale * 100.0); - parent->SetStatusText(s, 1); -} - -TTEditWindow::~TTEditWindow(void) -{ - if (bmp) - delete bmp; -} - -void TTEditWindow::OnPaint(wxPaintEvent &e) -{ - wxPaintDC dc(this); -//Doesn't do crap! -//dc.SetBackground(*wxWHITE_BRUSH); - -// Due to the screwiness of wxWidgets coord system, the origin is ALWAYS -// the upper left corner--regardless of axis orientation, etc... - wxCoord width, height; - dc.GetSize(&width, &height); - - dc.SetDeviceOrigin(-offsetX, height - (-offsetY)); - dc.SetAxisOrientation(true, true); - -// Scrolling can be done by using OffsetViewportOrgEx -// Scaling can be done by adjusting SetWindowExtEx (it's denominator of txform) -// you'd use: % = ViewportExt / WindowExt -// But it makes the window look like crap: fuggetuboutit. -// Instead, we have to scale EVERYTHING by hand. Crap! -// It's not *that* bad, but not as convenient either... - - dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0xFF), 1, wxDOT))); -// dc.DrawLine(0, 0, 10, 10); - - // Draw coordinate axes - - dc.CrossHair(0, 0); - - // Draw points - - for(int i=0; iFindOrCreatePen(wxColour(0xFF, 0x00, 0x00), 1, wxSOLID))); -// SelectObject(hdc, hRedPen1); - - if (pts.GetOnCurve(i)) - { - DrawSquareDotN(dc, pts.GetX(i), pts.GetY(i), 7); - DrawSquareDotN(dc, pts.GetX(i), pts.GetY(i), 9); - } - else - { - DrawRoundDotN(dc, pts.GetX(i), pts.GetY(i), 7); - DrawRoundDotN(dc, pts.GetX(i), pts.GetY(i), 9); - } - } - else if ((i == ptHighlight || i == ptNextHighlight) && tool == TOOLAddPt) - { - dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0xAF, 0x00), 1, wxSOLID))); -// SelectObject(hdc, hGreenPen1); - - if (pts.GetOnCurve(i)) - { - DrawSquareDotN(dc, pts.GetX(i), pts.GetY(i), 7); - DrawSquareDotN(dc, pts.GetX(i), pts.GetY(i), 9); - } - else - { - DrawRoundDotN(dc, pts.GetX(i), pts.GetY(i), 7); - DrawRoundDotN(dc, pts.GetX(i), pts.GetY(i), 9); - } - } - else - { - dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0x00), 1, wxSOLID))); -// SelectObject(hdc, hBlackPen1); - - if (pts.GetOnCurve(i)) - DrawSquareDot(dc, pts.GetX(i), pts.GetY(i)); - else - DrawRoundDot(dc, pts.GetX(i), pts.GetY(i)); - } - - if (tool == TOOLDelPt && i == ptHighlight) - { - dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0xFF, 0x00, 0x00), 1, wxSOLID))); -// SelectObject(hdc, hRedPen1); -// MoveToEx(hdc, pts.GetX(i) - 5, pts.GetY(i) - 5, NULL); -// LineTo(hdc, pts.GetX(i) + 5, pts.GetY(i) + 5); -// LineTo(hdc, pts.GetX(i) - 5, pts.GetY(i) - 5);//Lameness! -// MoveToEx(hdc, pts.GetX(i) - 5, pts.GetY(i) + 5, NULL); -// LineTo(hdc, pts.GetX(i) + 5, pts.GetY(i) - 5); -// LineTo(hdc, pts.GetX(i) - 5, pts.GetY(i) + 5);//More lameness!! - dc.DrawLine(pts.GetX(i) - 5, pts.GetY(i) - 5, pts.GetX(i) + 5, pts.GetY(i) + 5); - dc.DrawLine(pts.GetX(i) + 5, pts.GetY(i) - 5, pts.GetX(i) - 5, pts.GetY(i) + 5); - } - } - -// SelectObject(hdc, hBlackPen1); - dc.SetPen(*(wxThePenList->FindOrCreatePen(wxColour(0x00, 0x00, 0x00), 1, wxSOLID))); - - // Draw curve formed by points - - for(int poly=0; poly 2) - { - // Initial move... - // If it's not on curve, then move to it, otherwise move to last point... - - wxCoord x, y; - - if (pts.GetOnCurve(poly, pts.GetNumPoints(poly) - 1)) - x = (wxCoord)pts.GetX(poly, pts.GetNumPoints(poly) - 1), y = (wxCoord)pts.GetY(poly, pts.GetNumPoints(poly) - 1); - else - x = (wxCoord)pts.GetX(poly, 0), y = (wxCoord)pts.GetY(poly, 0); - - for(int i=0; iMove(pt); - app.toolPalette->Show(true); - SetCursor(*wxSTANDARD_CURSOR); - app.toolPalette->SetCursor(*wxSTANDARD_CURSOR); - app.toolPalette->prevTool = TOOLSelect; - app.toolPalette->Refresh(false); - CaptureMouse(); - } - else if (e.RightUp()) - { - ToolType newTool = app.toolPalette->FindSelectedTool();//, oldTool = tool; - - // We only change the tool if a new one was actually selected. Otherwise, we do nothing. - if (newTool != TOOLNone) - { - tool = newTool; - - if (tool == TOOLScroll || tool == TOOLZoom || tool == TOOLAddPoly - || tool == TOOLDelPoly) - ptHighlight = -1; - - if (tool == TOOLAddPoly) - polyFirstPoint = true; - } - - ReleaseMouse(); - app.toolPalette->Show(false); - SetCursor(*(app.cur[tool])); - } - else if (e.LeftDown()) - { - if (tool == TOOLScroll || tool == TOOLZoom) - CaptureMouse(); // Make sure we capture the mouse when in scroll/zoom mode - else if (tool == TOOLAddPt) // "Add Point" tool - { - if (pts.GetNumPoints() > 0) - { - wxPoint pt = GetAdjustedMousePosition(e); - pts.InsertPoint(pts.GetNext(ptHighlight), pt.x, pt.y, (e.ShiftDown() | e.ControlDown() ? false : true)); - ptHighlight = ptNextHighlight; - Refresh(); - } - } - else if (tool == TOOLAddPoly) // "Add Poly" tool - { -#ifdef DEBUGFOO -WriteLogMsg("Adding point... # polys: %u, # points: %u", pts.GetNumPolys(), pts.GetNumPoints()); -#endif - if (polyFirstPoint) - { - polyFirstPoint = false; - pts.AddNewPolyAtEnd(); - } - - wxPoint pt = GetAdjustedMousePosition(e); - // Append a point to the end of the structure - pts += IPoint(pt.x, pt.y, (e.ShiftDown() | e.ControlDown() ? false : true)); - ptHighlight = pts.GetNumPoints() - 1; - Refresh(); -#ifdef DEBUGFOO -WriteLogMsg(" --> [# polys: %u, # points: %u]\n", pts.GetNumPolys(), pts.GetNumPoints()); -#endif - } - else if (tool == TOOLSelect || tool == TOOLPolySelect) - { - if (pts.GetNumPoints() > 0) - { - pt = GetAdjustedClientPosition(pts.GetX(ptHighlight), pts.GetY(ptHighlight)); - WarpPointer(pt.x, pt.y); - - if (e.ShiftDown() | e.ControlDown()) - pts.SetOnCurve(ptHighlight, !pts.GetOnCurve(ptHighlight)); - } - } - else if (tool == TOOLDelPt) - { - if (pts.GetNumPoints() > 0) -//Or could use: -// if (ptHighlight != -1) - { -//This assumes that WM_MOUSEMOVE happens before this! -//The above commented out line should take care of this contingency... !!! FIX !!! - pts.DeletePoint(ptHighlight); - Refresh(); - } - } - } - else if (e.LeftUp()) - { - if (tool == TOOLScroll || tool == TOOLZoom) - ReleaseMouse(); - } - else if (e.MiddleDown()) - { - SetCursor(*(app.cur[2])); // Scrolling cursor - } - else if (e.MiddleUp()) - { - SetCursor(*(app.cur[tool])); // Restore previous cursor - } - else if (e.Dragging()) - { - if (e.RightIsDown()) - { - ToolType newTool = app.toolPalette->FindSelectedTool(); - - if (newTool != app.toolPalette->prevTool) - { - app.toolPalette->prevTool = newTool; - app.toolPalette->Refresh(false); - } - -// return; - } - else if (e.MiddleIsDown()) - { - // Calc offset from previous point - pt = e.GetPosition(); - ptOffset.x = pt.x - ptPrevious.x, - ptOffset.y = pt.y - ptPrevious.y; - -// Then multiply it by the scaling factor. Whee! - // This looks wacky because we're using screen coords for the offset... - // Otherwise, we would subtract both offsets! - offsetX -= ptOffset.x, offsetY += ptOffset.y; - Refresh(); -// ptPrevious = pt; - -// return; - } - - else if (e.LeftIsDown()) - { -#if 0 - if (tool == TOOLScroll) - { - // Extract current point from lParam/calc offset from previous point - - pt = e.GetPosition(); - ptOffset.x = pt.x - ptPrevious.x, - ptOffset.y = pt.y - ptPrevious.y; - - // NOTE: OffsetViewportOrg operates in DEVICE UNITS... - -//Seems there's no equivalent for this in wxWidgets...! -//!!! FIX !!! -// hdc = GetDC(hWnd); -// OffsetViewportOrgEx(hdc, ptOffset.x, ptOffset.y, NULL); -// ReleaseDC(hWnd, hdc); - -// this shows that it works, so the logic above must be faulty... -// And it is. It should convert the coords first, then do the subtraction to figure the offset... -// Above: DONE -// Then multiply it by the scaling factor. Whee! - // This looks wacky because we're using screen coords for the offset... - // Otherwise, we would subtract both offsets! - offsetX -= ptOffset.x, offsetY += ptOffset.y; - Refresh(); - } - else -#endif - if (tool == TOOLAddPt || tool == TOOLAddPoly || tool == TOOLSelect) - { - if (tool != TOOLAddPt || pts.GetNumPoints() > 0)//yecch. - { -//temporary, for testing. BTW, Select drag bug is here...! -#if 1 - wxPoint pt2 = GetAdjustedMousePosition(e); - pts.SetXY(ptHighlight, pt2.x, pt2.y); - Refresh(); -#endif - } - } - else if (tool == TOOLPolySelect) - { - if (pts.GetNumPoints() > 0) - { - wxPoint pt2 = GetAdjustedMousePosition(e); - // Should also set onCurve here as well, depending on keystate -//Or should we? - pts.OffsetPoly(pts.GetPoly(ptHighlight), pt2.x - pts.GetX(ptHighlight), pt2.y - pts.GetY(ptHighlight)); - Refresh(); - } - } - } - - ptPrevious = pt; - } - else if (e.Moving()) - { -// else // Moving, not dragging... -// { - if (tool == TOOLSelect || tool == TOOLDelPt || tool == TOOLAddPt - || tool == TOOLPolySelect)// || tool == TOOLAddPoly) - { - wxPoint pt2 = GetAdjustedMousePosition(e); - double closest = 1.0e+99; - - for(int i=0; i 1 && tool == TOOLAddPt) - { - double smallest = 1.0e+99; - - for(int i=0; i length of ls, -// then the perpendicular lies beyond the 2nd endpoint. - - if (pp < 0.0) - dist = v1.length(); - else if (pp > ls.length()) - dist = v2.length(); - else // distance = ?Det?(ls, v1) / |ls| - dist = fabs((ls.x * v1.y - v1.x * ls.y) / ls.length()); - -//The answer to the above looks like it might be found here: -// -//If the segment endpoints are s and e, and the point is p, then the test for the perpendicular -//intercepting the segment is equivalent to insisting that the two dot products {s-e}.{s-p} and -//{e-s}.{e-p} are both non-negative. Perpendicular distance from the point to the segment is -//computed by first computing the area of the triangle the three points form, then dividing by the -//length of the segment. Distances are done just by the Pythagorean theorem. Twice the area of the -//triangle formed by three points is the determinant of the following matrix: -// -//sx sy 1 -//ex ey 1 -//px py 1 -// -//(???) By translating the start point to the origin, this can be rewritten as: -//By subtracting row 1 from all rows, you get the following: -// -//0 0 0 -//(ex - sx) (ey - sy) 0 -//(px - sx) (py - sy) 0 -// -//which greatly simplifies the calculation of the determinant. - - if (dist < smallest) - smallest = dist, ptNextHighlight = pts.GetNext(i), ptHighlight = i; - } - - if (ptNextHighlight != oldPtNextHighlight) - { - oldPtNextHighlight = ptNextHighlight; - Refresh(); - } - } - } -// } - - ptPrevious = e.GetPosition(); - } -} - -wxPoint TTEditWindow::GetAdjustedMousePosition(wxMouseEvent &e) -{ - wxCoord width, height; - wxClientDC dc(this); - - dc.GetSize(&width, &height); - dc.SetDeviceOrigin(-offsetX, height - (-offsetY)); - dc.SetAxisOrientation(true, true); - -#if 0 -wxStatusBar * sb = ((wxFrame *)GetParent())->GetStatusBar(); -wxString s; -s.Printf("Logical mouse pos: %d, %d (%d, %d)", pt.x, pt.y, width, height); -sb->SetStatusText(s); -#endif - - return e.GetLogicalPosition(dc); -} - -wxPoint TTEditWindow::GetAdjustedClientPosition(wxCoord x, wxCoord y) -{ - wxCoord width, height; - wxClientDC dc(this); - - dc.GetSize(&width, &height); - dc.SetDeviceOrigin(-offsetX, height - (-offsetY)); - dc.SetAxisOrientation(true, true); - - return wxPoint(dc.LogicalToDeviceX(x), dc.LogicalToDeviceY(y)); -} - - -#if 0 - -!!! OLD STUFF !!! - - -LRESULT CALLBACK WndProc(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) -{ - RECT rc1, rc2; - HDC hdc; - POINT pt, ptOffset; - SIZE sz; - PAINTSTRUCT ps; - - switch (msgID) - { - case WM_CREATE: - - MiscCenterWnd(hWnd, GetDesktopWindow()); - InitCommonControls(); - hStatusBar = CreateStatusWindow(WS_CHILD | WS_VISIBLE, statusBarTxt, hWnd, ID_STATUSBAR); - - if (!hStatusBar) - return -1; - -// clean this crap up! -// well, the only crappy thing here is using a POINT as an int array, but otherwise, this is OK - wsprintf(strBuf, zoom, 1000); - hdc = GetDC(hWnd); - GetTextExtentPoint32(hdc, strBuf, lstrlen(strBuf), &sz); - ReleaseDC(hWnd, hdc); - zoomWndWidth = sz.cx; - wsprintf(strBuf, zoom, 100); - - GetClientRect(hWnd, &rc1); - pt.x = rc1.right - zoomWndWidth, pt.y = -1; - SendMessage(hStatusBar, SB_SETPARTS, 2, (LPARAM)&pt); - SendMessage(hStatusBar, SB_SETTEXT, (0 | SBT_NOBORDERS), (LPARAM)statusBarTxt); - SendMessage(hStatusBar, SB_SETTEXT, 1, (LPARAM)strBuf); - - hToolBar = CreateToolbarEx(hWnd, WS_CHILD | WS_BORDER | WS_VISIBLE | TBSTYLE_TOOLTIPS, - IDR_TOOLBAR1, 3, hInst, IDB_TOOLBAR1, tbButtons, 4, 16, 16, 16, 16, sizeof(TBBUTTON)); - - if (!hToolBar) - return -1; - - CreateNewDoc(); - -// The following can only be done because we use a private DC (using "CS_OWNDC") -// (Is that true???) -// Set the mapping to draw the character so it fits in the viewport... - hdc = GetDC(hWnd); - GetClientRect(hWnd, &rc1); - GetClientRect(hStatusBar, &rc2); - rc1.bottom -= rc2.bottom; - SetMapMode(hdc, MM_ISOTROPIC); - SetWindowExtEx(hdc, rc1.right, rc1.bottom, NULL); - SetViewportExtEx(hdc, rc1.right, -rc1.bottom, NULL); - SetViewportOrgEx(hdc, 0, rc1.bottom, NULL); - ReleaseDC(hWnd, hdc); - break; - - case WM_CLOSE: - - if (SaveChanges()) - { - wpM.length = wpC.length = sizeof(WINDOWPLACEMENT); - GetWindowPlacement(hMainWnd, &wpM); - GetWindowPlacement(hCharWnd, &wpC); - - if (!IsWindowVisible(hCharWnd)) // Needed because Windows lies about visibility - wpC.showCmd = SW_HIDE; - - hdc = GetDC(hWnd); - GetViewportOrgEx(hdc, &ptVPM); - ReleaseDC(hWnd, hdc); - - DestroyWindow(hWnd); - } - - break; - - case WM_DESTROY: - - PostQuitMessage(0); - break; - - case WM_NCLBUTTONDOWN: - - if (wParam == HTCAPTION) - { - NCMouseDown = true; - GetWindowRect(hMainWnd, &rc1); - GetWindowRect(hCharWnd, &rc2); - ptWinOffset.x = rc2.left - rc1.left; - ptWinOffset.y = rc2.top - rc1.top; - } - - // Let Windows do its thing with this msg, or weird things will happen... - - DefWindowProc(hWnd, msgID, wParam, lParam); - NCMouseDown = false; - break; - - case WM_WINDOWPOSCHANGING: - - if (NCMouseDown) - { - WINDOWPOS * wp = (WINDOWPOS *)lParam; - - if (wp->hwnd == hMainWnd && !(wp->flags & SWP_NOMOVE)) - SetWindowPos(hCharWnd, 0, wp->x + ptWinOffset.x, wp->y + ptWinOffset.y, - 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - } - - return DefWindowProc(hWnd, msgID, wParam, lParam); // Seems this is needed... Bleah! - - case WM_PAINT: - { - hdc = BeginPaint(hWnd, &ps); - -// Scrolling can be done by using OffsetViewportOrgEx -// Scaling can be done by adjusting SetWindowExtEx (it's denominator of txform) -// you'd use: % = ViewportExt / WindowExt -// But it makes the window look like crap: fuggetuboutit. -// Instead, we have to scale EVERYTHING by hand. Crap! - - // Apparently, you *must* save the individual object types (pen, brush, etc.) - - HGDIOBJ oldPen = SelectObject(hdc, hBluePen1), - oldBrush = SelectObject(hdc, hNullBrush); - - // Draw coordinate axes - - MoveToEx(hdc, 0, -32000, NULL); - LineTo(hdc, 0, 32000); - MoveToEx(hdc, -32000, 0, NULL); - LineTo(hdc, 32000, 0); - - // Draw points - - for(int i=0; i 2) - { - // Initial move... - // If it's not on curve, then move to it, otherwise move to last point... - - if (pts.GetOnCurve(poly, pts.GetNumPoints(poly) - 1)) - MoveToEx(hdc, pts.GetX(poly, pts.GetNumPoints(poly) - 1), pts.GetY(poly, pts.GetNumPoints(poly) - 1), NULL); - else - MoveToEx(hdc, pts.GetX(poly, 0), pts.GetY(poly, 0), NULL); - - for(int i=0; i 0) - { -//Do we really need to put a cap on this??? -//Maybe... -// if (pts.GetNumPoints() < 16) -// { - pt.x = lParam & 0xFFFF, pt.y = lParam >> 16; - hdc = GetDC(hWnd); - DPtoLP(hdc, &pt, 1); - pts.InsertPoint(pts.GetNext(ptHighlight), pt.x, pt.y, (wParam & (MK_SHIFT | MK_CONTROL) ? false : true)); - ptHighlight = ptNextHighlight; - ReleaseDC(hWnd, hdc); - InvalidateRect(hWnd, NULL, TRUE); -// } - } - } - else if (currentTool == TOOLAddPoly) // "Add Poly" tool - { -#ifdef DEBUGFOO -wsprintf(strBuf, "Adding point... # polys: %u, # points: %u", pts.GetNumPolys(), pts.GetNumPoints()); -WriteLogMsg(strBuf); -#endif - if (polyFirstPoint) - { - polyFirstPoint = false; - pts.AddNewPolyAtEnd(); - } - -//Do we really need to put a cap on this??? -//Maybe... -// if (pts.GetNumPoints() < 16) -// { - pt.x = lParam & 0xFFFF, pt.y = lParam >> 16; - hdc = GetDC(hWnd); - DPtoLP(hdc, &pt, 1); - ReleaseDC(hWnd, hdc); - // Append a point to the end of the structure - pts += IPoint(pt.x, pt.y, (wParam & (MK_SHIFT | MK_CONTROL) ? false : true)); -ptHighlight = pts.GetNumPoints() - 1; - InvalidateRect(hWnd, NULL, TRUE); -// } -#ifdef DEBUGFOO -wsprintf(strBuf, " --> [# polys: %u, # points: %u]\xD\xA", pts.GetNumPolys(), pts.GetNumPoints()); -WriteLogMsg(strBuf); -#endif - } - else if (currentTool == TOOLSelect || currentTool == TOOLPolySelect) - { - if (pts.GetNumPoints() > 0) - { - pt.x = pts.GetX(ptHighlight), pt.y = pts.GetY(ptHighlight); - hdc = GetDC(hWnd); - LPtoDP(hdc, &pt, 1); - ClientToScreen(hWnd, &pt); - SetCursorPos(pt.x, pt.y); - ReleaseDC(hWnd, hdc); - - if (wParam & (MK_SHIFT | MK_CONTROL)) - pts.SetOnCurve(ptHighlight, !pts.GetOnCurve(ptHighlight)); - } - } - else if (currentTool == TOOLDelPt) - { - if (pts.GetNumPoints() > 0) -//Or could use: -// if (ptHighlight != -1) - { -//This assumes that WM_MOUSEMOVE happens before this! -//The above commented out line should take care of this contingency... !!! FIX !!! - pts.DeletePoint(ptHighlight); - InvalidateRect(hWnd, NULL, TRUE); - } - } - - break; - - case WM_LBUTTONUP: - - mouseDown = false; - - if (currentTool == TOOLScroll || currentTool == TOOLZoom) - ReleaseCapture(); - - break; - - case WM_MOUSEMOVE: - - SetCursor(hCur[currentTool]); - - // Extract current point from lParam/calc offset from previous point - - pt.x = lParam & 0xFFFF, pt.y = lParam >> 16; - ptOffset.x = pt.x - ptPrevious.x, - ptOffset.y = pt.y - ptPrevious.y; - - if (mouseDown) - { - if (currentTool == TOOLScroll) - { - // NOTE: OffsetViewportOrg operates in DEVICE UNITS... - - hdc = GetDC(hWnd); - OffsetViewportOrgEx(hdc, ptOffset.x, ptOffset.y, NULL); - ReleaseDC(hWnd, hdc); - -// this shows that it works, so the logic above must be faulty... -// And it is. It should convert the coords first, then do the subtraction to figure the offset... -// Above: DONE -// Then multiply it by the scaling factor. Whee! - - InvalidateRect(hWnd, NULL, TRUE); -// SendMessage(hWnd, WM_PAINT, NULL, NULL); - } - else if (currentTool == TOOLAddPt || currentTool == TOOLAddPoly || currentTool == TOOLSelect) - { - if (currentTool != TOOLAddPt || pts.GetNumPoints() > 0)//yecch. - { - POINT pt2; - pt2.x = pt.x, pt2.y = pt.y; - // Should also set onCurve here as well, depending on keystate -//Or should we? - hdc = GetDC(hWnd); - DPtoLP(hdc, &pt2, 1); - pts.SetXY(ptHighlight, pt2.x, pt2.y); - ReleaseDC(hWnd, hdc); - InvalidateRect(hWnd, NULL, TRUE); - } - } - else if (currentTool == TOOLPolySelect) - { - if (pts.GetNumPoints() > 0) - { - POINT pt2; - pt2.x = pt.x, pt2.y = pt.y; - // Should also set onCurve here as well, depending on keystate -//Or should we? - hdc = GetDC(hWnd); - DPtoLP(hdc, &pt2, 1); - pts.OffsetPoly(pts.GetPoly(ptHighlight), pt2.x - pts.GetX(ptHighlight), pt2.y - pts.GetY(ptHighlight)); - ReleaseDC(hWnd, hdc); - InvalidateRect(hWnd, NULL, TRUE); - } - } - } - else - { - if (currentTool == TOOLSelect || currentTool == TOOLDelPt || currentTool == TOOLAddPt - || currentTool == TOOLPolySelect)// || currentTool == TOOLAddPoly) - { - POINT pt2; - pt2.x = pt.x, pt2.y = pt.y; - hdc = GetDC(hWnd); - DPtoLP(hdc, &pt2, 1); - ReleaseDC(hWnd, hdc); - - double closest = 1.0e+99; - - for(int i=0; i 1 && currentTool == TOOLAddPt) - { - double smallest = 1.0e+99; - - for(int i=0; i length of ls, -// then the perpendicular lies beyond the 2nd endpoint. - - if (pp < 0.0) - dist = v1.length(); - else if (pp > ls.length()) - dist = v2.length(); - else // distance = ?Det?(ls, v1) / |ls| - dist = abs((ls.x * v1.y - v1.x * ls.y) / ls.length()); - -//The answer to the above looks like it might be found here: -// -//If the segment endpoints are s and e, and the point is p, then the test for the perpendicular -//intercepting the segment is equivalent to insisting that the two dot products {s-e}.{s-p} and -//{e-s}.{e-p} are both non-negative. Perpendicular distance from the point to the segment is -//computed by first computing the area of the triangle the three points form, then dividing by the -//length of the segment. Distances are done just by the Pythagorean theorem. Twice the area of the -//triangle formed by three points is the determinant of the following matrix: -// -//sx sy 1 -//ex ey 1 -//px py 1 -// -//(???) By translating the start point to the origin, this can be rewritten as: -//By subtracting row 1 from all rows, you get the following: -// -//0 0 0 -//(ex - sx) (ey - sy) 0 -//(px - sx) (py - sy) 0 -// -//which greatly simplifies the calculation of the determinant. - - if (dist < smallest) - smallest = dist, ptNextHighlight = pts.GetNext(i), ptHighlight = i; - } - - if (ptNextHighlight != oldPtNextHighlight) - { - oldPtNextHighlight = ptNextHighlight; - InvalidateRect(hWnd, NULL, TRUE); - } - } - } - } - - ptPrevious.x = pt.x, ptPrevious.y = pt.y; - - break; - - case WM_NOTIFY: - - if (((NMHDR *)lParam)->code == TTN_NEEDTEXT) - { - LoadString(hInst, ((TOOLTIPTEXT *)lParam)->hdr.idFrom + 0x80, toolTipTxt, 16); - ((TOOLTIPTEXT *)lParam)->lpszText = toolTipTxt; - } - - break; - - case WM_MENUSELECT: - { - statusBarTxt[0] = 0; // Clear status bar text - uint16 flags = wParam >> 16; // Extract flags - - if (!(flags & MFT_SEPARATOR)) - { - uint16 id = wParam & 0xFFFF; - - if (flags & MF_POPUP) - { - if (flags & MF_SYSMENU) - id = IDS_SYSMENU; - else - id = IDM_FILEMENU + wParam; - } - - LoadString(hInst, id, statusBarTxt, 64); - } - - SendMessage(hStatusBar, SB_SETTEXT, 0 + SBT_NOBORDERS, (LPARAM)statusBarTxt); - break; - } - case WM_COMMAND: - { - uint16 cmd = wParam & 0xFFFF; - - if (cmd == IDM_NEW) - { -// call CmdIDM_NEW - } - else if (cmd == IDM_OPEN) - { -// call SaveChanges -// .IF (eax) -// movmov ofn.hwndOwner, eax, hMainWnd -// mov ofn.Flags, OFN_PATHMUSTEXIST + OFN_FILEMUSTEXIST -// invoke GetOpenFileName, ADDR ofn -// .IF (eax) -//////// -//jmp @F -//szDMsg1a BYTE "Could not open the file (GetOpenFileName)...", 0 -//szDMsg1b BYTE "Open error!", 0 -//szDMsg1c BYTE "About to attempt to open file...", 0 -//@@: -////invoke MessageBox, hWnd, ADDR szDMsg1a, ADDR szDMsg1b, MB_ICONERROR or MB_OK -//invoke MessageBox, hMainWnd, ADDR szDMsg1c, ADDR szFile, MB_ICONERROR or MB_OK -// invoke LoadTTF, ADDR szFile -// -////// -// // <<< FILE OPEN CODE HERE >>> -// or fFileStatus, NAMEDbit -// and fFileStatus, NOT CHANGEDbit -// call NewWindowName -// mov eax, TRUE // return TRUE -// jmp Return -// //�������������������������������������� -//OpenError: invoke GetLastError -// // <<< FILE OPEN ERROR CODE HERE >>> -// .ENDIF -// zero eax // return FALSE -// .ENDIF - } - else if (cmd == IDM_SAVEAS) - { -// and fFileStatus, NOT NAMEDbit -// call CmdIDM_SAVE - } - else if (cmd == IDM_SAVE) - { -// call CmdIDM_SAVE - } - else if (cmd == IDM_ABOUT) - DialogBoxParam(hInst, MAKEINTRESOURCE(IDD_ABOUT), hMainWnd, AboutProc, NULL); - else if (cmd == IDM_EXIT) - SendMessage(hWnd, WM_CLOSE, 0, 0); - else if (cmd == ID_TBCHARWIN) - { - ShowWindow(hCharWnd, (IsWindowVisible(hCharWnd) ? SW_HIDE : SW_SHOWNOACTIVATE)); - -#ifdef DEBUGFOO -wpC.length = sizeof(WINDOWPLACEMENT); -GetWindowPlacement(hCharWnd, &wpC); -wsprintf(strBuf, "Char window showCmd = %08X...\n", wpC.showCmd); -WriteLogMsg(strBuf); -#endif - } - else - return DefWindowProc(hWnd, msgID, wParam, lParam); - - break; - } - default: - return DefWindowProc(hWnd, msgID, wParam, lParam); - } - - return 0; -} - -// -// Initialize TTF data -// -void CreateNewDoc(void) -{ -} - -// -// Save changes to document before quitting -// -bool SaveChanges(void) -{ - return true; -} - - - -// -// ABOUT Dialog WndProc -// -BOOL CALLBACK AboutProc(HWND hDlg, UINT msgID, WPARAM wParam, LPARAM lParam) -{ - switch (msgID) - { - case WM_INITDIALOG: - - MiscCenterWnd(hDlg, hMainWnd); - break; - - case WM_COMMAND: - - if (wParam == IDOK || wParam == IDCANCEL) - EndDialog(hDlg, TRUE); - - break; - - default: - return FALSE; - } - - return TRUE; -} - -// -// Character Window WndProc -// -WndProcCW PROC STDCALL, hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM - - mov eax, uMsg // pickup our message - .IF (eax == WM_PAINT) - mov eax, 0 // Non-sense... (placeholder!) -// Scan conversion etc. goes here... - .ELSEIF (eax == WM_LBUTTONDOWN) - invoke SetCapture, hCharWnd - .ELSEIF (eax == WM_LBUTTONUP) - invoke ReleaseCapture - invoke SetFocus, hMainWnd // Make sure the main wnd keeps focus! - .ELSEIF (eax == WM_NCLBUTTONDOWN) - invoke DefWindowProc, hWnd, uMsg, wParam, lParam // Let it do its thing - invoke SetFocus, hMainWnd // Make sure the main wnd keeps focus! - .ELSE -DefProc: invoke DefWindowProc, hWnd, uMsg, wParam, lParam - .ENDIF - ret - -WndProcCW ENDP - -// -// Character Window WndProc -// -LRESULT CALLBACK WndProcCW(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) -{ - switch (msgID) - { - default: - return DefWindowProc(hWnd, msgID, wParam, lParam); - } - - return 0; -} - - -// Function prototypes - -int32 FindSelectedTool(void); - -// -// Tool Palette WndProc -// -LRESULT CALLBACK WndProcTP(HWND hWnd, UINT msgID, WPARAM wParam, LPARAM lParam) -{ - PAINTSTRUCT ps; - HDC hdc; - POINT pt; - static uint32 prevTool = -1; - - switch (msgID) - { - case WM_PAINT: - { - hdc = BeginPaint(hWnd, &ps); - HDC newDC = CreateCompatibleDC(NULL); - SelectObject(newDC, hBMToolPal1); - BitBlt(hdc, 0, 0, sizeTPBM.x, sizeTPBM.y, newDC, 0, 0, SRCCOPY); - DeleteDC(newDC); - -// This is crappy. Find some way to tighten this up! - int32 tool = FindSelectedTool(); - - if (tool != -1) - { - newDC = CreateCompatibleDC(NULL); - SelectObject(newDC, hBMToolPal1); - //need ul corner of bitmap, ul corner of dest, width/height - pt.x = sizeStamp.x * (tool & 0x03), pt.y = sizeStamp.y * (tool >> 2); - BitBlt(hdc, pt.x, pt.y, sizeStamp.x, sizeStamp.y, newDC, pt.x, pt.y, NOTSRCCOPY); - DeleteDC(newDC); - } - - EndPaint(hWnd, &ps); - break; - } - case WM_MOUSEMOVE: - { - int32 tool = FindSelectedTool(); - - if (tool != prevTool) - { - prevTool = tool; - InvalidateRect(hWnd, NULL, FALSE); - } - - break; - } - case WM_RBUTTONUP: - { - int32 tool = FindSelectedTool(), oldTool = currentTool; - - if (tool != -1) - currentTool = tool; - - if (currentTool != TOOLSelect && currentTool != TOOLDelPt && currentTool != TOOLAddPt - && currentTool != TOOLPolySelect) - ptHighlight = -1; - - if (currentTool != oldTool) - InvalidateRect(hMainWnd, NULL, TRUE); - - if (currentTool == TOOLAddPoly) -#ifdef DEBUGFOO -{ -#endif - polyFirstPoint = true; -#ifdef DEBUGFOO -wsprintf(strBuf, "--> Selected poly tool, polyFirstPoint is %s\n", polyFirstPoint ? "true" : "false"); -WriteLogMsg(strBuf); -} -#endif - - ReleaseCapture(); - ShowWindow(hToolPalWnd, SW_HIDE); - SetFocus(hMainWnd); // Make sure the main wnd keeps focus! - - break; - } - default: - return DefWindowProc(hWnd, msgID, wParam, lParam); - } - - return 0; -} - -// -// Find which tool we're pointing at -// Use: xcoord = mouse.x / (bmsize.x/4), ycoord = mouse.y / (bmsize.y/2) -// -int32 FindSelectedTool(void) -{ - POINT pt; - - GetCursorPos(&pt); - ScreenToClient(hToolPalWnd, &pt); - - uint32 x = (uint32)pt.x / sizeStamp.x, y = (uint32)pt.y / sizeStamp.y, tool = -1; - - if (x < 4 && y < 2) -// { - tool = (y * 4) + x; - -// if (tool == 7) -// tool = -1; // 7 has no tool... -// } - - return tool; -} - - -// -// Misc center window -// -void MiscCenterWnd(HWND hChild, HWND hParent) -{ - RECT parent, child; - - if (!GetWindowRect(hParent, &parent) || !GetWindowRect(hChild, &child)) - return; - - int32 x = parent.left + (((parent.right - parent.left) - (child.right - child.left)) / 2), - y = parent.top + (((parent.bottom - parent.top) - (child.bottom - child.top)) / 2); - - if (x < 0) - x = 0; - else if (x > GetSystemMetrics(SM_CXFULLSCREEN) - (child.right - child.left)) - x = GetSystemMetrics(SM_CXFULLSCREEN) - (child.right - child.left); - - if (y < 0) - y = 0; - else if (y > GetSystemMetrics(SM_CYFULLSCREEN) - (child.bottom - child.top)) - y = GetSystemMetrics(SM_CYFULLSCREEN) - (child.bottom - child.top); - - SetWindowPos(hChild, NULL, x, y, 0, 0, SWP_NOSIZE | SWP_NOZORDER); -} - -// -// Allow only one instance -// -bool OnlyOneInstance(void) -{ - HWND window = FindWindow(className, NULL); - - if (window == NULL) - return true; - - ShowWindow(window, SW_SHOWNORMAL); - SetWindowPos(window, NULL, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE); - - return false; -} - -// -// Load/Allocate all resources -// -bool LoadResources(void) -{ - hCur[0] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR1)); - hCur[1] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR2)); - hCur[2] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR3)); - hCur[3] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR4)); - hCur[4] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR5)); - hCur[5] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR6)); - hCur[6] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR7)); - hCur[7] = LoadCursor(hInst, MAKEINTRESOURCE(IDC_CURSOR8)); - - BITMAP bm; - - hBMToolPal1 = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_TOOLPAL1)); - GetObject(hBMToolPal1, sizeof(bm), &bm); - - // Set up sizes - - sizeTPBM.x = bm.bmWidth, sizeTPBM.y = bm.bmHeight; - sizeStamp.x = bm.bmWidth / 4, sizeStamp.y = bm.bmHeight / 2; - - hBluePen1 = CreatePen(PS_DOT, 1, 0x00FF0000); - hRedPen1 = CreatePen(PS_SOLID, 1, 0x000000FF); - hGreenPen1 = CreatePen(PS_SOLID, 1, 0x0000AF00); - hBlackPen1 = CreatePen(PS_SOLID, 1, 0x00000000); - - LOGBRUSH lb = { BS_NULL, 0, 0 }; - - hNullBrush = CreateBrushIndirect(&lb); - - return true; -} - -// -// Deallocate all resources -// -void DeallocateResources(void) -{ - DeleteObject(hBMToolPal1); - DeleteObject(hBluePen1); - DeleteObject(hRedPen1); - DeleteObject(hGreenPen1); - DeleteObject(hBlackPen1); - DeleteObject(hNullBrush); -} - -// -// Save all application specific data, so we can pick up where we last left off... -// -void SaveAppState(void) -{ - SetINIInt("Main", "flags", wpM.flags); - SetINIInt("Main", "showCmd", wpM.showCmd); - SetINIInt("Main", "x1", wpM.rcNormalPosition.left); - SetINIInt("Main", "y1", wpM.rcNormalPosition.top); - SetINIInt("Main", "x2", wpM.rcNormalPosition.right); - SetINIInt("Main", "y2", wpM.rcNormalPosition.bottom); - - SetINIInt("Main", "vpx", ptVPM.x); - SetINIInt("Main", "vpy", ptVPM.y); - - SetINIInt("Char", "flags", wpC.flags); - SetINIInt("Char", "showCmd", wpC.showCmd); - SetINIInt("Char", "x1", wpC.rcNormalPosition.left); - SetINIInt("Char", "y1", wpC.rcNormalPosition.top); - SetINIInt("Char", "x2", wpC.rcNormalPosition.right); - SetINIInt("Char", "y2", wpC.rcNormalPosition.bottom); - - // Need to write out currently opened font, character looking at, other misc. crap -// SetINIString("Main", "currentFile", pDoc->GetPathName()); -// SetINIInt("Main", "currentChar", pDoc->character_num); -} - -// -// Restore all application specific data previously saved -// -bool RestoreAppState(void) -{ - InitINIFile(); - - WINDOWPLACEMENT wp; - wp.length = sizeof(WINDOWPLACEMENT); - GetWindowPlacement(hMainWnd, &wp); - - wp.flags = GetINIInt("Main", "flags", wp.flags); - wp.showCmd = GetINIInt("Main", "showCmd", wp.showCmd); - wp.rcNormalPosition.left = GetINIInt("Main", "x1", wp.rcNormalPosition.left); - wp.rcNormalPosition.top = GetINIInt("Main", "y1", wp.rcNormalPosition.top); - wp.rcNormalPosition.right = GetINIInt("Main", "x2", wp.rcNormalPosition.right); - wp.rcNormalPosition.bottom = GetINIInt("Main", "y2", wp.rcNormalPosition.bottom); - - SetWindowPlacement(hMainWnd, &wp); - - HDC hdc; - POINT pt; - hdc = GetDC(hMainWnd); - GetViewportOrgEx(hdc, &pt); - - pt.x = GetINIInt("Main", "vpx", pt.x); - pt.y = GetINIInt("Main", "vpy", pt.y); - - SetViewportOrgEx(hdc, pt.x, pt.y, NULL); - ReleaseDC(hMainWnd, hdc); - - GetWindowPlacement(hCharWnd, &wp); - - wp.flags = GetINIInt("Char", "flags", wp.flags); - wp.showCmd = GetINIInt("Char", "showCmd", wp.showCmd); - wp.rcNormalPosition.left = GetINIInt("Char", "x1", wp.rcNormalPosition.left); - wp.rcNormalPosition.top = GetINIInt("Char", "y1", wp.rcNormalPosition.top); - wp.rcNormalPosition.right = GetINIInt("Char", "x2", wp.rcNormalPosition.right); - wp.rcNormalPosition.bottom = GetINIInt("Char", "y2", wp.rcNormalPosition.bottom); - - SetWindowPlacement(hCharWnd, &wp); - - if (wp.showCmd == SW_HIDE) - SendMessage(hToolBar, TB_SETSTATE, ID_TBCHARWIN, MAKELONG(TBSTATE_ENABLED, 0)); - -// CString lastFile = theApplicationObject.GetProfileString(version, "currentFile", ""); -// int lastChar = theApplicationObject.GetProfileInt(version, "currentChar", 0); -// if (lastFile.GetLength()) -// { -// // Attempt to restore the last session by open the last file used, etc... -// if (!pDoc->m_myFont.Load(lastFile)) -// { -// // Err, make sure you can support any allegations you make below, buddy! -// AfxMessageBox("The last file opened with TTF Edit\n\rseems to have been moved or deleted."); -// } -// else -// { -// pDoc->m_myFont.SetGlyph(lastChar); // Set TTF object to last used char -// pDoc->character_num = lastChar; -// pDoc->SetPathName(lastFile); -// -// BYTE name[512]; -// pDoc->m_myFont.GetCharName(lastChar, name); -// m_wndOwned.SetWindowText((char *)name); -// } -// } - - return true; -} - -// -// Initialization -// -bool Initialization(void) -{ - WNDCLASSEX wcex; - - if (!LoadResources()) - return false; - - RtlFillMemory(&wcex, sizeof(WNDCLASSEX), 0); - wcex.cbSize = sizeof(WNDCLASSEX); - wcex.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; - wcex.lpfnWndProc = WndProc; - wcex.hInstance = hInst; - wcex.hIcon = LoadIcon(hInst, MAKEINTRESOURCE(IDI_ICON)); - wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1); - wcex.lpszMenuName = MAKEINTRESOURCE(IDM_MENU); - wcex.lpszClassName = className; - wcex.hIconSm = (HICON)LoadImage(hInst, MAKEINTRESOURCE(IDI_ICON), IMAGE_ICON, 16, 16, NULL); - - if (!RegisterClassEx(&wcex)) - return false; - - hMainWnd = CreateWindowEx(NULL, className, className, WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN, - 0, 0, 0x1A0, 0x180, NULL, NULL, hInst, NULL); - - if (!hMainWnd) - return false; - - ShowWindow(hMainWnd, nCmdShow); - UpdateWindow(hMainWnd); - - // Character window creation - - wcex.lpfnWndProc = WndProcCW; - wcex.lpszMenuName = NULL; - wcex.lpszClassName = CNCharWin; - wcex.hCursor = LoadCursor(NULL, IDC_ARROW); // Owned windows have "regular" cursors - - if (!RegisterClassEx(&wcex)) - return false; - - hCharWnd = CreateWindowEx(WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW, CNCharWin, - curCharName, WS_POPUP | WS_CAPTION | WS_VISIBLE | WS_THICKFRAME, - 100, 100, 120, 120, hMainWnd, NULL, hInst, NULL); - - if (!hCharWnd) - return false; - - ShowWindow(hCharWnd, SW_SHOWNORMAL); - UpdateWindow(hCharWnd); - SetFocus(hMainWnd); // Make sure main wnd has focus! - - // Tool palette window creation - - wcex.lpfnWndProc = WndProcTP; - wcex.lpszClassName = CNToolPal; - - if (!RegisterClassEx(&wcex)) - return false; - - hToolPalWnd = CreateWindowEx(WS_EX_WINDOWEDGE, CNToolPal, NULL, WS_POPUP, - 0, 0, sizeTPBM.x, sizeTPBM.y, hMainWnd, NULL, hInst, NULL); - - if (!hToolPalWnd) - return false; - -// Note: A better way to handle this would be to have a sub that registers ALL -// classes beforehand and passes a TRUE/FALSE back depending on whether or not -// all the classes were able to be registered or not, THEN create the windows -// and controls... - - RestoreAppState(); // Restore app related stuff - - return true; -} - -#endif -#endif diff --git a/src/editwindow.h b/src/editwindow.h index f31298c..1b24dde 100755 --- a/src/editwindow.h +++ b/src/editwindow.h @@ -10,7 +10,6 @@ #include #include "types.h" -//#include "ttedit.h" // For TTEditApp #include "toolwindow.h" // For ToolType enum #include "glyphpoints.h" @@ -36,7 +35,6 @@ class EditWindow: public QWidget QImage image; QPoint pt, ptOffset, ptPrevious; -// TTEditApp & app; // Reference to the application object double scale; // Window scaling factor int32 offsetX, offsetY; // Window offsets ToolType tool; // Current tool @@ -48,43 +46,4 @@ class EditWindow: public QWidget QCursor cur[8]; }; -#if 0 -#include // So that whoever uses this can without having - // to pull in a bunch of references manually -#include "types.h" -#include "ttedit.h" // For TTEditApp -#include "toolwindow.h" // For ToolType enum -#include "glyphpoints.h" - -class TTEditWindow: public wxWindow -{ - private: - TTEditApp & app; // Reference to the application object - double scale; // Window scaling factor - int32 offsetX, offsetY; // Window offsets - ToolType tool; // Current tool - GlyphPoints pts; // Glyph point structure - int32 ptHighlight, oldPtHighlight, ptNextHighlight, oldPtNextHighlight; - bool polyFirstPoint; - - protected: - public: - wxBitmap * bmp; - wxPoint pt, ptOffset, ptPrevious; - - // Constructor and destructor - TTEditWindow(wxFrame * parent, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = 0); - ~TTEditWindow(void); - - void OnPaint(wxPaintEvent &e); - void OnMouseEvent(wxMouseEvent &e); - - protected: - wxPoint GetAdjustedMousePosition(wxMouseEvent &e); - wxPoint GetAdjustedClientPosition(wxCoord x, wxCoord y); - - DECLARE_EVENT_TABLE() -}; -#endif - #endif // __EDITWINDOW_H__ diff --git a/src/ttedit.cpp b/src/ttedit.cpp index c812377..54617e9 100755 --- a/src/ttedit.cpp +++ b/src/ttedit.cpp @@ -31,323 +31,36 @@ // // Uncomment this for debugging... -#define DEBUG -#define DEBUGFOO // Various tool debugging... -#define DEBUGTP // Toolpalette debugging... +//#define DEBUG +//#define DEBUGFOO // Various tool debugging... +//#define DEBUGTP // Toolpalette debugging... -//#include #include "ttedit.h" #include -#include "editwindow.h" +#include "ttemainwindow.h" +//#include "charwindow.h" -// Here's the main application loop--short and simple... -int main(int argc, char * argv[]) -{ - Q_INIT_RESOURCE(ttedit); // This must the same name as the exe filename - - QApplication app(argc, argv); - TTEMainWindow TTEWin; - TTEWin.show(); - return app.exec(); -} - - -TTEMainWindow::TTEMainWindow() -{ - editWnd = new EditWindow(this); - setCentralWidget(editWnd); - setWindowIcon(QIcon(":/res/ttedit.png")); - setWindowTitle("TTEdit!"); - -#if 0 -// createActions(); - newAct = new QAction(QIcon(":/images/new.png"), tr("&New"), this); - newAct->setShortcuts(QKeySequence::New); - newAct->setStatusTip(tr("Create a new file")); - connect(newAct, SIGNAL(triggered()), this, SLOT(newFile())); - - openAct = new QAction(QIcon(":/images/open.png"), tr("&Open..."), this); - openAct->setShortcuts(QKeySequence::Open); - openAct->setStatusTip(tr("Open an existing file")); - connect(openAct, SIGNAL(triggered()), this, SLOT(open())); - - aboutQtAct = new QAction(tr("About &Qt"), this); - aboutQtAct->setStatusTip(tr("Show the Qt library's About box")); - connect(aboutQtAct, SIGNAL(triggered()), qApp, SLOT(aboutQt())); - -// createMenus(); - fileMenu = menuBar()->addMenu(tr("&File")); - fileMenu->addAction(newAct); - fileMenu->addAction(openAct); - fileMenu->addAction(saveAct); - fileMenu->addAction(saveAsAct); - fileMenu->addSeparator(); - fileMenu->addAction(exitAct); - - editMenu = menuBar()->addMenu(tr("&Edit")); - editMenu->addAction(cutAct); - editMenu->addAction(copyAct); - editMenu->addAction(pasteAct); - - menuBar()->addSeparator(); - - helpMenu = menuBar()->addMenu(tr("&Help")); - helpMenu->addAction(aboutAct); - helpMenu->addAction(aboutQtAct); - -// createToolBars(); - fileToolBar = addToolBar(tr("File")); - fileToolBar->addAction(newAct); - fileToolBar->addAction(openAct); - fileToolBar->addAction(saveAct); - - editToolBar = addToolBar(tr("Edit")); - editToolBar->addAction(cutAct); - editToolBar->addAction(copyAct); - editToolBar->addAction(pasteAct); -#endif - - // Create status bar - statusBar()->showMessage(tr("Ready")); - - ReadSettings(); - -// connect(textEdit->document(), SIGNAL(contentsChanged()), -// this, SLOT(documentWasModified())); - -// setCurrentFile(""); - setUnifiedTitleAndToolBarOnMac(true); -} - -void TTEMainWindow::closeEvent(QCloseEvent * event) -{ - WriteSettings(); - event->accept(); // ignore() if can't close for some reason -} - -void TTEMainWindow::Open(void) -{ -} - -void TTEMainWindow::ReadSettings(void) -{ - QSettings settings("Underground Software", "TTEdit"); - QPoint pos = settings.value("pos", QPoint(200, 200)).toPoint(); - QSize size = settings.value("size", QSize(400, 400)).toSize(); - resize(size); - move(pos); -} - -void TTEMainWindow::WriteSettings(void) -{ - QSettings settings("Underground Software", "TTEdit"); - settings.setValue("pos", pos()); - settings.setValue("size", size()); -} - - -#if 0 -#include "ttedit.h" -#include "charwindow.h" -#include "toolwindow.h" -#include "editwindow.h" -#include "tte_res.h" // Resource IDs -#ifdef DEBUG -#include "debug.h" -#endif - -// Pixmap resouces - -#include "res/cur1.xpm" -#include "res/cur2.xpm" -#include "res/cur3.xpm" -#include "res/cur4.xpm" -#include "res/cur5.xpm" -#include "res/cur6.xpm" -#include "res/cur7.xpm" -#include "res/cur8.xpm" -#include "res/ttedit.xpm" // *nix only, but small enough to not matter -#include "res/tool1.xpm" -#include "res/tool2.xpm" -#include "res/tool3.xpm" - - -IMPLEMENT_APP(TTEditApp) // Run the main application loop - -bool TTEditApp::OnInit() -{ - wxLog * logTarget = new wxLogStderr();//fopen("!ttedit_log.txt", "wb")); - wxLog::SetActiveTarget(logTarget); -#ifdef DEBUG - OpenDebugLog(); -#endif - - // Initialize all the top-level window members to NULL. - mainFrame = NULL; - charWin = NULL; - toolPalette = NULL; - for(int i=0; i<8; i++) - cur[i] = NULL; +// Main app constructor--we stick globally accessible stuff here... -//Shouldn't we check to see if it was successful? This just assumes - CreateResources(); - - mainFrame = new TTEditFrame(NULL, _("TTEdit"), wxPoint(155, 165), wxSize(300, 300), - wxDEFAULT_FRAME_STYLE | wxFULL_REPAINT_ON_RESIZE); -// wxMINIMIZE_BOX | wxRESIZE_BOX | wxMAXIMIZE_BOX | | wxSYSTEM_MENU | wxCAPTION); - -// charWin = new CharWindow(NULL);//, _T("Own3d W1nd0w"), wxDefaultPosition, wxDefaultSize); - charWin = new CharWindow(mainFrame, _("Own3d W1nd0w"), wxDefaultPosition, wxDefaultSize, - wxCAPTION | wxRESIZE_BORDER | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT); - - toolPalette = new ToolWindow(mainFrame, _(""), wxDefaultPosition, wxDefaultSize, - wxBORDER_NONE | wxFRAME_NO_TASKBAR | wxFRAME_FLOAT_ON_PARENT); - - return true; -} - -int TTEditApp::OnExit() -{ -#ifdef DEBUG - CloseDebugLog(); -#endif - for(int i=0; i<8; i++) - if (cur[i]) - delete cur[i]; - - return 0; -} - -// -// OS dependent method of creating cursor (works for Win32 and GTK+) -// -#define CREATE_CURSOR(storage, name, hsx, hsy) \ - wxBitmap name##_bitmap(name##_xpm); \ - wxImage name##_image = name##_bitmap.ConvertToImage(); \ - name##_image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_X, hsx); \ - name##_image.SetOption(wxIMAGE_OPTION_CUR_HOTSPOT_Y, hsy); \ - storage = new wxCursor(name##_image); - -void TTEditApp::CreateResources(void) -{ - // This is a sucky way to create cursors, but at least it's cross-platform... - // NOTE: Need to fix hotspots on a few... !!! FIX !!! [DONE] - - CREATE_CURSOR(cur[0], cur1, 1, 1); - CREATE_CURSOR(cur[1], cur2, 1, 1); - CREATE_CURSOR(cur[2], cur3, 11, 11); // Prolly won't need this soon (scroll)... - CREATE_CURSOR(cur[3], cur4, 15, 13); // Prolly won't need this soon (zoom)... - CREATE_CURSOR(cur[4], cur5, 1, 1); - CREATE_CURSOR(cur[5], cur6, 1, 1); - CREATE_CURSOR(cur[6], cur7, 1, 1); - CREATE_CURSOR(cur[7], cur8, 1, 1); -} - - -BEGIN_EVENT_TABLE(TTEditFrame, wxFrame) - EVT_MENU(IDM_OPEN, TTEditFrame::OnOpen) - EVT_MENU(IDM_EXIT, TTEditFrame::OnExit) - EVT_MENU(IDM_ABOUT, TTEditFrame::OnAbout) - EVT_MENU(ID_TBCHARWIN, TTEditFrame::OnCharWindow) - EVT_CLOSE(TTEditFrame::OnCloseWindow) -END_EVENT_TABLE() - -TTEditFrame::TTEditFrame(wxFrame * parent, const wxString &title, const wxPoint &pos, - const wxSize &size, long style): wxFrame(parent, -1, title, pos, size, style), app(wxGetApp()), mainWindow(NULL) -{ - // Initialize child subwindow members (and hopefully avoid subtle bugs) -// mainWindow = NULL; - - SetIcon(wxICON(ttedit)); -// CreateStatusBar(2); // Create 2 panes - int widths[2] = { -1, 120 }; - wxStatusBar * sb = CreateStatusBar(2, 0); // Create 2 panes - sb->SetStatusWidths(2, widths); - wxToolBar * tb = CreateToolBar(); - - if (tb != NULL) - { - // Create buttons - - wxBitmap tool1(tool1_xpm); - wxBitmap tool2(tool2_xpm); - wxBitmap tool3(tool3_xpm); - - tb->AddTool(ID_TBLEFT, _("Prev char"), tool1, _("Go to prev char"), wxITEM_NORMAL); - tb->AddTool(ID_TBRIGHT, _("Next char"), tool2, _("Go to next char"), wxITEM_NORMAL); - tb->AddTool(ID_TBCHARWIN, _("Char Wnd"), tool3, _("Toggle char window"), wxITEM_CHECK); - tb->Realize(); - } - - // Create a menu bar for the frame - menuBar = new wxMenuBar; - wxMenu * menu1 = new wxMenu; - menu1->Append(IDM_NEW, _("&New\tCtrl+N"), _("Create a new font.")); - menu1->Append(IDM_OPEN, _("&Open...\tCtrl+O"), _("Opens an existing font.")); - menu1->Append(IDM_SAVE, _("&Save\tCtrl+S"), _("Save the current font.")); - menu1->Append(IDM_SAVEAS, _("Save &As..."), _("Save the current font under a different name.")); - menu1->AppendSeparator(); - menu1->Append(IDM_EXIT, _("E&xit\tAlt+X"), _("Quits the TTEdit program.")); - menuBar->Append(menu1, _("&File")); - wxMenu * menu2 = new wxMenu; - menu2->Append(IDM_HELPTOPICS, _("&Help Topics"), _("Displays the Help contents and index.")); - menu2->AppendSeparator(); - menu2->Append(IDM_ABOUT, _("&About TTEdit"), _("Displays information about TTEdit.")); - menuBar->Append(menu2, _("&Help")); - SetMenuBar(menuBar); - - // Create child subwindows - mainWindow = new TTEditWindow(this); - - Centre(wxBOTH); // Centre frame on the screen - Show(true); // Show the frame -} - -TTEditFrame::~TTEditFrame() +TTEdit::TTEdit(int argc, char * argv[]): QApplication(argc, argv), charWnd(NULL) { } -void TTEditFrame::OnOpen(wxCommandEvent &e) -{ - wxFileDialog fd(this, _("Choose a font to load"), _(""), _(""), _("TTF files (*.ttf)|*.ttf|All files (*.*)|*.*"), wxOPEN); - - if (fd.ShowModal() != wxID_OK) - return; - -// Hmm. The font object is causing a massive crash... (gdb says it's in "Load") - if (app.font.Load((char *)fd.GetPath().c_str()) != true) - { - wxMessageDialog dlg(NULL, _("Load font failed!"), _("Houston, we have a problem..."), wxOK | wxICON_ERROR); - dlg.ShowModal(); - } -//Huzzah! It works! Now just need scaling, scrolling, etc... -// pts = app.font.GetGlyphPoints(45); -} - -void TTEditFrame::OnAbout(wxCommandEvent &e) -{ - wxMessageDialog dlg(NULL, _("TrueType Edit v1.0.1\n\nA handy tool for editing TrueType fonts!\nby James \"Shamus\" Hammons\n(C) 2006 Underground Software"), _("About TrueType Edit"), wxOK | wxICON_INFORMATION); - dlg.ShowModal(); -} - -void TTEditFrame::OnExit(wxCommandEvent &e) -{ - app.toolPalette->Destroy(); - this->Destroy(); -} - -void TTEditFrame::OnCharWindow(wxCommandEvent &e) +// Here's the main application loop--short and simple... +int main(int argc, char * argv[]) { - app.charWin->Show(e.IsChecked() ? true : false); + Q_INIT_RESOURCE(ttedit); // This must the same name as the exe filename - if (e.IsChecked()) - Raise(); +// QApplication app(argc, argv); +//printf("TTEdit app(argc, argv);\n"); + TTEdit app(argc, argv); +//printf("TTEMainWindow mainWindow;\n"); + TTEMainWindow mainWindow; +//printf("mainWindow.show();\n"); + mainWindow.show(); +//OK, it gets to here at least... +//printf("return app.exec();\n"); + return app.exec(); } -void TTEditFrame::OnCloseWindow(wxCloseEvent &e) -{ - app.toolPalette->Destroy(); - this->Destroy(); -} -#endif diff --git a/src/ttedit.h b/src/ttedit.h index d92c33a..3adf6e8 100755 --- a/src/ttedit.h +++ b/src/ttedit.h @@ -11,83 +11,16 @@ //Hrm. uh??? I thought this wasn't the way to do this stuff...??? #include -#if 0 -//#include // So that whoever uses this can without having - // to pull in a bunch of references manually -//#include "ttf.h" - -// Forward declarations - -//class TTEditWin; -//class TTEditWindow; -//class CharWindow; -//class ToolWindow; - -// -// Class representing the entire Application -// -class TTEditApp: public QMainWindow -{ - public: - TTEditFrame * mainFrame; - CharWindow * charWin; - ToolWindow * toolPalette; - TTF font; - wxCursor * cur[8]; - - bool OnInit(); - int OnExit(); - void CreateResources(void); -}; - -DECLARE_APP(TTEditApp) -#endif // Forward declarations +class CharWindow; -//class TTEditWin; -class EditWindow; - - -class TTEMainWindow: public QMainWindow +class TTEdit: public QApplication { - // All Qt apps require this macro - Q_OBJECT - public: - TTEMainWindow(); - - protected: - void closeEvent(QCloseEvent * event); + TTEdit(int argc, char * argv[]); - private slots: - void Open(); - - private: - void ReadSettings(void); - void WriteSettings(void); - - EditWindow * editWnd; -#if 0 - private: - protected: public: - TTEditApp & app; // Reference to the application object - // Subwindows for reference within the program. - TTEditWindow * mainWindow; - wxMenuBar * menuBar; - - // Constructor and destructor - TTEditFrame(wxFrame * parent, const wxString &title, const wxPoint &pos, const wxSize &size, long style); - ~TTEditFrame(void); - - void OnCloseWindow(wxCloseEvent &e); - void OnOpen(wxCommandEvent &e); - void OnExit(wxCommandEvent &e); - void OnAbout(wxCommandEvent &e); - void OnCharWindow(wxCommandEvent &e); - - DECLARE_EVENT_TABLE() -#endif + CharWindow * charWnd; }; #endif // __TTEDIT_H__ diff --git a/ttedit.pro b/ttedit.pro index 7315add..1e7c443 100644 --- a/ttedit.pro +++ b/ttedit.pro @@ -1,22 +1,28 @@ # Use 'qmake -o Makefile ttedit.pro' CONFIG += qt +#debug doesn't do shit +#CONFIG += qt debug HEADERS += src/ttedit.h +HEADERS += src/ttemainwindow.h HEADERS += src/editwindow.h HEADERS += src/glyphpoints.h HEADERS += src/types.h HEADERS += src/debug.h HEADERS += src/toolwindow.h +HEADERS += src/charwindow.h HEADERS += src/vector.h HEADERS += src/graphicprimitives.h HEADERS += src/list.h SOURCES += src/ttedit.cpp +SOURCES += src/ttemainwindow.cpp SOURCES += src/editwindow.cpp SOURCES += src/glyphpoints.cpp SOURCES += src/debug.cpp SOURCES += src/toolwindow.cpp +SOURCES += src/charwindow.cpp SOURCES += src/vector.cpp SOURCES += src/graphicprimitives.cpp -- 2.37.2