[haiku-commits] haiku: hrev43773 - in src: apps/activitymonitor kits/interface

  • From: stpere@xxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 23 Feb 2012 01:12:49 +0100 (CET)

hrev43773 adds 1 changeset to branch 'master'
old head: f1553a0fc450d8a1442f6a52873906ca98e14a86
new head: d63b75faf848697b07bfad9b71899e6caf9ab5bc

----------------------------------------------------------------------------

d63b75f: Outline of labels/strings drawn to desktop
  
  * Rather than duplicating the decision taking logic involving wheter or not 
to draw
  the outline or glow in every replicant, update be_control_look to make it more
  generic.
  * The Monitoring of the background preferences is now only done in Tracker 
(where it
  was already being done).
  * Add a BControlLook::B_IGNORE_OUTLINE flag to avoid this new behaviour.
  * Remove that said logic from ActivityMonitor and use be_control_look.
  * Use the ignore flag in DeskCalc to avoid the outline in its case.
  
  Should fix #7716, #7291.

                                [ Philippe Saint-Pierre <stpere@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev43773
Commit:      d63b75faf848697b07bfad9b71899e6caf9ab5bc
URL:         http://cgit.haiku-os.org/haiku/commit/?id=d63b75f
Author:      Philippe Saint-Pierre <stpere@xxxxxxxxx>
Date:        Thu Feb 23 00:06:22 2012 UTC

Ticket:      https://dev.haiku-os.org/ticket/7291
Ticket:      https://dev.haiku-os.org/ticket/7716

----------------------------------------------------------------------------

7 files changed, 136 insertions(+), 142 deletions(-)
headers/os/interface/ControlLook.h        |    8 ++
src/apps/activitymonitor/ActivityView.cpp |  136 ++-----------------------
src/apps/activitymonitor/ActivityView.h   |    5 -
src/apps/deskcalc/CalcView.cpp            |    1 +
src/kits/interface/ControlLook.cpp        |  120 ++++++++++++++++++++--
src/kits/interface/Jamfile                |    3 +
src/kits/tracker/BackgroundImage.cpp      |    5 +

----------------------------------------------------------------------------

diff --git a/headers/os/interface/ControlLook.h 
b/headers/os/interface/ControlLook.h
index b832a1d..130a0ba 100644
--- a/headers/os/interface/ControlLook.h
+++ b/headers/os/interface/ControlLook.h
@@ -70,6 +70,7 @@ public:
                B_HOVER                         = 1 << 3,
                B_DISABLED                      = 1 << 4,
                B_DEFAULT_BUTTON        = 1 << 5,
+               B_IGNORE_OUTLINE        = 1 << 6,
 
                B_BLEND_FRAME           = 1 << 16
        };
@@ -271,6 +272,8 @@ public:
                                                                        const 
rgb_color& base, uint32 flags,
                                                                        const 
BPoint& where);
 
+                       void                            
SetBackgroundInfo(BMessage msg);
+
 protected:
                        void                            _DrawButtonFrame(BView* 
view, BRect& rect,
                                                                        const 
BRect& updateRect,
@@ -362,6 +365,11 @@ protected:
                                                                        const 
rgb_color& bevelTopColor,
                                                                        const 
rgb_color& bevelRightColor,
                                                                        const 
BGradientLinear& fillGradient);
+private:
+                       bool                            fCachedOutline;
+                       int32                           fCachedWorkspace;
+                       BMessage                        fBackgroundInfo;
+               
 };
 
 extern BControlLook* be_control_look;
diff --git a/src/apps/activitymonitor/ActivityView.cpp 
b/src/apps/activitymonitor/ActivityView.cpp
index e7d98e7..88a5ae7 100644
--- a/src/apps/activitymonitor/ActivityView.cpp
+++ b/src/apps/activitymonitor/ActivityView.cpp
@@ -20,12 +20,10 @@
 #include <Bitmap.h>
 #include <Catalog.h>
 #include <Dragger.h>
-#include <fs_attr.h>
 #include <MenuItem.h>
 #include <MessageRunner.h>
 #include <PopUpMenu.h>
 #include <Shape.h>
-#include <StorageKit.h>
 #include <String.h>
 
 #include "ActivityMonitor.h"
@@ -179,7 +177,6 @@ const uint32 kMsgUpdateResolution = 'ures';
 
 extern const char* kSignature;
 
-const char* kDesktopAttrName = "be:bgndimginfo";
 
 Scale::Scale(scale_type type)
        :
@@ -599,7 +596,6 @@ ActivityView::ActivityView(BMessage* archive)
 
 ActivityView::~ActivityView()
 {
-       stop_watching(this);
        delete fOffscreen;
        delete fSystemInfoHandler;
 }
@@ -891,9 +887,6 @@ ActivityView::RemoveAllDataSources()
 void
 ActivityView::AttachedToWindow()
 {
-       if (Parent() && (Parent()->Flags() & B_DRAW_ON_CHILDREN) != 0)
-               _LoadBackgroundInfo(true);
-
        Looper()->AddHandler(fSystemInfoHandler);
        fSystemInfoHandler->StartWatching();
 
@@ -1114,17 +1107,6 @@ ActivityView::MessageReceived(BMessage* message)
                        ActivityMonitor::ShowAbout();
                        break;
 
-               case B_NODE_MONITOR:
-               {
-                       BString attrName;
-                       if (message->FindString("attr", &attrName) == B_OK) {
-                               if (attrName == kDesktopAttrName)
-                                       _LoadBackgroundInfo(false);
-                       } else
-                               _LoadBackgroundInfo(false);
-                       break;
-               }
-
                case kMsgUpdateResolution:
                {
                        int32 resolution;
@@ -1447,37 +1429,6 @@ ActivityView::_UpdateResolution(int32 resolution, bool 
broadcast)
 
 
 void
-ActivityView::_LoadBackgroundInfo(bool watch)
-{
-       fCachedOutline = false;
-       fCachedWorkspace = -1;
-       BPath path;
-       if (find_directory(B_DESKTOP_DIRECTORY, &path) == B_OK) {
-               BNode desktopNode = BNode(path.Path());
-
-               attr_info info;
-               if (desktopNode.GetAttrInfo(kDesktopAttrName, &info) != B_OK)
-                       return;
-
-               char* buffer = new char[info.size];
-               if (desktopNode.ReadAttr(kDesktopAttrName, B_MESSAGE_TYPE, 0,
-                       buffer, (size_t)info.size) == info.size) {
-                               BMessage message;
-                               if (message.Unflatten(buffer) == B_OK)
-                                       fBackgroundInfo = message;
-               }
-               delete[] buffer;
-
-               if (watch) {
-                       node_ref nref;
-                       desktopNode.GetNodeRef(&nref);
-                       watch_node(&nref, B_WATCH_ATTR, this);
-               }
-       }
-}
-
-
-void
 ActivityView::Draw(BRect updateRect)
 {
        bool drawBackground = true;
@@ -1533,87 +1484,16 @@ ActivityView::Draw(BRect updateRect)
 
                if (drawBackground)
                        SetHighColor(ui_color(B_CONTROL_TEXT_COLOR));
-               else {
-                       rgb_color c = Parent()->ViewColor();
-                       rgb_color textColor = c.red + c.green * 1.5f + c.blue * 
0.50f
-                               >= 300 ? kBlack : kWhite;
-
-                       int32 mask;
-                       bool tmpOutline = false;
-                       bool outline = fCachedOutline;
-                       int8 indice = 0;
-
-                       if (fCachedWorkspace != current_workspace()) {
-                               while 
(fBackgroundInfo.FindInt32("be:bgndimginfoworkspaces",
-                                               indice, &mask) == B_OK
-                                       && 
fBackgroundInfo.FindBool("be:bgndimginfoerasetext",
-                                               indice, &tmpOutline) == B_OK) {
-                                       if (((1 << current_workspace()) & mask) 
!= 0) {
-                                               outline = tmpOutline;
-                                               fCachedWorkspace = 
current_workspace();
-                                               fCachedOutline = outline;
-                                               break;
-                                       }
-                                       indice++;
-                               }
-                       }
 
-                       if (outline) {
-                               SetDrawingMode(B_OP_ALPHA);
-                               SetBlendingMode(B_CONSTANT_ALPHA, 
B_ALPHA_OVERLAY);
-
-                               BFont font;
-                               GetFont(&font);
-                               if (textColor == kBlack) {
-                                       // Black text with white halo/glow
-                                       rgb_color glowColor = kWhite;
-
-                                       font.SetFalseBoldWidth(2.0);
-                                       SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
-
-                                       glowColor.alpha = 30;
-                                       SetHighColor(glowColor);
-                                       DrawString(label.String(), BPoint(6 + 
colorBox.right, y));
-                                       DrawString(text.String(), 
BPoint(frame.right - width, y));
-
-                                       font.SetFalseBoldWidth(1.0);
-                                       SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
-
-                                       glowColor.alpha = 65;
-                                       SetHighColor(glowColor);
-                                       DrawString(label.String(), BPoint(6 + 
colorBox.right, y));
-                                       DrawString(text.String(), 
BPoint(frame.right - width, y));
-
-                                       font.SetFalseBoldWidth(0.0);
-                                       SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
-                               } else {
-                                       // white text with black outline
-                                       rgb_color outlineColor = kBlack;
-
-                                       font.SetFalseBoldWidth(1.0);
-                                       SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
-
-                                       outlineColor.alpha = 30;
-                                       SetHighColor(outlineColor);
-                                       DrawString(label.String(), BPoint(6 + 
colorBox.right, y));
-                                       DrawString(text.String(), 
BPoint(frame.right - width, y));
-
-                                       font.SetFalseBoldWidth(0.0);
-                                       SetFont(&font, B_FONT_FALSE_BOLD_WIDTH);
-
-                                       outlineColor.alpha = 200;
-                                       SetHighColor(outlineColor);
-                                       DrawString(label.String(), BPoint(6 + 
colorBox.right + 1,
-                                               y + 1));
-                                       DrawString(text.String(), 
BPoint(frame.right - width + 1,
-                                               y + 1));
-                               }
-                       }
-                       SetDrawingMode(B_OP_OVER);
-                       SetHighColor(textColor);
+               if (be_control_look == NULL) {
+                       DrawString(label.String(), BPoint(6 + colorBox.right, 
y));
+                       DrawString(text.String(), BPoint(frame.right - width, 
y));
+               } else {
+                       be_control_look->DrawLabel(this, label.String(),
+                               Parent()->ViewColor(), 0, BPoint(6 + 
colorBox.right, y));
+                       be_control_look->DrawLabel(this, text.String(),
+                               Parent()->ViewColor(), 0, BPoint(frame.right - 
width, y));
                }
-               DrawString(label.String(), BPoint(6 + colorBox.right, y));
-               DrawString(text.String(), BPoint(frame.right - width, y));
        }
 }
 
diff --git a/src/apps/activitymonitor/ActivityView.h 
b/src/apps/activitymonitor/ActivityView.h
index 03ee208b..5ffa336 100644
--- a/src/apps/activitymonitor/ActivityView.h
+++ b/src/apps/activitymonitor/ActivityView.h
@@ -114,7 +114,6 @@ private:
                        void            _DrawHistory(bool drawBackground);
                        void            _UpdateResolution(int32 resolution,
                                                        bool broadcast = true);
-                       void            _LoadBackgroundInfo(bool watch);
 
 private:
        class HistoryLayoutItem;
@@ -131,10 +130,6 @@ private:
        BLayoutItem*            fLegendLayoutItem;
 #endif
 
-       BMessage                        fBackgroundInfo;
-       bool                            fCachedOutline;
-       int32                           fCachedWorkspace;
-
        mutable BLocker         fSourcesLock;
        BObjectList<DataSource> fSources;
        BObjectList<DataHistory> fValues;
diff --git a/src/apps/deskcalc/CalcView.cpp b/src/apps/deskcalc/CalcView.cpp
index 06a5e48..aef3b73 100644
--- a/src/apps/deskcalc/CalcView.cpp
+++ b/src/apps/deskcalc/CalcView.cpp
@@ -416,6 +416,7 @@ CalcView::Draw(BRect updateRect)
                                        flags |= BControlLook::B_BLEND_FRAME;
                                if (key->flags != 0)
                                        flags |= BControlLook::B_ACTIVATED;
+                               flags |= BControlLook::B_IGNORE_OUTLINE;
 
                                be_control_look->DrawButtonFrame(this, frame, 
updateRect,
                                        fBaseColor, fBaseColor, flags);
diff --git a/src/kits/interface/ControlLook.cpp 
b/src/kits/interface/ControlLook.cpp
index 3f01f5c..03326c4 100644
--- a/src/kits/interface/ControlLook.cpp
+++ b/src/kits/interface/ControlLook.cpp
@@ -4,6 +4,8 @@
  */
 #include <ControlLook.h>
 
+#include "ContainerWindow.h"
+
 #include <stdio.h>
 
 #include <Control.h>
@@ -12,14 +14,19 @@
 #include <Shape.h>
 #include <String.h>
 #include <View.h>
+#include <Window.h>
 
 namespace BPrivate {
 
 static const float kEdgeBevelLightTint = 0.59;
 static const float kEdgeBevelShadowTint = 1.0735;
+const rgb_color kWhite = (rgb_color){255, 255, 255, 255};
+const rgb_color kBlack = (rgb_color){0, 0, 0, 255};
 
 
-BControlLook::BControlLook()
+BControlLook::BControlLook():
+       fCachedOutline(false),
+       fCachedWorkspace(-1)
 {
 }
 
@@ -1832,20 +1839,107 @@ BControlLook::DrawLabel(BView* view, const char* 
label, const rgb_color& base,
        // setup the text color
        // TODO: Should either use the ui_color(B_CONTROL_TEXT_COLOR) here,
        // or elliminate that constant alltogether (stippi: +1).
-       rgb_color color;
-       if (base.red + base.green + base.blue > 128 * 3)
-               color = tint_color(base, B_DARKEN_MAX_TINT);
+
+       BWindow* window = view->Window();
+       bool isDesktop = window
+               && window->Feel() == kPrivateDesktopWindowFeel
+               && window->Look() == kPrivateDesktopWindowLook
+               && view->Parent()
+               && view->Parent()->Parent() == NULL
+               && (flags & B_IGNORE_OUTLINE) == 0;
+
+       rgb_color       low;
+       rgb_color       color;
+       rgb_color       glowColor;
+
+       if (isDesktop)
+               low = view->Parent()->ViewColor();
        else
-               color = tint_color(base, B_LIGHTEN_MAX_TINT);
+               low = base;
+
+       if (low.red + low.green + low.blue > 128 * 3) {
+               color = tint_color(low, B_DARKEN_MAX_TINT);
+               glowColor = kWhite;
+       } else {
+               color = tint_color(low, B_LIGHTEN_MAX_TINT);
+               glowColor = kBlack;
+       }
 
        if (flags & B_DISABLED) {
-               color.red = (uint8)(((int32)base.red + color.red + 1) / 2);
-               color.green = (uint8)(((int32)base.green + color.green + 1) / 
2);
-               color.blue = (uint8)(((int32)base.blue + color.blue + 1) / 2);
+               color.red = (uint8)(((int32)low.red + color.red + 1) / 2);
+               color.green = (uint8)(((int32)low.green + color.green + 1) / 2);
+               color.blue = (uint8)(((int32)low.blue + color.blue + 1) / 2);
        }
 
-       view->SetHighColor(color);
        drawing_mode oldMode = view->DrawingMode();
+
+       // check if the drawing occurs on the desktop
+       if (isDesktop) {
+               
+               if (fCachedWorkspace != current_workspace()) {
+
+                       int8 indice = 0;
+                       int32 mask;
+                       bool tmpOutline;
+                       while 
(fBackgroundInfo.FindInt32("be:bgndimginfoworkspaces",
+                                       indice, &mask) == B_OK
+                               && 
fBackgroundInfo.FindBool("be:bgndimginfoerasetext",
+                                       indice, &tmpOutline) == B_OK) {
+
+                               if (((1 << current_workspace()) & mask) != 0) {
+                                       fCachedOutline = tmpOutline;
+                                       fCachedWorkspace = current_workspace();
+                                       break;
+                               }
+                               indice++;
+                       }
+               }
+               
+               if (fCachedOutline) {
+                       BFont font;
+                       view->GetFont(&font);
+
+                       view->SetDrawingMode(B_OP_ALPHA);
+                       view->SetBlendingMode(B_CONSTANT_ALPHA, 
B_ALPHA_OVERLAY);
+                       // Draw glow or outline
+                       if (glowColor == kWhite) {
+                                       font.SetFalseBoldWidth(2.0);
+                                       view->SetFont(&font, 
B_FONT_FALSE_BOLD_WIDTH);
+
+                                       glowColor.alpha = 30;
+                                       view->SetHighColor(glowColor);
+                                       view->DrawString(label, where);
+       
+                                       font.SetFalseBoldWidth(1.0);
+                                       view->SetFont(&font, 
B_FONT_FALSE_BOLD_WIDTH);
+
+                                       glowColor.alpha = 65;
+                                       view->SetHighColor(glowColor);
+                                       view->DrawString(label, where);
+
+                                       font.SetFalseBoldWidth(0.0);
+                                       view->SetFont(&font, 
B_FONT_FALSE_BOLD_WIDTH);
+
+                       } else if (glowColor == kBlack) {
+                                       font.SetFalseBoldWidth(1.0);
+                                       view->SetFont(&font, 
B_FONT_FALSE_BOLD_WIDTH);
+
+                                       glowColor.alpha = 30;
+                                       view->SetHighColor(glowColor);
+                                       view->DrawString(label, where);
+
+                                       font.SetFalseBoldWidth(0.0);
+                                       view->SetFont(&font, 
B_FONT_FALSE_BOLD_WIDTH);
+
+                                       glowColor.alpha = 200;
+                                       view->SetHighColor(glowColor);
+                                       view->DrawString(label, BPoint(where.x 
+ 1, where.y + 1));
+                       }
+               }
+       }
+
+       view->SetHighColor(color);
+       
        view->SetDrawingMode(B_OP_OVER);
 
        view->DrawString(label, where);
@@ -1854,6 +1948,14 @@ BControlLook::DrawLabel(BView* view, const char* label, 
const rgb_color& base,
 }
 
 
+void
+BControlLook::SetBackgroundInfo(BMessage msg)
+{
+       fBackgroundInfo = msg;
+       fCachedWorkspace = -1;
+}
+
+
 // #pragma mark -
 
 
diff --git a/src/kits/interface/Jamfile b/src/kits/interface/Jamfile
index 911473a..aa214c9 100644
--- a/src/kits/interface/Jamfile
+++ b/src/kits/interface/Jamfile
@@ -27,6 +27,9 @@ SetSubDirSupportedPlatforms haiku libbe_test ;
 UseLibraryHeaders agg ;
 UsePrivateHeaders app input print interface libbe shared support tracker ;
 
+UseHeaders [ FDirName $(HAIKU_TOP) src kits tracker ] ;
+
+
 SEARCH_SOURCE += [ FDirName $(SUBDIR) textview_support ] ;
 SEARCH_SOURCE += [ FDirName $(SUBDIR) layouter ] ;
 
diff --git a/src/kits/tracker/BackgroundImage.cpp 
b/src/kits/tracker/BackgroundImage.cpp
index 7ba0744..bc61a3f 100644
--- a/src/kits/tracker/BackgroundImage.cpp
+++ b/src/kits/tracker/BackgroundImage.cpp
@@ -36,6 +36,7 @@ All rights reserved.
 //
 
 #include <Bitmap.h>
+#include <ControlLook.h>
 #include <Node.h>
 #include <TranslationKit.h>
 #include <View.h>
@@ -96,6 +97,10 @@ BackgroundImage::GetBackgroundImage(const BNode *node, bool 
isDesktop)
                } else
                        break;
 
+               if (be_control_look != NULL && isDesktop) {
+                       be_control_look->SetBackgroundInfo(container);
+               }
+
                container.FindInt32(kBackgroundImageInfoWorkspaces, index, 
(int32 *)&workspaces);
                container.FindInt32(kBackgroundImageInfoMode, index, (int32 
*)&mode);
                container.FindBool(kBackgroundImageInfoTextOutline, index, 
&textWidgetLabelOutline);


Other related posts: