mirror of
https://github.com/netsurf-browser/netsurf
synced 2025-01-03 09:44:24 +03:00
beos: Better implementation of NSIconTextControl for the url bar
Instead of adding a child view we draw the bitmap over the child. Fixup the TextRect also in Draw() which is called just before the TextView's Draw(). It flickers a little less, and also respects the background color of the text control when using a desktop theme. Also drop a useless dynamic_cast.
This commit is contained in:
parent
6cfa3cce63
commit
55bf16d754
@ -83,6 +83,7 @@ extern "C" {
|
||||
|
||||
struct beos_history_window;
|
||||
|
||||
class NSIconTextControl;
|
||||
class NSBrowserWindow;
|
||||
class NSThrobber;
|
||||
|
||||
@ -106,7 +107,7 @@ struct beos_scaffolding {
|
||||
BControl *reload_button;
|
||||
BControl *home_button;
|
||||
|
||||
BTextControl *url_bar;
|
||||
NSIconTextControl *url_bar;
|
||||
//BMenuField *url_bar_completion;
|
||||
|
||||
NSThrobber *throbber;
|
||||
@ -159,6 +160,8 @@ extern BResources *gAppResources;
|
||||
|
||||
// #pragma mark - class NSIconTextControl
|
||||
|
||||
#define ICON_WIDTH 16
|
||||
|
||||
class NSIconTextControl : public BTextControl {
|
||||
public:
|
||||
NSIconTextControl(BRect frame, const char* name,
|
||||
@ -166,17 +169,22 @@ public:
|
||||
BMessage* message,
|
||||
uint32 resizeMode
|
||||
= B_FOLLOW_LEFT | B_FOLLOW_TOP,
|
||||
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
|
||||
uint32 flags
|
||||
= B_WILL_DRAW | B_NAVIGABLE | B_DRAW_ON_CHILDREN);
|
||||
virtual ~NSIconTextControl();
|
||||
|
||||
virtual void FrameResized(float newWidth, float newHeight);
|
||||
virtual void Draw(BRect updateRect);
|
||||
virtual void DrawAfterChildren(BRect updateRect);
|
||||
virtual void AttachedToWindow();
|
||||
|
||||
void SetBitmap(const BBitmap *bitmap);
|
||||
void FixupTextRect();
|
||||
|
||||
private:
|
||||
const BBitmap *fBitmap;
|
||||
BView *fBitmapView;
|
||||
BPoint fIconOffset;
|
||||
BRect fIconFrame;
|
||||
const BBitmap *fIconBitmap;
|
||||
};
|
||||
|
||||
NSIconTextControl::NSIconTextControl(BRect frame, const char* name,
|
||||
@ -185,23 +193,23 @@ NSIconTextControl::NSIconTextControl(BRect frame, const char* name,
|
||||
uint32 resizeMode,
|
||||
uint32 flags)
|
||||
: BTextControl(frame, name, label, initialText, message, resizeMode, flags),
|
||||
fBitmap(NULL),
|
||||
fBitmapView(NULL)
|
||||
fIconOffset(0,0),
|
||||
fIconBitmap(NULL)
|
||||
{
|
||||
BRect r(TextView()->TextRect());
|
||||
BRect r(Bounds());
|
||||
BRect frame = r;
|
||||
frame.right = frame.left + 15;
|
||||
frame.bottom = frame.top + 15;
|
||||
frame.OffsetBy(-2, (r.IntegerHeight() - 16) / 2);
|
||||
fBitmapView = new BView(frame, "iconview", B_FOLLOW_NONE, 0);
|
||||
frame.right = frame.left + ICON_WIDTH - 1;
|
||||
frame.bottom = frame.top + ICON_WIDTH - 1;
|
||||
frame.OffsetBy((int32)((r.IntegerHeight() - ICON_WIDTH + 3) / 2),
|
||||
(int32)((r.IntegerHeight() - ICON_WIDTH + 1) / 2));
|
||||
fIconFrame = frame;
|
||||
FixupTextRect();
|
||||
|
||||
TextView()->AddChild(fBitmapView);
|
||||
}
|
||||
|
||||
|
||||
NSIconTextControl::~NSIconTextControl()
|
||||
{
|
||||
delete fIconBitmap;
|
||||
}
|
||||
|
||||
|
||||
@ -210,15 +218,51 @@ NSIconTextControl::FrameResized(float newWidth, float newHeight)
|
||||
{
|
||||
BTextControl::FrameResized(newWidth, newHeight);
|
||||
FixupTextRect();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NSIconTextControl::Draw(BRect updateRect)
|
||||
{
|
||||
FixupTextRect();
|
||||
BTextControl::Draw(updateRect);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NSIconTextControl::DrawAfterChildren(BRect updateRect)
|
||||
{
|
||||
BTextControl::DrawAfterChildren(updateRect);
|
||||
|
||||
PushState();
|
||||
|
||||
SetDrawingMode(B_OP_ALPHA);
|
||||
DrawBitmap(fIconBitmap, fIconFrame);
|
||||
|
||||
//XXX: is this needed?
|
||||
PopState();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NSIconTextControl::AttachedToWindow()
|
||||
{
|
||||
BTextControl::AttachedToWindow();
|
||||
FixupTextRect();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
NSIconTextControl::SetBitmap(const BBitmap *bitmap)
|
||||
{
|
||||
fBitmapView->SetViewBitmap(bitmap);
|
||||
fBitmapView->Invalidate();
|
||||
delete fIconBitmap;
|
||||
fIconBitmap = NULL;
|
||||
|
||||
// keep a copy
|
||||
if (bitmap)
|
||||
fIconBitmap = new BBitmap(bitmap);
|
||||
// invalidate just the icon area
|
||||
Invalidate(fIconFrame);
|
||||
}
|
||||
|
||||
|
||||
@ -228,14 +272,17 @@ NSIconTextControl::FixupTextRect()
|
||||
// FIXME: this flickers on resize, quite ugly
|
||||
BRect r(TextView()->TextRect());
|
||||
|
||||
// in case this ever gets fixed...
|
||||
if (r.left > 10)
|
||||
// don't fix the fix
|
||||
if (r.left > ICON_WIDTH)
|
||||
return;
|
||||
|
||||
r.left += r.bottom - r.top;
|
||||
TextView()->SetTextRect(r);
|
||||
}
|
||||
|
||||
|
||||
#undef ICON_WIDTH
|
||||
|
||||
// #pragma mark - class NSResizeKnob
|
||||
|
||||
class NSResizeKnob : public BView {
|
||||
@ -2189,7 +2236,7 @@ void gui_window_set_icon(struct gui_window *_g, hlcache_handle *icon)
|
||||
if (!g->top_view->LockLooper())
|
||||
return;
|
||||
|
||||
dynamic_cast<NSIconTextControl *>(g->url_bar)->SetBitmap(bitmap);
|
||||
g->url_bar->SetBitmap(bitmap);
|
||||
|
||||
g->top_view->UnlockLooper();
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user