[haiku-commits] r40351 - haiku/trunk/src/preferences/printers

  • From: philippe.houdoin@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 2 Feb 2011 18:02:56 +0100 (CET)

Author: phoudoin
Date: 2011-02-02 18:02:56 +0100 (Wed, 02 Feb 2011)
New Revision: 40351
Changeset: http://dev.haiku-os.org/changeset/40351

Modified:
   haiku/trunk/src/preferences/printers/PrintersWindow.cpp
   haiku/trunk/src/preferences/printers/TestPageView.cpp
   haiku/trunk/src/preferences/printers/TestPageView.h
Log:
Now doing TestPageView content layout with... layout API!
Expand a bit the content. The print test page now features:
- a text giving info on the printer name, the driver, the transport (if any)
- a vector leaf logo with blue gradient
- gradients of the 3 primary colors, 3 secondary colors and white to black
- a radial lines

Unfortunatly, BPrintJob is not layout aware, and none of these are currently
recorded in the print job yet, except for corner marks.


Modified: haiku/trunk/src/preferences/printers/PrintersWindow.cpp
===================================================================
--- haiku/trunk/src/preferences/printers/PrintersWindow.cpp     2011-02-01 
22:44:11 UTC (rev 40350)
+++ haiku/trunk/src/preferences/printers/PrintersWindow.cpp     2011-02-02 
17:02:56 UTC (rev 40351)
@@ -17,6 +17,7 @@
 #include <Button.h>
 #include <Catalog.h>
 #include <FindDirectory.h>
+#include <Layout.h>
 #include <ListView.h>
 #include <Locale.h>
 #include <PrintJob.h>
@@ -171,33 +172,34 @@
 
        // job.ConfigJob();
 
-       // enforce job config
        BMessage* settings = job.Settings();
+       if (settings == NULL)
+               return;
+
+       // enforce job config properties
        settings->AddInt32("copies", 1);
        settings->AddInt32("first_page", 1);
        settings->AddInt32("last_page", -1);
 
-       settings = job.Settings();
-
-
        job.BeginJob();
 
-
+       BRect paperRect = job.PaperRect();
        BRect pageRect = job.PrintableRect();
-       // BWindow* dummyWindow = new BWindow(pageRect, "dummy", 
B_TITLED_WINDOW, 0);
-       // dummyWindow->Show();
        TestPageView* testPage = new TestPageView(pageRect, printer);
-       // views cannot be printed unless they're attached to a window
-       // just hide our test page...
-       testPage->Hide();
-       AddChild(testPage);
-       // dummyWindow->AddChild(testPage);
 
-       job.DrawView(testPage, pageRect, BPoint(0.0, 0.0));
+       BWindow* dummyWindow = new BWindow(paperRect.OffsetByCopy(40, 40),
+               B_TRANSLATE("Test Page"), B_TITLED_WINDOW, 0);
+               // B_NOT_RESIZABLE | B_NOT_ZOOMABLE);
+       // dummyWindow->Show();
+       dummyWindow->AddChild(testPage);
+
+       if (testPage->LockLooper()) {
+               job.DrawView(testPage, testPage->Bounds(), B_ORIGIN);
+               testPage->UnlockLooper();
+       }
        job.SpoolPage();
 
-       RemoveChild(testPage);
-       delete testPage;
+       delete dummyWindow;
 
        if (!job.CanContinue())
                return;

Modified: haiku/trunk/src/preferences/printers/TestPageView.cpp
===================================================================
--- haiku/trunk/src/preferences/printers/TestPageView.cpp       2011-02-01 
22:44:11 UTC (rev 40350)
+++ haiku/trunk/src/preferences/printers/TestPageView.cpp       2011-02-02 
17:02:56 UTC (rev 40351)
@@ -9,8 +9,20 @@
 
 #include "TestPageView.h"
 
+#include <math.h>
+
+#include <AffineTransform.h>
 #include <Catalog.h>
+#include <Font.h>
 #include <GradientLinear.h>
+#include <GradientRadial.h>
+#include <GridLayoutBuilder.h>
+#include <GroupLayoutBuilder.h>
+#include <LayoutUtils.h>
+#include <TextView.h>
+#include <Shape.h>
+#include <String.h>
+#include <StringView.h>
 
 #include "PrinterListView.h"
 
@@ -19,113 +31,307 @@
 #define B_TRANSLATE_CONTEXT "TestPageView"
 
 
-TestPageView::TestPageView(BRect frame, PrinterItem* printer)
-       : BView(frame, "testpage", B_FOLLOW_NONE, B_WILL_DRAW),
-       fPrinter(printer)
+// #pragma mark LeafView
+
+
+// path data for the leaf shape
+static const BPoint kLeafBegin(56.24793f, 15.46287f);
+static BPoint kLeafCurves[][3] = {
+       { BPoint(61.14, 28.89), BPoint(69.78, 38.25), BPoint(83.48, 44.17) },
+       { BPoint(99.46, 37.52), BPoint(113.27, 29.61), BPoint(134.91, 30.86) },
+       { BPoint(130.58, 36.53), BPoint(126.74, 42.44), BPoint(123.84, 48.81) },
+       { BPoint(131.81, 42.22), BPoint(137.53, 38.33), BPoint(144.37, 33.10) },
+       { BPoint(169.17, 23.55), BPoint(198.90, 15.55), BPoint(232.05, 10.51) },
+       { BPoint(225.49, 18.37), BPoint(219.31, 28.17), BPoint(217.41, 40.24) },
+       { BPoint(227.70, 26.60), BPoint(239.97, 14.63), BPoint(251.43, 8.36) },
+       { BPoint(288.89, 9.12), BPoint(322.73, 14.33), BPoint(346.69, 31.67) },
+       { BPoint(330.49, 37.85), BPoint(314.36, 44.25), BPoint(299.55, 54.17) },
+       { BPoint(292.48, 52.54), BPoint(289.31, 49.70), BPoint(285.62, 47.03) },
+       { BPoint(283.73, 54.61), BPoint(284.46, 57.94), BPoint(285.62, 60.60) },
+       { BPoint(259.78, 76.14), BPoint(233.24, 90.54), BPoint(202.41, 98.10) },
+       { BPoint(194.43, 95.36), BPoint(185.96, 92.39), BPoint(179.63, 88.33) },
+       { BPoint(180.15, 94.75), BPoint(182.73, 99.76), BPoint(185.62, 104.53) 
},
+       { BPoint(154.83, 119.46), BPoint(133.21, 118.97), BPoint(125.62, 94.88) 
},
+       { BPoint(124.70, 98.79), BPoint(124.11, 103.67), BPoint(124.19, 110.60) 
},
+       { BPoint(116.42, 111.81), BPoint(85.82, 99.60), BPoint(83.25, 51.96) },
+       { BPoint(62.50, 42.57), BPoint(58.12, 33.18), BPoint(50.98, 23.81) } };
+static const int kNumLeafCurves = sizeof(kLeafCurves) / sizeof(kLeafCurves[0]);
+static const float kLeafWidth = 372.f;
+static const float kLeafHeight = 121.f;
+
+
+class LeafView : public BView {
+public:
+                                                               LeafView();
+       virtual void                            Draw(BRect updateRect);
+};
+
+
+LeafView::LeafView()
+       :
+       BView("leafview", B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE)
 {
+       SetViewColor(255, 255, 255);
 }
 
 
 void
-TestPageView::Draw(BRect updateRect)
+LeafView::Draw(BRect updateRect)
 {
-       // TODO: build using layout manager the page content,
-       // using subviews, to adapt any page format.
+       float scale = Bounds().Width() / kLeafWidth;
+       BAffineTransform transform;
+       transform.ScaleBy(scale);
 
-       // Draw corners
+       // BGradientRadial gradient(BPoint(kLeafWidth * 0.75, kLeafHeight * 
1.5),
+       //      kLeafWidth * 2);
+       BGradientLinear gradient(B_ORIGIN,
+               transform.Apply(BPoint(kLeafWidth, kLeafHeight)));
+       rgb_color lightBlue = make_color(6, 169, 255);
+       rgb_color darkBlue = make_color(0, 50, 126);
+       gradient.AddColor(darkBlue, 0.0);
+       gradient.AddColor(lightBlue, 255.0);
 
-       float width = Bounds().Width();
-       float height = Bounds().Height();
-       float minDimension = MIN(width, height);
+       // build leaf shape
+       BShape leafShape;
+       leafShape.MoveTo(transform.Apply(kLeafBegin));
+       for (int i = 0; i < kNumLeafCurves; ++i) {
+               BPoint controlPoints[3];
+               for (int j = 0; j < 3; ++j)
+                       controlPoints[j] = transform.Apply(kLeafCurves[i][j]);
+               leafShape.BezierTo(controlPoints);
+       }
+       leafShape.Close();
 
-       float size = minDimension * 0.02;
+       PushState();
+       SetDrawingMode(B_OP_ALPHA);
+       SetHighColor(0, 0, 0, 50);
+       for (int i = 2; i >= 0; --i) {
+               SetOrigin(i * 0.1, i * 0.3);
+               SetPenSize(i * 2);
+               StrokeShape(&leafShape);
+       }
+       PopState();
 
-       BPoint pt = Bounds().LeftTop();
-       StrokeLine(pt, BPoint(pt.x + size, pt.y));
-       StrokeLine(pt, BPoint(pt.x, pt.y + size));
+       FillShape(&leafShape, gradient);
+}
 
-       pt = Bounds().RightTop();
-       StrokeLine(pt, BPoint(pt.x - size, pt.y));
-       StrokeLine(pt, BPoint(pt.x, pt.y + size));
 
-       pt = Bounds().RightBottom();
-       StrokeLine(pt, BPoint(pt.x - size, pt.y));
-       StrokeLine(pt, BPoint(pt.x, pt.y - size));
+// #pragma mark -
 
-       pt = Bounds().LeftBottom();
-       StrokeLine(pt, BPoint(pt.x + size, pt.y));
-       StrokeLine(pt, BPoint(pt.x, pt.y - size));
 
-       // Draw some text
+class RadialLinesView : public BView {
+public:
+                                                               
RadialLinesView();
 
-       BString text;
+       virtual void                            Draw(BRect updateRect);
 
-       text = B_TRANSLATE("Test Page for '%printer_name%'");
-       text.ReplaceFirst("%printer_name%", fPrinter->Name());
+       virtual bool                            HasHeightForWidth() { return 
true; }
+       virtual void                            GetHeightForWidth(float width, 
float* min,
+                                                                       float* 
max, float* preferred);
+};
 
-       SetFont(be_bold_font);
-       MovePenTo(50, 50);
-       DrawString(text);
 
-       SetFont(be_plain_font);
-       text = B_TRANSLATE("Driver: %driver%");
-       text.ReplaceFirst("%driver%", fPrinter->Driver());
-       MovePenTo(50, 80);
-       DrawString(text);
+RadialLinesView::RadialLinesView()
+       : BView("radiallinesview", B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE)
+{
+       SetViewColor(255, 255, 255);
+}
 
-       if (strlen(fPrinter->Transport()) > 0) {
-               text = B_TRANSLATE("Transport: %transport% 
%transport_address%");
-               text.ReplaceFirst("%transport%", fPrinter->Transport());
-               text.ReplaceFirst("%transport_address%", 
fPrinter->TransportAddress());
-               MovePenTo(50, 110);
-               DrawString(text);
+
+void
+RadialLinesView::GetHeightForWidth(float width,
+       float* min, float* max, float* preferred)
+{
+       // Enforce a width/height ratio of 1
+
+       if (min)
+               *min = width;
+
+       if (max)
+               *max = width;
+
+       if (preferred)
+               *preferred = width;
+}
+
+
+void
+RadialLinesView::Draw(BRect updateRect)
+{
+       const rgb_color black = { 0, 0, 0, 255 };
+       const int angleStep = 4;
+
+       BRect rect(Bounds());
+       float size = rect.Width();
+       if (size > rect.Height())
+               size = rect.Height();
+       size *= 0.45; // leave 10% of margin
+
+       BPoint center(rect.Width() / 2, rect.Height() / 2);
+
+       BeginLineArray(360 / angleStep);
+       for (int i = 0; i < 360; i += angleStep) {
+               double angle = i * M_PI / 180;
+               BPoint pt(size * cos(angle), size * sin(angle));
+               AddLine(center, center + pt, black);
        }
+       EndLineArray();
+}
 
-       // Draw some gradients
 
-       BRect rect(50, 140, 50 + 200, 140 + 20);
+// #pragma mark -
+
+
+static const struct {
+       const char* name;
+       rgb_color       color;
+} kColorGradients[] = {
+       { B_TRANSLATE_MARK("Red"),              {255, 0, 0, 255} },
+       { B_TRANSLATE_MARK("Green"),    {0, 255, 0, 255} },
+       { B_TRANSLATE_MARK("Blue"),     {0, 0, 255, 255} },
+       { B_TRANSLATE_MARK("Yellow"),   {255, 255, 0, 255} },
+       { B_TRANSLATE_MARK("Magenta"),  {255, 0, 255, 255} },
+       { B_TRANSLATE_MARK("Cyan"),     {0, 255, 255, 255} },
+       { B_TRANSLATE_MARK("Black"),    {0, 0, 0, 255} }
+};
+static const int kNumColorGradients = sizeof(kColorGradients)
+       / sizeof(kColorGradients[0]);
+
+
+class ColorGradientView : public BView {
+public:
+                                                               
ColorGradientView(rgb_color color);
+       virtual void                            Draw(BRect updateRect);
+
+private:
+                       rgb_color                       fColor;
+};
+
+
+ColorGradientView::ColorGradientView(rgb_color color)
+       :
+       BView("colorgradientview", B_WILL_DRAW | B_FULL_UPDATE_ON_RESIZE),
+       fColor(color)
+{
+}
+
+
+void
+ColorGradientView::Draw(BRect updateRect)
+{
+       BRect rect(Bounds());
+
        BGradientLinear gradient(rect.LeftTop(), rect.RightBottom());
        rgb_color white = make_color(255, 255, 255);
        gradient.AddColor(white, 0.0);
+       gradient.AddColor(fColor, 255.0);
 
-       // Red gradient
-       gradient.AddColor(make_color(255, 0, 0), 255.0);
        FillRect(rect, gradient);
        StrokeRect(rect);
+}
 
-       // Green gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(0, 255, 0));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
 
-       // Blue gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(0, 0, 255));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
+// #pragma mark -
 
-       // Yellow gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(255, 255, 0));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
 
-       // Magenta gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(255, 0, 255));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
+TestPageView::TestPageView(BRect frame, PrinterItem* printer)
+       : BView(frame, "testpage", /* B_FOLLOW_NONE */ B_FOLLOW_ALL,
+               B_WILL_DRAW | B_DRAW_ON_CHILDREN | B_FULL_UPDATE_ON_RESIZE),
+       fPrinter(printer)
+{
+       SetViewColor(255, 255, 255);
+}
 
-       // Cyan gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(0, 255, 255));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
 
-       // Gray gradient
-       rect.OffsetBy(0, 20);
-       gradient.SetColor(1, make_color(0, 0, 0));
-       FillRect(rect, gradient);
-       StrokeRect(rect);
+void
+TestPageView::AttachedToWindow()
+{
+       BTextView* statusView = new BTextView("statusView",
+               be_plain_font, NULL, B_WILL_DRAW);
+
+       statusView->SetInsets(10, 10, 10, 10);
+       statusView->MakeEditable(false);
+       statusView->MakeSelectable(false);
+
+       const char* title = B_TRANSLATE("Test Page");
+       BString text;
+       text << title << "\n\n";
+       text << B_TRANSLATE(
+               "Printer: %printer_name%\n"
+               "Driver:  %driver%\n");
+
+       text.ReplaceFirst("%printer_name%", fPrinter->Name());
+       text.ReplaceFirst("%driver%", fPrinter->Driver());
+       if (strlen(fPrinter->Transport()) > 0) {
+               text << B_TRANSLATE("Transport: %transport% 
%transport_address%");
+
+               text.ReplaceFirst("%transport%", fPrinter->Transport());
+               text.ReplaceFirst("%transport_address%", 
fPrinter->TransportAddress());
+       }
+
+       statusView->SetText(text.String());
+       BFont font;
+       statusView->SetStylable(true);
+       statusView->GetFont(&font);
+       font.SetFace(B_BOLD_FACE);
+       font.SetSize(font.Size() * 1.7);
+       statusView->SetFontAndColor(0, strlen(title), &font);
+
+       BGridLayoutBuilder gradiants(2.0);
+       gradiants.View()->SetViewColor(B_TRANSPARENT_COLOR);
+
+       for (int i = 0; i < kNumColorGradients; ++i) {
+               BStringView* label = new BStringView(kColorGradients[i].name,
+                       kColorGradients[i].name);
+               // label->SetAlignment(B_ALIGN_RIGHT);
+               gradiants.Add(label, 0, i);
+               gradiants.Add(new ColorGradientView(kColorGradients[i].color), 
1, i);
+       }
+
+       SetLayout(new BGroupLayout(B_HORIZONTAL));
+       AddChild(BGroupLayoutBuilder(B_VERTICAL, 0)
+               .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
+                       .Add(statusView)
+                       .Add(new LeafView())
+               )
+               .Add(BGroupLayoutBuilder(B_HORIZONTAL, 0)
+                       .Add(gradiants, 0.60)
+                       .Add(new RadialLinesView(), 0.40)
+               )
+               .AddGlue()
+               .End()
+       );
+
+       // set layout background color to transparent instead
+       // of default UI panel color
+       ChildAt(0)->SetViewColor(B_TRANSPARENT_COLOR);
 }
+
+
+void
+TestPageView::DrawAfterChildren(BRect updateRect)
+{
+       // Draw corners marks
+
+       float width = Bounds().Width();
+       float height = Bounds().Height();
+       float minDimension = MIN(width, height);
+
+       float size = minDimension * 0.05;
+
+       BPoint pt = Bounds().LeftTop();
+       StrokeLine(pt, BPoint(pt.x + size, pt.y));
+       StrokeLine(pt, BPoint(pt.x, pt.y + size));
+
+       pt = Bounds().RightTop();
+       StrokeLine(pt, BPoint(pt.x - size, pt.y));
+       StrokeLine(pt, BPoint(pt.x, pt.y + size));
+
+       pt = Bounds().RightBottom();
+       StrokeLine(pt, BPoint(pt.x - size, pt.y));
+       StrokeLine(pt, BPoint(pt.x, pt.y - size));
+
+       pt = Bounds().LeftBottom();
+       StrokeLine(pt, BPoint(pt.x + size, pt.y));
+       StrokeLine(pt, BPoint(pt.x, pt.y - size));
+}

Modified: haiku/trunk/src/preferences/printers/TestPageView.h
===================================================================
--- haiku/trunk/src/preferences/printers/TestPageView.h 2011-02-01 22:44:11 UTC 
(rev 40350)
+++ haiku/trunk/src/preferences/printers/TestPageView.h 2011-02-02 17:02:56 UTC 
(rev 40351)
@@ -15,12 +15,13 @@
 
 class TestPageView : public BView {
 public:
-                                               TestPageView(BRect rect, 
PrinterItem* printer);
+                                                       TestPageView(BRect 
rect, PrinterItem* printer);
 
-       void                            Draw(BRect rect);
+               void                            AttachedToWindow();
+               void                            DrawAfterChildren(BRect rect);
 
 private:
-       PrinterItem*    fPrinter;
+               PrinterItem*            fPrinter;
 };
 
 #endif


Other related posts: