From fae6fb6d69b20bf18e1bcc51ec1384b1a313d6a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 19 Nov 2006 10:13:23 +0000 Subject: [PATCH] * fixed stupid bug that prevented saving in native format * fixed bug in RDefExporter * improved zooming, icon is now centered at program start git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@19328 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/icon-o-matic/CanvasView.cpp | 69 ++++++++++++------- src/apps/icon-o-matic/CanvasView.h | 3 +- src/apps/icon-o-matic/gui/SavePanel.cpp | 9 ++- .../import_export/flat_icon/RDefExporter.cpp | 2 +- 4 files changed, 51 insertions(+), 32 deletions(-) diff --git a/src/apps/icon-o-matic/CanvasView.cpp b/src/apps/icon-o-matic/CanvasView.cpp index bc9cd1d2af..22ecd8c7c9 100644 --- a/src/apps/icon-o-matic/CanvasView.cpp +++ b/src/apps/icon-o-matic/CanvasView.cpp @@ -69,9 +69,18 @@ CanvasView::AttachedToWindow() SetLowColor(kStripesHigh); SetHighColor(kStripesLow); - _AllocBackBitmap(Bounds().Width(), Bounds().Height()); + BRect bounds(Bounds()); - _SetZoom(8.0); + _AllocBackBitmap(bounds.Width(), bounds.Height()); + + // layout icon in the center + BRect bitmapBounds(fBitmap->Bounds()); + fCanvasOrigin.x = floorf((bounds.left + bounds.right + - bitmapBounds.right - bitmapBounds.left) / 2.0 + 0.5); + fCanvasOrigin.y = floorf((bounds.top + bounds.bottom + - bitmapBounds.bottom - bitmapBounds.top) / 2.0 + 0.5); + + _SetZoom(8.0, false); } // FrameResized @@ -79,6 +88,12 @@ void CanvasView::FrameResized(float width, float height) { _AllocBackBitmap(width, height); + + // keep canvas centered + BPoint oldCanvasOrigin = fCanvasOrigin; + SetDataRect(_LayoutCanvas()); + if (oldCanvasOrigin != fCanvasOrigin) + Invalidate(); } // Draw @@ -515,34 +530,30 @@ CanvasView::_NextZoomOutLevel(double zoom) const // _SetZoom void -CanvasView::_SetZoom(double zoomLevel) +CanvasView::_SetZoom(double zoomLevel, bool mouseIsAnchor) { if (fZoomLevel == zoomLevel) return; - // zoom into mouse position, or into center of view - BPoint anchor = MouseInfo()->position; - BRect bounds(Bounds()); - if (!bounds.Contains(anchor)) { - bounds = _CanvasRect(); - anchor.x = (bounds.left + bounds.right) / 2.0; - anchor.y = (bounds.top + bounds.bottom) / 2.0; - } -printf("anchor: %.2f, %.2f\n", anchor.x, anchor.y); + // TODO: still not working 100% correctly - BPoint offset; - if (fZoomLevel < zoomLevel) { - offset.x = anchor.x * (zoomLevel / fZoomLevel) - anchor.x; - offset.y = anchor.y * (zoomLevel / fZoomLevel) - anchor.y; - } else { - offset.x = -anchor.x * (zoomLevel / fZoomLevel); - offset.y = -anchor.y * (zoomLevel / fZoomLevel); - } + // zoom into center of view + BRect bounds(Bounds()); + BPoint anchor; + anchor.x = (bounds.left + bounds.right + 1) / 2.0; + anchor.y = (bounds.top + bounds.bottom + 1) / 2.0; + + BPoint canvasAnchor = anchor; + ConvertToCanvas(&canvasAnchor); fZoomLevel = zoomLevel; SetDataRect(_LayoutCanvas()); -printf("offset: %.2f, %.2f\n", offset.x, offset.y); + ConvertFromCanvas(&canvasAnchor); + + BPoint offset; + offset.x = roundf(canvasAnchor.x - anchor.x); + offset.y = roundf(canvasAnchor.y - anchor.y); SetScrollOffset(ScrollOffset() + offset); @@ -564,14 +575,22 @@ CanvasView::_LayoutCanvas() // TODO: ask manipulators to extend size - // left top of canvas within empty area - fCanvasOrigin.x = floorf(r.Width() * 0.25); - fCanvasOrigin.y = floorf(r.Height() * 0.25); + BRect bitmapRect = r; // resize for empty area around bitmap + // (the size we want, but might still be much smaller than view) r.right += r.Width() * 0.5; r.bottom += r.Height() * 0.5; - return r; + // left top of canvas within empty area + BRect bounds(Bounds()); + bounds.OffsetTo(B_ORIGIN); + bounds = bounds | r; + fCanvasOrigin.x = floorf((bounds.left + bounds.right + - bitmapRect.right - bitmapRect.left) / 2.0 + 0.5); + fCanvasOrigin.y = floorf((bounds.top + bounds.bottom + - bitmapRect.bottom - bitmapRect.top) / 2.0 + 0.5); + + return bounds; } diff --git a/src/apps/icon-o-matic/CanvasView.h b/src/apps/icon-o-matic/CanvasView.h index 2b1ef00789..a5bcaaefb7 100644 --- a/src/apps/icon-o-matic/CanvasView.h +++ b/src/apps/icon-o-matic/CanvasView.h @@ -84,7 +84,8 @@ class CanvasView : public StateView, private: double _NextZoomInLevel(double zoom) const; double _NextZoomOutLevel(double zoom) const; - void _SetZoom(double zoomLevel); + void _SetZoom(double zoomLevel, + bool mouseIsAnchor = true); BRect _LayoutCanvas(); BBitmap* fBitmap; diff --git a/src/apps/icon-o-matic/gui/SavePanel.cpp b/src/apps/icon-o-matic/gui/SavePanel.cpp index 7804a88d3c..cb62e11ded 100644 --- a/src/apps/icon-o-matic/gui/SavePanel.cpp +++ b/src/apps/icon-o-matic/gui/SavePanel.cpp @@ -152,11 +152,10 @@ SavePanel::~SavePanel() void SavePanel::SendMessage(const BMessenger* messenger, BMessage* message) { - // add the current translator information to the message - if (message) { - int32 mode = ExportMode(); - message->AddInt32("export mode", mode); - } + // add the current format information to the message, + // bot only if we are indeed in export mode + if (message && fFormatM->IsEnabled()) + message->AddInt32("export mode", ExportMode()); // let the original file panel code handle the rest BFilePanel::SendMessage(messenger, message); } diff --git a/src/apps/icon-o-matic/import_export/flat_icon/RDefExporter.cpp b/src/apps/icon-o-matic/import_export/flat_icon/RDefExporter.cpp index 128b0782b4..95c94f0135 100644 --- a/src/apps/icon-o-matic/import_export/flat_icon/RDefExporter.cpp +++ b/src/apps/icon-o-matic/import_export/flat_icon/RDefExporter.cpp @@ -50,7 +50,7 @@ RDefExporter::_Export(const uint8* source, size_t sourceSize, BPositionIO* strea { char buffer[2048]; // write header - sprintf(buffer, "\nresource() #'RAWT' array {\n"); + sprintf(buffer, "\nresource() #'VICN' array {\n"); size_t size = strlen(buffer); ssize_t written = stream->Write(buffer, size);