Use arrow icons for th enavigation buttons. The IconButton class is a slightly
extended version of the LaunchBox version (added TrimIcon() method). Will go away when/if the browser is moved into the Haiku source tree. git-svn-id: http://svn.haiku-os.org/webpositive/webkit/trunk@159 94f232f2-1747-11df-bad5-a5bfde151594
This commit is contained in:
parent
5478dd2992
commit
14c76a6546
924
src/apps/webpositive/IconButton.cpp
Normal file
924
src/apps/webpositive/IconButton.cpp
Normal file
@ -0,0 +1,924 @@
|
||||
/*
|
||||
* Copyright 2006-2010, Haiku.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Stephan Aßmus <superstippi@gmx.de>
|
||||
*/
|
||||
|
||||
// NOTE: this file is a duplicate of the version in Icon-O-Matic/generic
|
||||
// it should be placed into a common folder for generic useful stuff
|
||||
|
||||
#include "IconButton.h"
|
||||
|
||||
#include <new>
|
||||
#include <stdio.h>
|
||||
|
||||
#include <Application.h>
|
||||
#include <Bitmap.h>
|
||||
#include <Control.h>
|
||||
#include <ControlLook.h>
|
||||
#include <Entry.h>
|
||||
#include <Looper.h>
|
||||
#include <Message.h>
|
||||
#include <Mime.h>
|
||||
#include <Path.h>
|
||||
#include <Region.h>
|
||||
#include <Resources.h>
|
||||
#include <Roster.h>
|
||||
#include <TranslationUtils.h>
|
||||
#include <Window.h>
|
||||
#include "IconUtils.h"
|
||||
|
||||
using std::nothrow;
|
||||
|
||||
// constructor
|
||||
IconButton::IconButton(const char* name, uint32 id, const char* label,
|
||||
BMessage* message, BHandler* target)
|
||||
: BView(name, B_WILL_DRAW),
|
||||
BInvoker(message, target),
|
||||
fButtonState(STATE_ENABLED),
|
||||
fID(id),
|
||||
fNormalBitmap(NULL),
|
||||
fDisabledBitmap(NULL),
|
||||
fClickedBitmap(NULL),
|
||||
fDisabledClickedBitmap(NULL),
|
||||
fLabel(label),
|
||||
fTargetCache(target)
|
||||
{
|
||||
SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
SetViewColor(B_TRANSPARENT_32_BIT);
|
||||
}
|
||||
|
||||
// destructor
|
||||
IconButton::~IconButton()
|
||||
{
|
||||
_DeleteBitmaps();
|
||||
}
|
||||
|
||||
// MessageReceived
|
||||
void
|
||||
IconButton::MessageReceived(BMessage* message)
|
||||
{
|
||||
switch (message->what) {
|
||||
default:
|
||||
BView::MessageReceived(message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// AttachedToWindow
|
||||
void
|
||||
IconButton::AttachedToWindow()
|
||||
{
|
||||
rgb_color background = B_TRANSPARENT_COLOR;
|
||||
if (BView* parent = Parent()) {
|
||||
background = parent->ViewColor();
|
||||
if (background == B_TRANSPARENT_COLOR)
|
||||
background = parent->LowColor();
|
||||
}
|
||||
if (background == B_TRANSPARENT_COLOR)
|
||||
background = ui_color(B_PANEL_BACKGROUND_COLOR);
|
||||
SetLowColor(background);
|
||||
|
||||
SetTarget(fTargetCache);
|
||||
if (!Target())
|
||||
SetTarget(Window());
|
||||
}
|
||||
|
||||
// Draw
|
||||
void
|
||||
IconButton::Draw(BRect area)
|
||||
{
|
||||
rgb_color background = LowColor();
|
||||
|
||||
BRect r(Bounds());
|
||||
|
||||
if (be_control_look != NULL) {
|
||||
uint32 flags = 0;
|
||||
BBitmap* bitmap = fNormalBitmap;
|
||||
if (!IsEnabled()) {
|
||||
flags |= BControlLook::B_DISABLED;
|
||||
bitmap = fDisabledBitmap;
|
||||
}
|
||||
if (_HasFlags(STATE_PRESSED) || _HasFlags(STATE_FORCE_PRESSED))
|
||||
flags |= BControlLook::B_ACTIVATED;
|
||||
|
||||
if (DrawBorder()) {
|
||||
be_control_look->DrawButtonFrame(this, r, area, background,
|
||||
background, flags);
|
||||
be_control_look->DrawButtonBackground(this, r, area, background,
|
||||
flags);
|
||||
} else {
|
||||
SetHighColor(background);
|
||||
FillRect(r);
|
||||
}
|
||||
|
||||
if (bitmap && bitmap->IsValid()) {
|
||||
float x = r.left + floorf((r.Width()
|
||||
- bitmap->Bounds().Width()) / 2.0 + 0.5);
|
||||
float y = r.top + floorf((r.Height()
|
||||
- bitmap->Bounds().Height()) / 2.0 + 0.5);
|
||||
BPoint point(x, y);
|
||||
if (_HasFlags(STATE_PRESSED) || _HasFlags(STATE_FORCE_PRESSED))
|
||||
point += BPoint(1.0, 1.0);
|
||||
if (bitmap->ColorSpace() == B_RGBA32
|
||||
|| bitmap->ColorSpace() == B_RGBA32_BIG) {
|
||||
SetDrawingMode(B_OP_ALPHA);
|
||||
SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
|
||||
}
|
||||
DrawBitmap(bitmap, point);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
rgb_color lightShadow, shadow, darkShadow, light;
|
||||
BBitmap* bitmap = fNormalBitmap;
|
||||
// adjust colors and bitmap according to flags
|
||||
if (IsEnabled()) {
|
||||
lightShadow = tint_color(background, B_DARKEN_1_TINT);
|
||||
shadow = tint_color(background, B_DARKEN_2_TINT);
|
||||
darkShadow = tint_color(background, B_DARKEN_4_TINT);
|
||||
light = tint_color(background, B_LIGHTEN_MAX_TINT);
|
||||
SetHighColor(0, 0, 0, 255);
|
||||
} else {
|
||||
lightShadow = tint_color(background, 1.11);
|
||||
shadow = tint_color(background, B_DARKEN_1_TINT);
|
||||
darkShadow = tint_color(background, B_DARKEN_2_TINT);
|
||||
light = tint_color(background, B_LIGHTEN_2_TINT);
|
||||
bitmap = fDisabledBitmap;
|
||||
SetHighColor(tint_color(background, B_DISABLED_LABEL_TINT));
|
||||
}
|
||||
if (_HasFlags(STATE_PRESSED) || _HasFlags(STATE_FORCE_PRESSED)) {
|
||||
if (IsEnabled()) {
|
||||
// background = tint_color(background, B_DARKEN_2_TINT);
|
||||
// background = tint_color(background, B_LIGHTEN_1_TINT);
|
||||
background = tint_color(background, B_DARKEN_1_TINT);
|
||||
bitmap = fClickedBitmap;
|
||||
} else {
|
||||
// background = tint_color(background, B_DARKEN_1_TINT);
|
||||
// background = tint_color(background, (B_NO_TINT + B_LIGHTEN_1_TINT) / 2.0);
|
||||
background = tint_color(background, (B_NO_TINT + B_DARKEN_1_TINT) / 2.0);
|
||||
bitmap = fDisabledClickedBitmap;
|
||||
}
|
||||
// background
|
||||
SetLowColor(background);
|
||||
r.InsetBy(2.0, 2.0);
|
||||
StrokeLine(r.LeftBottom(), r.LeftTop(), B_SOLID_LOW);
|
||||
StrokeLine(r.LeftTop(), r.RightTop(), B_SOLID_LOW);
|
||||
r.InsetBy(-2.0, -2.0);
|
||||
}
|
||||
// draw frame only if tracking
|
||||
if (DrawBorder()) {
|
||||
if (_HasFlags(STATE_PRESSED) || _HasFlags(STATE_FORCE_PRESSED))
|
||||
DrawPressedBorder(r, background, shadow, darkShadow, lightShadow, light);
|
||||
else
|
||||
DrawNormalBorder(r, background, shadow, darkShadow, lightShadow, light);
|
||||
r.InsetBy(2.0, 2.0);
|
||||
} else
|
||||
_DrawFrame(r, background, background, background, background);
|
||||
float width = Bounds().Width();
|
||||
float height = Bounds().Height();
|
||||
// bitmap
|
||||
BRegion originalClippingRegion;
|
||||
if (bitmap && bitmap->IsValid()) {
|
||||
float x = floorf((width - bitmap->Bounds().Width()) / 2.0 + 0.5);
|
||||
float y = floorf((height - bitmap->Bounds().Height()) / 2.0 + 0.5);
|
||||
BPoint point(x, y);
|
||||
if (_HasFlags(STATE_PRESSED) || _HasFlags(STATE_FORCE_PRESSED))
|
||||
point += BPoint(1.0, 1.0);
|
||||
if (bitmap->ColorSpace() == B_RGBA32 || bitmap->ColorSpace() == B_RGBA32_BIG) {
|
||||
FillRect(r, B_SOLID_LOW);
|
||||
SetDrawingMode(B_OP_ALPHA);
|
||||
SetBlendingMode(B_PIXEL_ALPHA, B_ALPHA_OVERLAY);
|
||||
}
|
||||
DrawBitmap(bitmap, point);
|
||||
// constrain clipping region
|
||||
BRegion region= originalClippingRegion;
|
||||
GetClippingRegion(®ion);
|
||||
region.Exclude(bitmap->Bounds().OffsetByCopy(point));
|
||||
ConstrainClippingRegion(®ion);
|
||||
}
|
||||
// background
|
||||
SetDrawingMode(B_OP_COPY);
|
||||
FillRect(r, B_SOLID_LOW);
|
||||
ConstrainClippingRegion(NULL);
|
||||
// label
|
||||
if (fLabel.CountChars() > 0) {
|
||||
SetDrawingMode(B_OP_COPY);
|
||||
font_height fh;
|
||||
GetFontHeight(&fh);
|
||||
float y = Bounds().bottom - 4.0;
|
||||
y -= fh.descent;
|
||||
float x = (width - StringWidth(fLabel.String())) / 2.0;
|
||||
DrawString(fLabel.String(), BPoint(x, y));
|
||||
}
|
||||
}
|
||||
|
||||
// MouseDown
|
||||
void
|
||||
IconButton::MouseDown(BPoint where)
|
||||
{
|
||||
if (!IsValid())
|
||||
return;
|
||||
|
||||
if (_HasFlags(STATE_ENABLED)/* && !_HasFlags(STATE_FORCE_PRESSED)*/) {
|
||||
if (Bounds().Contains(where)) {
|
||||
SetMouseEventMask(B_POINTER_EVENTS, B_LOCK_WINDOW_FOCUS);
|
||||
_AddFlags(STATE_PRESSED | STATE_TRACKING);
|
||||
} else {
|
||||
_ClearFlags(STATE_PRESSED | STATE_TRACKING);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// MouseUp
|
||||
void
|
||||
IconButton::MouseUp(BPoint where)
|
||||
{
|
||||
if (!IsValid())
|
||||
return;
|
||||
|
||||
// if (!_HasFlags(STATE_FORCE_PRESSED)) {
|
||||
if (_HasFlags(STATE_ENABLED) && _HasFlags(STATE_PRESSED) && Bounds().Contains(where))
|
||||
Invoke();
|
||||
else if (Bounds().Contains(where))
|
||||
_AddFlags(STATE_INSIDE);
|
||||
_ClearFlags(STATE_PRESSED | STATE_TRACKING);
|
||||
// }
|
||||
}
|
||||
|
||||
// MouseMoved
|
||||
void
|
||||
IconButton::MouseMoved(BPoint where, uint32 transit, const BMessage* message)
|
||||
{
|
||||
if (!IsValid())
|
||||
return;
|
||||
|
||||
uint32 buttons = 0;
|
||||
Window()->CurrentMessage()->FindInt32("buttons", (int32*)&buttons);
|
||||
// catch a mouse up event that we might have missed
|
||||
if (!buttons && _HasFlags(STATE_PRESSED)) {
|
||||
MouseUp(where);
|
||||
return;
|
||||
}
|
||||
if (buttons && !_HasFlags(STATE_TRACKING))
|
||||
return;
|
||||
if ((transit == B_INSIDE_VIEW || transit == B_ENTERED_VIEW)
|
||||
&& _HasFlags(STATE_ENABLED))
|
||||
_AddFlags(STATE_INSIDE);
|
||||
else
|
||||
_ClearFlags(STATE_INSIDE);
|
||||
if (_HasFlags(STATE_TRACKING)) {
|
||||
if (Bounds().Contains(where))
|
||||
_AddFlags(STATE_PRESSED);
|
||||
else
|
||||
_ClearFlags(STATE_PRESSED);
|
||||
}
|
||||
}
|
||||
|
||||
#define MIN_SPACE 15.0
|
||||
|
||||
// GetPreferredSize
|
||||
void
|
||||
IconButton::GetPreferredSize(float* width, float* height)
|
||||
{
|
||||
float minWidth = 0.0;
|
||||
float minHeight = 0.0;
|
||||
if (IsValid()) {
|
||||
minWidth += fNormalBitmap->Bounds().IntegerWidth() + 1.0;
|
||||
minHeight += fNormalBitmap->Bounds().IntegerHeight() + 1.0;
|
||||
}
|
||||
if (minWidth < MIN_SPACE)
|
||||
minWidth = MIN_SPACE;
|
||||
if (minHeight < MIN_SPACE)
|
||||
minHeight = MIN_SPACE;
|
||||
|
||||
float hPadding = max_c(6.0, ceilf(minHeight / 4.0));
|
||||
float vPadding = max_c(6.0, ceilf(minWidth / 4.0));
|
||||
|
||||
if (fLabel.CountChars() > 0) {
|
||||
font_height fh;
|
||||
GetFontHeight(&fh);
|
||||
minHeight += ceilf(fh.ascent + fh.descent) + vPadding;
|
||||
minWidth += StringWidth(fLabel.String()) + vPadding;
|
||||
}
|
||||
|
||||
if (width)
|
||||
*width = minWidth + hPadding;
|
||||
if (height)
|
||||
*height = minHeight + vPadding;
|
||||
}
|
||||
|
||||
// MinSize
|
||||
BSize
|
||||
IconButton::MinSize()
|
||||
{
|
||||
BSize size;
|
||||
GetPreferredSize(&size.width, &size.height);
|
||||
return size;
|
||||
}
|
||||
|
||||
// MaxSize
|
||||
BSize
|
||||
IconButton::MaxSize()
|
||||
{
|
||||
return MinSize();
|
||||
}
|
||||
|
||||
// Invoke
|
||||
status_t
|
||||
IconButton::Invoke(BMessage* message)
|
||||
{
|
||||
if (!message)
|
||||
message = Message();
|
||||
if (message) {
|
||||
BMessage clone(*message);
|
||||
clone.AddInt64("be:when", system_time());
|
||||
clone.AddPointer("be:source", (BView*)this);
|
||||
clone.AddInt32("be:value", Value());
|
||||
clone.AddInt32("id", ID());
|
||||
return BInvoker::Invoke(&clone);
|
||||
}
|
||||
return BInvoker::Invoke(message);
|
||||
}
|
||||
|
||||
// SetPressed
|
||||
void
|
||||
IconButton::SetPressed(bool pressed)
|
||||
{
|
||||
if (pressed)
|
||||
_AddFlags(STATE_FORCE_PRESSED);
|
||||
else
|
||||
_ClearFlags(STATE_FORCE_PRESSED);
|
||||
}
|
||||
|
||||
// IsPressed
|
||||
bool
|
||||
IconButton::IsPressed() const
|
||||
{
|
||||
return _HasFlags(STATE_FORCE_PRESSED);
|
||||
}
|
||||
|
||||
status_t
|
||||
IconButton::SetIcon(int32 resourceID)
|
||||
{
|
||||
app_info info;
|
||||
status_t status = be_app->GetAppInfo(&info);
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
|
||||
BResources resources(&info.ref);
|
||||
status = resources.InitCheck();
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
|
||||
printf("check\n");
|
||||
size_t size;
|
||||
const void* data = resources.LoadResource(B_VECTOR_ICON_TYPE, resourceID,
|
||||
&size);
|
||||
if (data != NULL) {
|
||||
printf("found resource\n");
|
||||
BBitmap bitmap(BRect(0, 0, 31, 31), B_BITMAP_NO_SERVER_LINK, B_RGBA32);
|
||||
status = bitmap.InitCheck();
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
status = BIconUtils::GetVectorIcon(reinterpret_cast<const uint8*>(data),
|
||||
size, &bitmap);
|
||||
if (status != B_OK)
|
||||
return status;
|
||||
return SetIcon(&bitmap);
|
||||
}
|
||||
// const void* data = resources.LoadResource(B_BITMAP_TYPE, resourceID, &size);
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
// SetIcon
|
||||
status_t
|
||||
IconButton::SetIcon(const char* pathToBitmap)
|
||||
{
|
||||
if (pathToBitmap == NULL)
|
||||
return B_BAD_VALUE;
|
||||
|
||||
status_t status = B_BAD_VALUE;
|
||||
BBitmap* fileBitmap = NULL;
|
||||
// try to load bitmap from either relative or absolute path
|
||||
BEntry entry(pathToBitmap, true);
|
||||
if (!entry.Exists()) {
|
||||
app_info info;
|
||||
status = be_app->GetAppInfo(&info);
|
||||
if (status == B_OK) {
|
||||
BEntry app_entry(&info.ref, true);
|
||||
BPath path;
|
||||
app_entry.GetPath(&path);
|
||||
status = path.InitCheck();
|
||||
if (status == B_OK) {
|
||||
status = path.GetParent(&path);
|
||||
if (status == B_OK) {
|
||||
status = path.Append(pathToBitmap, true);
|
||||
if (status == B_OK)
|
||||
fileBitmap = BTranslationUtils::GetBitmap(path.Path());
|
||||
else
|
||||
printf("IconButton::SetIcon() - path.Append() failed: %s\n", strerror(status));
|
||||
} else
|
||||
printf("IconButton::SetIcon() - path.GetParent() failed: %s\n", strerror(status));
|
||||
} else
|
||||
printf("IconButton::SetIcon() - path.InitCheck() failed: %s\n", strerror(status));
|
||||
} else
|
||||
printf("IconButton::SetIcon() - be_app->GetAppInfo() failed: %s\n", strerror(status));
|
||||
} else
|
||||
fileBitmap = BTranslationUtils::GetBitmap(pathToBitmap);
|
||||
if (fileBitmap) {
|
||||
status = _MakeBitmaps(fileBitmap);
|
||||
delete fileBitmap;
|
||||
} else
|
||||
status = B_ERROR;
|
||||
return status;
|
||||
}
|
||||
|
||||
// SetIcon
|
||||
status_t
|
||||
IconButton::SetIcon(const BBitmap* bitmap)
|
||||
{
|
||||
if (bitmap && bitmap->ColorSpace() == B_CMAP8) {
|
||||
status_t status = bitmap->InitCheck();
|
||||
if (status >= B_OK) {
|
||||
if (BBitmap* rgb32Bitmap = _ConvertToRGB32(bitmap)) {
|
||||
status = _MakeBitmaps(rgb32Bitmap);
|
||||
delete rgb32Bitmap;
|
||||
} else
|
||||
status = B_NO_MEMORY;
|
||||
}
|
||||
return status;
|
||||
} else
|
||||
return _MakeBitmaps(bitmap);
|
||||
}
|
||||
|
||||
// SetIcon
|
||||
status_t
|
||||
IconButton::SetIcon(const BMimeType* fileType, bool small)
|
||||
{
|
||||
status_t status = fileType ? fileType->InitCheck() : B_BAD_VALUE;
|
||||
if (status >= B_OK) {
|
||||
BBitmap* mimeBitmap = new(nothrow) BBitmap(BRect(0.0, 0.0, 15.0, 15.0), B_CMAP8);
|
||||
if (mimeBitmap && mimeBitmap->IsValid()) {
|
||||
status = fileType->GetIcon(mimeBitmap, small ? B_MINI_ICON : B_LARGE_ICON);
|
||||
if (status >= B_OK) {
|
||||
if (BBitmap* bitmap = _ConvertToRGB32(mimeBitmap)) {
|
||||
status = _MakeBitmaps(bitmap);
|
||||
delete bitmap;
|
||||
} else
|
||||
printf("IconButton::SetIcon() - B_RGB32 bitmap is not valid\n");
|
||||
} else
|
||||
printf("IconButton::SetIcon() - fileType->GetIcon() failed: %s\n", strerror(status));
|
||||
} else
|
||||
printf("IconButton::SetIcon() - B_CMAP8 bitmap is not valid\n");
|
||||
delete mimeBitmap;
|
||||
} else
|
||||
printf("IconButton::SetIcon() - fileType is not valid: %s\n", strerror(status));
|
||||
return status;
|
||||
}
|
||||
|
||||
// SetIcon
|
||||
status_t
|
||||
IconButton::SetIcon(const unsigned char* bitsFromQuickRes,
|
||||
uint32 width, uint32 height, color_space format, bool convertToBW)
|
||||
{
|
||||
status_t status = B_BAD_VALUE;
|
||||
if (bitsFromQuickRes && width > 0 && height > 0) {
|
||||
BBitmap* quickResBitmap = new(nothrow) BBitmap(BRect(0.0, 0.0, width - 1.0, height - 1.0), format);
|
||||
status = quickResBitmap ? quickResBitmap->InitCheck() : B_ERROR;
|
||||
if (status >= B_OK) {
|
||||
// It doesn't look right to copy BitsLength() bytes, but bitmaps
|
||||
// exported from QuickRes still contain their padding, so it is alright.
|
||||
memcpy(quickResBitmap->Bits(), bitsFromQuickRes, quickResBitmap->BitsLength());
|
||||
if (format != B_RGB32 && format != B_RGBA32 && format != B_RGB32_BIG && format != B_RGBA32_BIG) {
|
||||
// colorspace needs conversion
|
||||
BBitmap* bitmap = new(nothrow) BBitmap(quickResBitmap->Bounds(), B_RGB32, true);
|
||||
if (bitmap && bitmap->IsValid()) {
|
||||
BView* helper = new BView(bitmap->Bounds(), "helper",
|
||||
B_FOLLOW_NONE, B_WILL_DRAW);
|
||||
if (bitmap->Lock()) {
|
||||
bitmap->AddChild(helper);
|
||||
helper->SetHighColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
helper->FillRect(helper->Bounds());
|
||||
helper->SetDrawingMode(B_OP_OVER);
|
||||
helper->DrawBitmap(quickResBitmap, BPoint(0.0, 0.0));
|
||||
helper->Sync();
|
||||
bitmap->Unlock();
|
||||
}
|
||||
status = _MakeBitmaps(bitmap);
|
||||
} else
|
||||
printf("IconButton::SetIcon() - B_RGB32 bitmap is not valid\n");
|
||||
delete bitmap;
|
||||
} else {
|
||||
// native colorspace (32 bits)
|
||||
if (convertToBW) {
|
||||
// convert to gray scale icon
|
||||
uint8* bits = (uint8*)quickResBitmap->Bits();
|
||||
uint32 bpr = quickResBitmap->BytesPerRow();
|
||||
for (uint32 y = 0; y < height; y++) {
|
||||
uint8* handle = bits;
|
||||
uint8 gray;
|
||||
for (uint32 x = 0; x < width; x++) {
|
||||
gray = uint8((116 * handle[0] + 600 * handle[1] + 308 * handle[2]) / 1024);
|
||||
handle[0] = gray;
|
||||
handle[1] = gray;
|
||||
handle[2] = gray;
|
||||
handle += 4;
|
||||
}
|
||||
bits += bpr;
|
||||
}
|
||||
}
|
||||
status = _MakeBitmaps(quickResBitmap);
|
||||
}
|
||||
} else
|
||||
printf("IconButton::SetIcon() - error allocating bitmap: %s\n", strerror(status));
|
||||
delete quickResBitmap;
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
// ClearIcon
|
||||
void
|
||||
IconButton::ClearIcon()
|
||||
{
|
||||
_DeleteBitmaps();
|
||||
_Update();
|
||||
}
|
||||
|
||||
void
|
||||
IconButton::TrimIcon(bool keepAspect)
|
||||
{
|
||||
if (fNormalBitmap == NULL)
|
||||
return;
|
||||
|
||||
uint8* bits = (uint8*)fNormalBitmap->Bits();
|
||||
uint32 bpr = fNormalBitmap->BytesPerRow();
|
||||
uint32 width = fNormalBitmap->Bounds().IntegerWidth() + 1;
|
||||
uint32 height = fNormalBitmap->Bounds().IntegerHeight() + 1;
|
||||
BRect trimmed(LONG_MAX, LONG_MAX, LONG_MIN, LONG_MIN);
|
||||
for (uint32 y = 0; y < height; y++) {
|
||||
uint8* b = bits + 3;
|
||||
bool rowHasAlpha = false;
|
||||
for (uint32 x = 0; x < width; x++) {
|
||||
if (*b) {
|
||||
rowHasAlpha = true;
|
||||
if (x < trimmed.left)
|
||||
trimmed.left = x;
|
||||
if (x > trimmed.right)
|
||||
trimmed.right = x;
|
||||
}
|
||||
b += 4;
|
||||
}
|
||||
if (rowHasAlpha) {
|
||||
if (y < trimmed.top)
|
||||
trimmed.top = y;
|
||||
if (y > trimmed.bottom)
|
||||
trimmed.bottom = y;
|
||||
}
|
||||
bits += bpr;
|
||||
}
|
||||
if (!trimmed.IsValid())
|
||||
return;
|
||||
if (keepAspect) {
|
||||
float minInset = trimmed.left;
|
||||
minInset = min_c(minInset, trimmed.top);
|
||||
minInset = min_c(minInset, fNormalBitmap->Bounds().right - trimmed.right);
|
||||
minInset = min_c(minInset, fNormalBitmap->Bounds().bottom - trimmed.bottom);
|
||||
trimmed = fNormalBitmap->Bounds().InsetByCopy(minInset, minInset);
|
||||
}
|
||||
trimmed = trimmed & fNormalBitmap->Bounds();
|
||||
BBitmap trimmedBitmap(trimmed.OffsetToCopy(B_ORIGIN),
|
||||
B_BITMAP_NO_SERVER_LINK, B_RGBA32);
|
||||
bits = (uint8*)fNormalBitmap->Bits();
|
||||
bits += 4 * (int32)trimmed.left + bpr * (int32)trimmed.top;
|
||||
uint8* dst = (uint8*)trimmedBitmap.Bits();
|
||||
uint32 trimmedWidth = trimmedBitmap.Bounds().IntegerWidth() + 1;
|
||||
uint32 trimmedHeight = trimmedBitmap.Bounds().IntegerHeight() + 1;
|
||||
uint32 trimmedBPR = trimmedBitmap.BytesPerRow();
|
||||
for (uint32 y = 0; y < trimmedHeight; y++) {
|
||||
memcpy(dst, bits, trimmedWidth * 4);
|
||||
dst += trimmedBPR;
|
||||
bits += bpr;
|
||||
}
|
||||
SetIcon(&trimmedBitmap);
|
||||
}
|
||||
|
||||
// Bitmap
|
||||
BBitmap*
|
||||
IconButton::Bitmap() const
|
||||
{
|
||||
BBitmap* bitmap = NULL;
|
||||
if (fNormalBitmap && fNormalBitmap->IsValid()) {
|
||||
bitmap = new(nothrow) BBitmap(fNormalBitmap);
|
||||
if (bitmap->IsValid()) {
|
||||
// TODO: remove this functionality when we use real transparent bitmaps
|
||||
uint8* bits = (uint8*)bitmap->Bits();
|
||||
uint32 bpr = bitmap->BytesPerRow();
|
||||
uint32 width = bitmap->Bounds().IntegerWidth() + 1;
|
||||
uint32 height = bitmap->Bounds().IntegerHeight() + 1;
|
||||
color_space format = bitmap->ColorSpace();
|
||||
if (format == B_CMAP8) {
|
||||
// replace gray with magic transparent index
|
||||
} else if (format == B_RGB32) {
|
||||
for (uint32 y = 0; y < height; y++) {
|
||||
uint8* bitsHandle = bits;
|
||||
for (uint32 x = 0; x < width; x++) {
|
||||
if (bitsHandle[0] == 216
|
||||
&& bitsHandle[1] == 216
|
||||
&& bitsHandle[2] == 216) {
|
||||
bitsHandle[3] = 0; // make this pixel completely transparent
|
||||
}
|
||||
bitsHandle += 4;
|
||||
}
|
||||
bits += bpr;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
delete bitmap;
|
||||
bitmap = NULL;
|
||||
}
|
||||
}
|
||||
return bitmap;
|
||||
}
|
||||
|
||||
// DrawBorder
|
||||
bool
|
||||
IconButton::DrawBorder() const
|
||||
{
|
||||
return ((IsEnabled() && (_HasFlags(STATE_INSIDE)
|
||||
|| _HasFlags(STATE_TRACKING))) || _HasFlags(STATE_FORCE_PRESSED));
|
||||
}
|
||||
|
||||
// DrawNormalBorder
|
||||
void
|
||||
IconButton::DrawNormalBorder(BRect r, rgb_color background,
|
||||
rgb_color shadow, rgb_color darkShadow,
|
||||
rgb_color lightShadow, rgb_color light)
|
||||
{
|
||||
_DrawFrame(r, shadow, darkShadow, light, lightShadow);
|
||||
}
|
||||
|
||||
// DrawPressedBorder
|
||||
void
|
||||
IconButton::DrawPressedBorder(BRect r, rgb_color background,
|
||||
rgb_color shadow, rgb_color darkShadow,
|
||||
rgb_color lightShadow, rgb_color light)
|
||||
{
|
||||
_DrawFrame(r, shadow, light, darkShadow, background);
|
||||
}
|
||||
|
||||
// IsValid
|
||||
bool
|
||||
IconButton::IsValid() const
|
||||
{
|
||||
return (fNormalBitmap && fDisabledBitmap && fClickedBitmap
|
||||
&& fDisabledClickedBitmap
|
||||
&& fNormalBitmap->IsValid()
|
||||
&& fDisabledBitmap->IsValid()
|
||||
&& fClickedBitmap->IsValid()
|
||||
&& fDisabledClickedBitmap->IsValid());
|
||||
}
|
||||
|
||||
// Value
|
||||
int32
|
||||
IconButton::Value() const
|
||||
{
|
||||
return _HasFlags(STATE_PRESSED) ? B_CONTROL_ON : B_CONTROL_OFF;
|
||||
}
|
||||
|
||||
// SetValue
|
||||
void
|
||||
IconButton::SetValue(int32 value)
|
||||
{
|
||||
if (value)
|
||||
_AddFlags(STATE_PRESSED);
|
||||
else
|
||||
_ClearFlags(STATE_PRESSED);
|
||||
}
|
||||
|
||||
// IsEnabled
|
||||
bool
|
||||
IconButton::IsEnabled() const
|
||||
{
|
||||
return _HasFlags(STATE_ENABLED) ? B_CONTROL_ON : B_CONTROL_OFF;
|
||||
}
|
||||
|
||||
// SetEnabled
|
||||
void
|
||||
IconButton::SetEnabled(bool enabled)
|
||||
{
|
||||
if (enabled)
|
||||
_AddFlags(STATE_ENABLED);
|
||||
else
|
||||
_ClearFlags(STATE_ENABLED | STATE_TRACKING | STATE_INSIDE);
|
||||
}
|
||||
|
||||
// _ConvertToRGB32
|
||||
BBitmap*
|
||||
IconButton::_ConvertToRGB32(const BBitmap* bitmap) const
|
||||
{
|
||||
BBitmap* convertedBitmap = new(nothrow) BBitmap(bitmap->Bounds(),
|
||||
B_BITMAP_ACCEPTS_VIEWS, B_RGBA32);
|
||||
if (convertedBitmap && convertedBitmap->IsValid()) {
|
||||
memset(convertedBitmap->Bits(), 0, convertedBitmap->BitsLength());
|
||||
BView* helper = new BView(bitmap->Bounds(), "helper",
|
||||
B_FOLLOW_NONE, B_WILL_DRAW);
|
||||
if (convertedBitmap->Lock()) {
|
||||
convertedBitmap->AddChild(helper);
|
||||
helper->SetDrawingMode(B_OP_OVER);
|
||||
helper->DrawBitmap(bitmap, BPoint(0.0, 0.0));
|
||||
helper->Sync();
|
||||
convertedBitmap->Unlock();
|
||||
}
|
||||
} else {
|
||||
delete convertedBitmap;
|
||||
convertedBitmap = NULL;
|
||||
}
|
||||
return convertedBitmap;
|
||||
}
|
||||
|
||||
// _MakeBitmaps
|
||||
status_t
|
||||
IconButton::_MakeBitmaps(const BBitmap* bitmap)
|
||||
{
|
||||
status_t status = bitmap ? bitmap->InitCheck() : B_BAD_VALUE;
|
||||
if (status >= B_OK) {
|
||||
// make our own versions of the bitmap
|
||||
BRect b(bitmap->Bounds());
|
||||
_DeleteBitmaps();
|
||||
color_space format = bitmap->ColorSpace();
|
||||
fNormalBitmap = new(nothrow) BBitmap(b, format);
|
||||
fDisabledBitmap = new(nothrow) BBitmap(b, format);
|
||||
fClickedBitmap = new(nothrow) BBitmap(b, format);
|
||||
fDisabledClickedBitmap = new(nothrow) BBitmap(b, format);
|
||||
if (IsValid()) {
|
||||
// copy bitmaps from file bitmap
|
||||
uint8* nBits = (uint8*)fNormalBitmap->Bits();
|
||||
uint8* dBits = (uint8*)fDisabledBitmap->Bits();
|
||||
uint8* cBits = (uint8*)fClickedBitmap->Bits();
|
||||
uint8* dcBits = (uint8*)fDisabledClickedBitmap->Bits();
|
||||
uint8* fBits = (uint8*)bitmap->Bits();
|
||||
int32 nbpr = fNormalBitmap->BytesPerRow();
|
||||
int32 fbpr = bitmap->BytesPerRow();
|
||||
int32 pixels = b.IntegerWidth() + 1;
|
||||
int32 lines = b.IntegerHeight() + 1;
|
||||
// nontransparent version:
|
||||
if (format == B_RGB32 || format == B_RGB32_BIG) {
|
||||
// iterate over color components
|
||||
for (int32 y = 0; y < lines; y++) {
|
||||
for (int32 x = 0; x < pixels; x++) {
|
||||
int32 nOffset = 4 * x;
|
||||
int32 fOffset = 4 * x;
|
||||
nBits[nOffset + 0] = fBits[fOffset + 0];
|
||||
nBits[nOffset + 1] = fBits[fOffset + 1];
|
||||
nBits[nOffset + 2] = fBits[fOffset + 2];
|
||||
nBits[nOffset + 3] = 255;
|
||||
// clicked bits are darker (lame method...)
|
||||
cBits[nOffset + 0] = (uint8)((float)nBits[nOffset + 0] * 0.8);
|
||||
cBits[nOffset + 1] = (uint8)((float)nBits[nOffset + 1] * 0.8);
|
||||
cBits[nOffset + 2] = (uint8)((float)nBits[nOffset + 2] * 0.8);
|
||||
cBits[nOffset + 3] = 255;
|
||||
// disabled bits have less contrast (lame method...)
|
||||
uint8 grey = 216;
|
||||
float dist = (nBits[nOffset + 0] - grey) * 0.4;
|
||||
dBits[nOffset + 0] = (uint8)(grey + dist);
|
||||
dist = (nBits[nOffset + 1] - grey) * 0.4;
|
||||
dBits[nOffset + 1] = (uint8)(grey + dist);
|
||||
dist = (nBits[nOffset + 2] - grey) * 0.4;
|
||||
dBits[nOffset + 2] = (uint8)(grey + dist);
|
||||
dBits[nOffset + 3] = 255;
|
||||
// disabled bits have less contrast (lame method...)
|
||||
grey = 188;
|
||||
dist = (nBits[nOffset + 0] - grey) * 0.4;
|
||||
dcBits[nOffset + 0] = (uint8)(grey + dist);
|
||||
dist = (nBits[nOffset + 1] - grey) * 0.4;
|
||||
dcBits[nOffset + 1] = (uint8)(grey + dist);
|
||||
dist = (nBits[nOffset + 2] - grey) * 0.4;
|
||||
dcBits[nOffset + 2] = (uint8)(grey + dist);
|
||||
dcBits[nOffset + 3] = 255;
|
||||
}
|
||||
nBits += nbpr;
|
||||
dBits += nbpr;
|
||||
cBits += nbpr;
|
||||
dcBits += nbpr;
|
||||
fBits += fbpr;
|
||||
}
|
||||
// transparent version:
|
||||
} else if (format == B_RGBA32 || format == B_RGBA32_BIG) {
|
||||
// iterate over color components
|
||||
for (int32 y = 0; y < lines; y++) {
|
||||
for (int32 x = 0; x < pixels; x++) {
|
||||
int32 nOffset = 4 * x;
|
||||
int32 fOffset = 4 * x;
|
||||
nBits[nOffset + 0] = fBits[fOffset + 0];
|
||||
nBits[nOffset + 1] = fBits[fOffset + 1];
|
||||
nBits[nOffset + 2] = fBits[fOffset + 2];
|
||||
nBits[nOffset + 3] = fBits[fOffset + 3];
|
||||
// clicked bits are darker (lame method...)
|
||||
cBits[nOffset + 0] = (uint8)(nBits[nOffset + 0] * 0.8);
|
||||
cBits[nOffset + 1] = (uint8)(nBits[nOffset + 1] * 0.8);
|
||||
cBits[nOffset + 2] = (uint8)(nBits[nOffset + 2] * 0.8);
|
||||
cBits[nOffset + 3] = fBits[fOffset + 3];
|
||||
// disabled bits have less opacity
|
||||
dBits[nOffset + 0] = fBits[fOffset + 0];
|
||||
dBits[nOffset + 1] = fBits[fOffset + 1];
|
||||
dBits[nOffset + 2] = fBits[fOffset + 2];
|
||||
dBits[nOffset + 3] = (uint8)(fBits[fOffset + 3] * 0.5);
|
||||
// disabled bits have less contrast (lame method...)
|
||||
dcBits[nOffset + 0] = (uint8)(nBits[nOffset + 0] * 0.8);
|
||||
dcBits[nOffset + 1] = (uint8)(nBits[nOffset + 1] * 0.8);
|
||||
dcBits[nOffset + 2] = (uint8)(nBits[nOffset + 2] * 0.8);
|
||||
dcBits[nOffset + 3] = (uint8)(fBits[fOffset + 3] * 0.5);
|
||||
}
|
||||
nBits += nbpr;
|
||||
dBits += nbpr;
|
||||
cBits += nbpr;
|
||||
dcBits += nbpr;
|
||||
fBits += fbpr;
|
||||
}
|
||||
// unsupported format
|
||||
} else {
|
||||
printf("IconButton::_MakeBitmaps() - bitmap has unsupported colorspace\n");
|
||||
status = B_MISMATCHED_VALUES;
|
||||
_DeleteBitmaps();
|
||||
}
|
||||
} else {
|
||||
printf("IconButton::_MakeBitmaps() - error allocating local bitmaps\n");
|
||||
status = B_NO_MEMORY;
|
||||
_DeleteBitmaps();
|
||||
}
|
||||
} else
|
||||
printf("IconButton::_MakeBitmaps() - bitmap is not valid\n");
|
||||
return status;
|
||||
}
|
||||
|
||||
// _DeleteBitmaps
|
||||
void
|
||||
IconButton::_DeleteBitmaps()
|
||||
{
|
||||
delete fNormalBitmap;
|
||||
fNormalBitmap = NULL;
|
||||
delete fDisabledBitmap;
|
||||
fDisabledBitmap = NULL;
|
||||
delete fClickedBitmap;
|
||||
fClickedBitmap = NULL;
|
||||
delete fDisabledClickedBitmap;
|
||||
fDisabledClickedBitmap = NULL;
|
||||
}
|
||||
|
||||
// _Update
|
||||
void
|
||||
IconButton::_Update()
|
||||
{
|
||||
if (LockLooper()) {
|
||||
Invalidate();
|
||||
UnlockLooper();
|
||||
}
|
||||
}
|
||||
|
||||
// _AddFlags
|
||||
void
|
||||
IconButton::_AddFlags(uint32 flags)
|
||||
{
|
||||
if (!(fButtonState & flags)) {
|
||||
fButtonState |= flags;
|
||||
_Update();
|
||||
}
|
||||
}
|
||||
|
||||
// _ClearFlags
|
||||
void
|
||||
IconButton::_ClearFlags(uint32 flags)
|
||||
{
|
||||
if (fButtonState & flags) {
|
||||
fButtonState &= ~flags;
|
||||
_Update();
|
||||
}
|
||||
}
|
||||
|
||||
// _HasFlags
|
||||
bool
|
||||
IconButton::_HasFlags(uint32 flags) const
|
||||
{
|
||||
return (fButtonState & flags);
|
||||
}
|
||||
|
||||
// _DrawFrame
|
||||
void
|
||||
IconButton::_DrawFrame(BRect r, rgb_color col1, rgb_color col2,
|
||||
rgb_color col3, rgb_color col4)
|
||||
{
|
||||
BeginLineArray(8);
|
||||
AddLine(BPoint(r.left, r.bottom), BPoint(r.left, r.top), col1);
|
||||
AddLine(BPoint(r.left + 1.0, r.top), BPoint(r.right, r.top), col1);
|
||||
AddLine(BPoint(r.right, r.top + 1.0), BPoint(r.right, r.bottom), col2);
|
||||
AddLine(BPoint(r.right - 1.0, r.bottom), BPoint(r.left + 1.0, r.bottom), col2);
|
||||
r.InsetBy(1.0, 1.0);
|
||||
AddLine(BPoint(r.left, r.bottom), BPoint(r.left, r.top), col3);
|
||||
AddLine(BPoint(r.left + 1.0, r.top), BPoint(r.right, r.top), col3);
|
||||
AddLine(BPoint(r.right, r.top + 1.0), BPoint(r.right, r.bottom), col4);
|
||||
AddLine(BPoint(r.right - 1.0, r.bottom), BPoint(r.left + 1.0, r.bottom), col4);
|
||||
EndLineArray();
|
||||
}
|
134
src/apps/webpositive/IconButton.h
Normal file
134
src/apps/webpositive/IconButton.h
Normal file
@ -0,0 +1,134 @@
|
||||
/*
|
||||
* Copyright 2006-2010, Haiku.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*
|
||||
* Authors:
|
||||
* Stephan Aßmus <superstippi@gmx.de>
|
||||
*/
|
||||
|
||||
/** gui class that loads an image from disk and shows it
|
||||
as clickable button */
|
||||
|
||||
// TODO: inherit from BControl?
|
||||
|
||||
// NOTE: this file is a duplicate of the version in Icon-O-Matic/generic
|
||||
// it should be placed into a common folder for generic useful stuff
|
||||
|
||||
#ifndef ICON_BUTTON_H
|
||||
#define ICON_BUTTON_H
|
||||
|
||||
#include <Invoker.h>
|
||||
#include <String.h>
|
||||
#include <View.h>
|
||||
|
||||
class BBitmap;
|
||||
class BMimeType;
|
||||
|
||||
class IconButton : public BView, public BInvoker {
|
||||
public:
|
||||
IconButton(const char* name,
|
||||
uint32 id,
|
||||
const char* label = NULL,
|
||||
BMessage* message = NULL,
|
||||
BHandler* target = NULL);
|
||||
virtual ~IconButton();
|
||||
|
||||
// BView interface
|
||||
virtual void MessageReceived(BMessage* message);
|
||||
virtual void AttachedToWindow();
|
||||
virtual void Draw(BRect updateRect);
|
||||
virtual void MouseDown(BPoint where);
|
||||
virtual void MouseUp(BPoint where);
|
||||
virtual void MouseMoved(BPoint where, uint32 transit,
|
||||
const BMessage* message);
|
||||
virtual void GetPreferredSize(float* width,
|
||||
float* height);
|
||||
virtual BSize MinSize();
|
||||
virtual BSize MaxSize();
|
||||
|
||||
|
||||
// BInvoker interface
|
||||
virtual status_t Invoke(BMessage* message = NULL);
|
||||
|
||||
// IconButton
|
||||
bool IsValid() const;
|
||||
|
||||
virtual int32 Value() const;
|
||||
virtual void SetValue(int32 value);
|
||||
|
||||
bool IsEnabled() const;
|
||||
void SetEnabled(bool enable);
|
||||
|
||||
void SetPressed(bool pressed);
|
||||
bool IsPressed() const;
|
||||
uint32 ID() const
|
||||
{ return fID; }
|
||||
|
||||
status_t SetIcon(int32 resourceID);
|
||||
status_t SetIcon(const char* pathToBitmap);
|
||||
status_t SetIcon(const BBitmap* bitmap);
|
||||
status_t SetIcon(const BMimeType* fileType,
|
||||
bool small = true);
|
||||
status_t SetIcon(const unsigned char* bitsFromQuickRes,
|
||||
uint32 width, uint32 height,
|
||||
color_space format,
|
||||
bool convertToBW = false);
|
||||
void ClearIcon();
|
||||
void TrimIcon(bool keepAspect = true);
|
||||
|
||||
BBitmap* Bitmap() const;
|
||||
// caller has to delete the returned bitmap
|
||||
|
||||
virtual bool DrawBorder() const;
|
||||
virtual void DrawNormalBorder(BRect r,
|
||||
rgb_color background,
|
||||
rgb_color shadow,
|
||||
rgb_color darkShadow,
|
||||
rgb_color lightShadow,
|
||||
rgb_color light);
|
||||
virtual void DrawPressedBorder(BRect r,
|
||||
rgb_color background,
|
||||
rgb_color shadow,
|
||||
rgb_color darkShadow,
|
||||
rgb_color lightShadow,
|
||||
rgb_color light);
|
||||
|
||||
protected:
|
||||
enum {
|
||||
STATE_NONE = 0x0000,
|
||||
STATE_TRACKING = 0x0001,
|
||||
STATE_PRESSED = 0x0002,
|
||||
STATE_ENABLED = 0x0004,
|
||||
STATE_INSIDE = 0x0008,
|
||||
STATE_FORCE_PRESSED = 0x0010,
|
||||
};
|
||||
|
||||
void _AddFlags(uint32 flags);
|
||||
void _ClearFlags(uint32 flags);
|
||||
bool _HasFlags(uint32 flags) const;
|
||||
|
||||
void _DrawFrame(BRect frame,
|
||||
rgb_color col1,
|
||||
rgb_color col2,
|
||||
rgb_color col3,
|
||||
rgb_color col4);
|
||||
|
||||
// private:
|
||||
BBitmap* _ConvertToRGB32(const BBitmap* bitmap) const;
|
||||
status_t _MakeBitmaps(const BBitmap* bitmap);
|
||||
void _DeleteBitmaps();
|
||||
void _SendMessage() const;
|
||||
void _Update();
|
||||
|
||||
uint32 fButtonState;
|
||||
int32 fID;
|
||||
BBitmap* fNormalBitmap;
|
||||
BBitmap* fDisabledBitmap;
|
||||
BBitmap* fClickedBitmap;
|
||||
BBitmap* fDisabledClickedBitmap;
|
||||
BString fLabel;
|
||||
|
||||
BHandler* fTargetCache;
|
||||
};
|
||||
|
||||
#endif // ICON_BUTTON_H
|
80
src/apps/webpositive/IconUtils.h
Normal file
80
src/apps/webpositive/IconUtils.h
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* Copyright 2006-2008, Haiku. All rights reserved.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _ICON_UTILS_H
|
||||
#define _ICON_UTILS_H
|
||||
|
||||
|
||||
#include <Mime.h>
|
||||
|
||||
class BBitmap;
|
||||
class BNode;
|
||||
|
||||
|
||||
// This class is a little different from many other classes.
|
||||
// You don't create an instance of it; you just call its various
|
||||
// static member functions for utility-like operations.
|
||||
class BIconUtils {
|
||||
BIconUtils();
|
||||
~BIconUtils();
|
||||
BIconUtils(const BIconUtils&);
|
||||
BIconUtils& operator=(const BIconUtils&);
|
||||
|
||||
public:
|
||||
|
||||
// Utility function to import an icon from the node that
|
||||
// has either of the provided attribute names. Which icon type
|
||||
// is preferred (vector, small or large B_CMAP8 icon) depends
|
||||
// on the colorspace of the provided bitmap. If the colorspace
|
||||
// is B_CMAP8, B_CMAP8 icons are preferred. In that case, the
|
||||
// bitmap size must also match the provided icon_size "size"!
|
||||
static status_t GetIcon(BNode* node,
|
||||
const char* vectorIconAttrName,
|
||||
const char* smallIconAttrName,
|
||||
const char* largeIconAttrName,
|
||||
icon_size size, BBitmap* result);
|
||||
|
||||
// Utility functions to import a vector icon in "flat icon"
|
||||
// format from a BNode attribute or from a flat buffer in
|
||||
// memory into the preallocated BBitmap "result".
|
||||
// The colorspace of result needs to be B_RGBA32 or at
|
||||
// least B_RGB32 (though that makes less sense). The icon
|
||||
// will be scaled from it's "native" size of 64x64 to the
|
||||
// size of the bitmap, the scale is derived from the bitmap
|
||||
// width, the bitmap should have square dimension, or the
|
||||
// icon will be cut off at the bottom (or have room left).
|
||||
static status_t GetVectorIcon(BNode* node,
|
||||
const char* attrName, BBitmap* result);
|
||||
|
||||
static status_t GetVectorIcon(const uint8* buffer,
|
||||
size_t size, BBitmap* result);
|
||||
|
||||
// Utility function to import an "old" BeOS icon in B_CMAP8
|
||||
// colorspace from either the small icon attribute or the
|
||||
// large icon attribute as given in "smallIconAttrName" and
|
||||
// "largeIconAttrName". Which icon is loaded depends on
|
||||
// the given "size".
|
||||
static status_t GetCMAP8Icon(BNode* node,
|
||||
const char* smallIconAttrName,
|
||||
const char* largeIconAttrName,
|
||||
icon_size size, BBitmap* icon);
|
||||
|
||||
// Utility functions to convert from old icon colorspace
|
||||
// into colorspace of BBitmap "result" (should be B_RGBA32
|
||||
// to make any sense).
|
||||
static status_t ConvertFromCMAP8(BBitmap* source,
|
||||
BBitmap* result);
|
||||
static status_t ConvertToCMAP8(BBitmap* source,
|
||||
BBitmap* result);
|
||||
|
||||
static status_t ConvertFromCMAP8(const uint8* data,
|
||||
uint32 width, uint32 height,
|
||||
uint32 bytesPerRow, BBitmap* result);
|
||||
|
||||
static status_t ConvertToCMAP8(const uint8* data,
|
||||
uint32 width, uint32 height,
|
||||
uint32 bytesPerRow, BBitmap* result);
|
||||
};
|
||||
|
||||
#endif // _ICON_UTILS_H
|
@ -252,3 +252,39 @@ resource vector_icon {
|
||||
$"44013402360000000000000000360000485000466000"
|
||||
};
|
||||
|
||||
resource(201) #'VICN' array {
|
||||
$"6E636966070500020006023B2FA63AC896BCCBD33D335A4A6980490D0B00ACE2"
|
||||
$"FFFF6ECDFF0200060236D841374D6EBD38553CC6154AA9DF4607770026A8EBFF"
|
||||
$"0694DE020006023729EA388C8FBC29073AAE614A51AF4A729A00035E8CFF0585"
|
||||
$"C70200060238E8A83647FBBA8E2D3D42294AF6F7496CE200047BB8FF0694DE02"
|
||||
$"0006023957BB3923F0BC39AC3C5E604AA873475AB1000592DAFD67CBFF04FF49"
|
||||
$"080A092E3C3A53424C484F5047503A4435442B3A300A072E3C3A533A48484F48"
|
||||
$"403A3A3A300A043A303A3A4435442B0A033A483A53424C0A044840484F504750"
|
||||
$"3A0A043A3A4435503A48400803C125B7D43AB99FB8D3BE0E08023A3A4840070A"
|
||||
$"0001001001178400040A010101000A020102000A030103000A040104000A0501"
|
||||
$"05000A06020607100117812004"
|
||||
};
|
||||
|
||||
resource(202) #'VICN' array {
|
||||
$"6E636966050500020006023B2FA63AC896BCCBD33D335A4A6980490D0B00ACE2"
|
||||
$"FFFF6ECDFF0200060239AF2C39E19BBC89D83C68DC4AFA1247CFA20006A5F7FF"
|
||||
$"069EEC02000602B8EEBEB986C33C7FB4BC13FB46FA0C49FBDD000592DAFD3EBD"
|
||||
$"FF04FF49050A0A2E423A483A524847503F432A3A2F3A3136302E350A0748473A"
|
||||
$"2F3A392E352E423A483A520A043A2F4847503F432A0A042E3536303A313A3908"
|
||||
$"0536B9932FBB773B3A3BB939C0E5B755050A0001001001178400040A01010100"
|
||||
$"0A020102000A030103000A040104100117812004"
|
||||
};
|
||||
|
||||
resource(203) #'VICN' array {
|
||||
$"6E63696607050002000602396DF23A056B3B94FCBB09F547CD484AAB5F0090D9"
|
||||
$"FFFF6ECDFF02000602B5E5793878A83E023B3B2AC34893F147CC490060C8FFFF"
|
||||
$"44BEFD02000602B6F90538542D3C2FCA3ACA9249A8634A929A00034F77FF0468"
|
||||
$"9C020006023AC62E392AB63B6BA0BCFF0B49DAAA4AAE4500046FA7FF2BA5E502"
|
||||
$"0006023A1CB834EBA6383E33BD3E8D499DE44A647800ACE2FFFD6DCCFF04FF49"
|
||||
$"080A09523A48533F503C532E4C2E3E3A363A2B482E0A07523A485348473C533C"
|
||||
$"43483A482E0A04482E483A3A363A2B0A03484748533F500A043C433C532E4C2E"
|
||||
$"3E0A04483A3A362E3E3C430802BD8FB795C2BDB8E008023C43B8C7BF0D070A00"
|
||||
$"01001001178400040A040101000A020102000A030103000A010104000A050105"
|
||||
$"000A06020607100117812004"
|
||||
};
|
||||
|
||||
|
@ -35,6 +35,7 @@
|
||||
|
||||
#include "AuthenticationPanel.h"
|
||||
#include "BrowsingHistory.h"
|
||||
#include "IconButton.h"
|
||||
#include "LauncherApp.h"
|
||||
#include "WebPage.h"
|
||||
#include "WebTabView.h"
|
||||
@ -42,6 +43,7 @@
|
||||
#include "WebViewConstants.h"
|
||||
#include <Alert.h>
|
||||
#include <Application.h>
|
||||
#include <Bitmap.h>
|
||||
#include <Button.h>
|
||||
#include <CheckBox.h>
|
||||
#include <Entry.h>
|
||||
@ -136,8 +138,13 @@ LauncherWindow::LauncherWindow(BRect frame, const BMessenger& downloadListener,
|
||||
m_menuBar->AddItem(m_goMenu);
|
||||
|
||||
// Back & Forward
|
||||
m_BackButton = new BButton("", "Back", new BMessage(GO_BACK));
|
||||
m_ForwardButton = new BButton("", "Forward", new BMessage(GO_FORWARD));
|
||||
m_BackButton = new IconButton("Back", 0, NULL, new BMessage(GO_BACK));
|
||||
m_BackButton->SetIcon(201);
|
||||
m_BackButton->TrimIcon();
|
||||
|
||||
m_ForwardButton = new IconButton("Forward", 0, NULL, new BMessage(GO_FORWARD));
|
||||
m_ForwardButton->SetIcon(202);
|
||||
m_ForwardButton->TrimIcon();
|
||||
|
||||
// URL
|
||||
m_url = new BTextControl("url", "", "", new BMessage(GOTO_URL));
|
||||
@ -347,11 +354,10 @@ void LauncherWindow::MessageReceived(BMessage* message)
|
||||
|
||||
case TAB_CHANGED: {
|
||||
int32 index = message->FindInt32("index");
|
||||
setCurrentWebView(dynamic_cast<WebView *>(
|
||||
m_tabView->ViewForTab(index)));
|
||||
setCurrentWebView(dynamic_cast<WebView*>(m_tabView->ViewForTab(index)));
|
||||
updateTitle(m_tabView->TabAt(index)->Label());
|
||||
m_url->TextView()->SetText(currentWebView()->mainFrameURL());
|
||||
BWebPage *page = currentWebView()->webPage();
|
||||
// BWebPage* page = currentWebView()->webPage();
|
||||
// bool canGoForward = page->CanGoInDirection(1);
|
||||
// bool canGoBackward = page->CanGoInDirection(-1);
|
||||
// navigationCapabilitiesChanged(canGoForward, canGoBackward, false,
|
||||
@ -480,8 +486,6 @@ void LauncherWindow::loadFinished(const BString& url, WebView* view)
|
||||
BString status(url);
|
||||
status << " finished.";
|
||||
statusChanged(status, view);
|
||||
if (m_url)
|
||||
m_url->SetText(url.String());
|
||||
if (m_loadingProgressBar && !m_loadingProgressBar->IsHidden())
|
||||
m_loadingProgressBar->Hide();
|
||||
}
|
||||
|
@ -40,6 +40,7 @@ class BMenu;
|
||||
class BStatusBar;
|
||||
class BStringView;
|
||||
class BTextControl;
|
||||
class IconButton;
|
||||
class WebTabView;
|
||||
class WebView;
|
||||
|
||||
@ -90,8 +91,8 @@ private:
|
||||
private:
|
||||
BMenuBar* m_menuBar;
|
||||
BMenu* m_goMenu;
|
||||
BButton* m_BackButton;
|
||||
BButton* m_ForwardButton;
|
||||
IconButton* m_BackButton;
|
||||
IconButton* m_ForwardButton;
|
||||
BTextControl* m_url;
|
||||
BString m_loadedURL;
|
||||
BStringView* m_statusText;
|
||||
|
Loading…
Reference in New Issue
Block a user