Showimage: Add zoom level to StatusBar.
* Improve StatusBar graphics (Same style as StyledEdit). * Resize the StatusBar to best fit. * Fixes #7394.
This commit is contained in:
parent
be63ec85a8
commit
cae52eadac
@ -11,10 +11,12 @@
|
||||
|
||||
#include "ShowImageStatusView.h"
|
||||
|
||||
#include <ControlLook.h>
|
||||
#include <Entry.h>
|
||||
#include <MenuItem.h>
|
||||
#include <Path.h>
|
||||
#include <PopUpMenu.h>
|
||||
#include <ScrollView.h>
|
||||
|
||||
#include <tracker_private.h>
|
||||
#include "DirMenu.h"
|
||||
@ -22,60 +24,106 @@
|
||||
#include "ShowImageView.h"
|
||||
#include "ShowImageWindow.h"
|
||||
|
||||
const float kHorzSpacing = 5.f;
|
||||
|
||||
ShowImageStatusView::ShowImageStatusView(BRect rect, const char* name,
|
||||
uint32 resizingMode, uint32 flags)
|
||||
|
||||
ShowImageStatusView::ShowImageStatusView(BScrollView* scrollView)
|
||||
:
|
||||
BView(rect, name, resizingMode, flags)
|
||||
BView(BRect(), "statusview", B_FOLLOW_BOTTOM | B_FOLLOW_LEFT, B_WILL_DRAW),
|
||||
fScrollView(scrollView),
|
||||
fPreferredSize(0.0, 0.0)
|
||||
{
|
||||
SetViewColor(B_TRANSPARENT_32_BIT);
|
||||
SetLowColor(ui_color(B_PANEL_BACKGROUND_COLOR));
|
||||
SetHighColor(0, 0, 0, 255);
|
||||
memset(fCellWidth, 0, sizeof(fCellWidth));
|
||||
}
|
||||
|
||||
BFont font;
|
||||
GetFont(&font);
|
||||
font.SetSize(10.0);
|
||||
SetFont(&font);
|
||||
|
||||
void
|
||||
ShowImageStatusView::AttachedToWindow()
|
||||
{
|
||||
SetFont(be_plain_font);
|
||||
SetFontSize(10.0);
|
||||
|
||||
BScrollBar* scrollBar = fScrollView->ScrollBar(B_HORIZONTAL);
|
||||
MoveTo(0.0, scrollBar->Frame().top);
|
||||
rgb_color color = B_TRANSPARENT_COLOR;
|
||||
BView* parent = Parent();
|
||||
if (parent != NULL)
|
||||
color = parent->ViewColor();
|
||||
|
||||
if (color == B_TRANSPARENT_COLOR)
|
||||
color = ui_color(B_PANEL_BACKGROUND_COLOR);
|
||||
|
||||
SetViewColor(color);
|
||||
|
||||
ResizeToPreferred();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::GetPreferredSize(float* _width, float* _height)
|
||||
{
|
||||
_ValidatePreferredSize();
|
||||
|
||||
if (_width)
|
||||
*_width = fPreferredSize.width;
|
||||
|
||||
if (_height)
|
||||
*_height = fPreferredSize.height;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::ResizeToPreferred()
|
||||
{
|
||||
float width, height;
|
||||
GetPreferredSize(&width, &height);
|
||||
|
||||
if (Bounds().Width() > width)
|
||||
width = Bounds().Width();
|
||||
|
||||
BView::ResizeTo(width, height);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::Draw(BRect updateRect)
|
||||
{
|
||||
rgb_color darkShadow = tint_color(LowColor(), B_DARKEN_2_TINT);
|
||||
rgb_color shadow = tint_color(LowColor(), B_DARKEN_1_TINT);
|
||||
rgb_color light = tint_color(LowColor(), B_LIGHTEN_MAX_TINT);
|
||||
if (fPreferredSize.width <= 0)
|
||||
return;
|
||||
|
||||
BRect b(Bounds());
|
||||
if (be_control_look != NULL) {
|
||||
BRect bounds(Bounds());
|
||||
be_control_look->DrawMenuBarBackground(this,
|
||||
bounds, updateRect, ViewColor());
|
||||
}
|
||||
|
||||
BeginLineArray(5);
|
||||
AddLine(BPoint(b.left, b.top),
|
||||
BPoint(b.right, b.top), darkShadow);
|
||||
b.top += 1.0;
|
||||
AddLine(BPoint(b.left, b.top),
|
||||
BPoint(b.right, b.top), light);
|
||||
AddLine(BPoint(b.right, b.top + 1.0),
|
||||
BPoint(b.right, b.bottom), shadow);
|
||||
AddLine(BPoint(b.right - 1.0, b.bottom),
|
||||
BPoint(b.left + 1.0, b.bottom), shadow);
|
||||
AddLine(BPoint(b.left, b.bottom),
|
||||
BPoint(b.left, b.top + 1.0), light);
|
||||
EndLineArray();
|
||||
BRect bounds(Bounds());
|
||||
rgb_color highColor = HighColor();
|
||||
SetHighColor(tint_color(ViewColor(), B_DARKEN_2_TINT));
|
||||
StrokeLine(bounds.LeftTop(), bounds.RightTop());
|
||||
|
||||
b.InsetBy(1.0, 1.0);
|
||||
float x = bounds.left;
|
||||
for (size_t i = 0; i < kStatusCellCount - 1; i++) {
|
||||
x += fCellWidth[i];
|
||||
StrokeLine(BPoint(x, bounds.top + 3), BPoint(x, bounds.bottom - 3));
|
||||
}
|
||||
|
||||
// Truncate and layout text
|
||||
BString truncated(fText);
|
||||
BFont font;
|
||||
GetFont(&font);
|
||||
font.TruncateString(&truncated, B_TRUNCATE_MIDDLE, b.Width() - 4.0);
|
||||
font_height fh;
|
||||
font.GetHeight(&fh);
|
||||
SetLowColor(ViewColor());
|
||||
SetHighColor(highColor);
|
||||
|
||||
FillRect(b, B_SOLID_LOW);
|
||||
SetDrawingMode(B_OP_OVER);
|
||||
DrawString(truncated.String(), BPoint(b.left + 2.0,
|
||||
floorf(b.top + b.Height() / 2.0 + fh.ascent / 2.0)));
|
||||
font_height fontHeight;
|
||||
GetFontHeight(&fontHeight);
|
||||
|
||||
x = bounds.left;
|
||||
float y = (bounds.bottom + bounds.top
|
||||
+ ceilf(fontHeight.ascent) - ceilf(fontHeight.descent)) / 2;
|
||||
|
||||
for (size_t i = 0; i < kStatusCellCount; i++) {
|
||||
if (fCellText[i].Length() == 0)
|
||||
continue;
|
||||
DrawString(fCellText[i], BPoint(x + kHorzSpacing, y));
|
||||
x += fCellWidth[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -101,11 +149,81 @@ ShowImageStatusView::MouseDown(BPoint where)
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::Update(const entry_ref& ref, const BString& text)
|
||||
ShowImageStatusView::Update(const entry_ref& ref, const BString& text,
|
||||
const BString& imageType, float zoom)
|
||||
{
|
||||
fText = text;
|
||||
fRef = ref;
|
||||
|
||||
_SetFrameText(text);
|
||||
_SetZoomText(zoom);
|
||||
_SetImageTypeText(imageType);
|
||||
|
||||
_ValidatePreferredSize();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::SetZoom(float zoom)
|
||||
{
|
||||
_SetZoomText(zoom);
|
||||
_ValidatePreferredSize();
|
||||
Invalidate();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::_SetFrameText(const BString& text)
|
||||
{
|
||||
fCellText[0] = text;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::_SetZoomText(float zoom)
|
||||
{
|
||||
fCellText[1].SetToFormat("%.0f%%", zoom * 100);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::_SetImageTypeText(const BString& imageType)
|
||||
{
|
||||
fCellText[2] = imageType;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ShowImageStatusView::_ValidatePreferredSize()
|
||||
{
|
||||
float orgWidth = fPreferredSize.width;
|
||||
// width
|
||||
fPreferredSize.width = 0.f;
|
||||
for (size_t i = 0; i < kStatusCellCount; i++) {
|
||||
if (fCellText[i].Length() == 0) {
|
||||
fCellWidth[i] = 0;
|
||||
continue;
|
||||
}
|
||||
float width = ceilf(StringWidth(fCellText[i]));
|
||||
if (width > 0)
|
||||
width += kHorzSpacing * 2;
|
||||
fCellWidth[i] = width;
|
||||
fPreferredSize.width += fCellWidth[i];
|
||||
}
|
||||
|
||||
// height
|
||||
font_height fontHeight;
|
||||
GetFontHeight(&fontHeight);
|
||||
|
||||
fPreferredSize.height = ceilf(fontHeight.ascent + fontHeight.descent
|
||||
+ fontHeight.leading);
|
||||
|
||||
if (fPreferredSize.height < B_H_SCROLL_BAR_HEIGHT)
|
||||
fPreferredSize.height = B_H_SCROLL_BAR_HEIGHT;
|
||||
|
||||
float delta = fPreferredSize.width - orgWidth;
|
||||
ResizeBy(delta, 0);
|
||||
BScrollBar* scrollBar = fScrollView->ScrollBar(B_HORIZONTAL);
|
||||
scrollBar->ResizeBy(-delta, 0);
|
||||
scrollBar->MoveBy(delta, 0);
|
||||
}
|
||||
|
@ -15,20 +15,37 @@
|
||||
#include <View.h>
|
||||
|
||||
|
||||
enum {
|
||||
kFrameSizeCell,
|
||||
kZoomCell,
|
||||
kImageTypeCell,
|
||||
kStatusCellCount
|
||||
};
|
||||
|
||||
|
||||
class ShowImageStatusView : public BView {
|
||||
public:
|
||||
ShowImageStatusView(BRect rect,
|
||||
const char* name, uint32 resizingMode,
|
||||
uint32 flags);
|
||||
ShowImageStatusView(BScrollView* scrollView);
|
||||
|
||||
virtual void AttachedToWindow();
|
||||
virtual void GetPreferredSize(float* _width, float* _height);
|
||||
virtual void ResizeToPreferred();
|
||||
virtual void Draw(BRect updateRect);
|
||||
virtual void MouseDown(BPoint where);
|
||||
|
||||
void Update(const entry_ref& ref,
|
||||
const BString& text);
|
||||
|
||||
private:
|
||||
BString fText;
|
||||
const BString& text, const BString& imageType,
|
||||
float zoom);
|
||||
void SetZoom(float zoom);
|
||||
private:
|
||||
void _SetFrameText(const BString& text);
|
||||
void _SetZoomText(float zoom);
|
||||
void _SetImageTypeText(const BString& imageType);
|
||||
void _ValidatePreferredSize();
|
||||
BScrollView* fScrollView;
|
||||
BSize fPreferredSize;
|
||||
BString fCellText[kStatusCellCount];
|
||||
float fCellWidth[kStatusCellCount];
|
||||
entry_ref fRef;
|
||||
};
|
||||
|
||||
|
@ -1587,6 +1587,10 @@ ShowImageView::SetZoom(float zoom, BPoint where)
|
||||
offset.y = (int)(where.y * fZoom / oldZoom + 0.5) - offset.y;
|
||||
ScrollTo(offset);
|
||||
}
|
||||
|
||||
BMessage message(MSG_UPDATE_STATUS_ZOOM);
|
||||
message.AddFloat("zoom", fZoom);
|
||||
_SendMessageToWindow(&message);
|
||||
}
|
||||
|
||||
|
||||
|
@ -230,35 +230,11 @@ ShowImageWindow::ShowImageWindow(BRect frame, const entry_ref& ref,
|
||||
| B_FRAME_EVENTS);
|
||||
// wrap a scroll view around the view
|
||||
fScrollView = new BScrollView("image_scroller", fImageView,
|
||||
B_FOLLOW_ALL, 0, false, false, B_PLAIN_BORDER);
|
||||
B_FOLLOW_ALL, 0, true, true, B_PLAIN_BORDER);
|
||||
contentView->AddChild(fScrollView);
|
||||
|
||||
const int32 kstatusWidth = 190;
|
||||
BRect rect;
|
||||
rect = contentView->Bounds();
|
||||
rect.top = viewFrame.bottom + 1;
|
||||
rect.left = viewFrame.left + kstatusWidth;
|
||||
rect.right = viewFrame.right + 1;
|
||||
rect.bottom += 1;
|
||||
BScrollBar* horizontalScrollBar = new BScrollBar(rect, "hscroll",
|
||||
fImageView, 0, 150, B_HORIZONTAL);
|
||||
contentView->AddChild(horizontalScrollBar);
|
||||
|
||||
rect.left = 0;
|
||||
rect.right = kstatusWidth - 1;
|
||||
rect.bottom -= 1;
|
||||
fStatusView = new ShowImageStatusView(rect, "status_view", B_FOLLOW_BOTTOM,
|
||||
B_WILL_DRAW);
|
||||
contentView->AddChild(fStatusView);
|
||||
|
||||
rect = contentView->Bounds();
|
||||
rect.top = viewFrame.top - 1;
|
||||
rect.left = viewFrame.right + 1;
|
||||
rect.bottom = viewFrame.bottom + 1;
|
||||
rect.right += 1;
|
||||
fVerticalScrollBar = new BScrollBar(rect, "vscroll", fImageView,
|
||||
0, 150, B_VERTICAL);
|
||||
contentView->AddChild(fVerticalScrollBar);
|
||||
fStatusView = new ShowImageStatusView(fScrollView);
|
||||
fScrollView->AddChild(fStatusView);
|
||||
|
||||
// Update minimum window size
|
||||
float toolBarMinWidth = fToolBar->MinSize().width;
|
||||
@ -973,6 +949,10 @@ ShowImageWindow::MessageReceived(BMessage* message)
|
||||
fImageView->ZoomOut();
|
||||
break;
|
||||
|
||||
case MSG_UPDATE_STATUS_ZOOM:
|
||||
fStatusView->SetZoom(fImageView->Zoom());
|
||||
break;
|
||||
|
||||
case kMsgOriginalSize:
|
||||
if (message->FindInt32("behavior") == BButton::B_TOGGLE_BEHAVIOR) {
|
||||
bool force = (message->FindInt32("be:value") == B_CONTROL_ON);
|
||||
@ -1040,8 +1020,6 @@ ShowImageWindow::MessageReceived(BMessage* message)
|
||||
fToolBar->MoveBy(0, offset);
|
||||
fScrollView->ResizeBy(0, -offset);
|
||||
fScrollView->MoveBy(0, offset);
|
||||
fVerticalScrollBar->ResizeBy(0, -offset);
|
||||
fVerticalScrollBar->MoveBy(0, offset);
|
||||
UpdateIfNeeded();
|
||||
snooze(15000);
|
||||
}
|
||||
@ -1061,12 +1039,7 @@ ShowImageWindow::MessageReceived(BMessage* message)
|
||||
frame.top = fToolBar->Frame().bottom + 1;
|
||||
fScrollView->MoveTo(fScrollView->Frame().left, frame.top);
|
||||
fScrollView->ResizeTo(fScrollView->Bounds().Width(),
|
||||
frame.Height() - B_H_SCROLL_BAR_HEIGHT + 1);
|
||||
fVerticalScrollBar->MoveTo(
|
||||
frame.right - B_V_SCROLL_BAR_WIDTH + 1, frame.top);
|
||||
fVerticalScrollBar->ResizeTo(
|
||||
fVerticalScrollBar->Bounds().Width(),
|
||||
frame.Height() - B_H_SCROLL_BAR_HEIGHT + 1);
|
||||
frame.Height() + 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1085,16 +1058,11 @@ ShowImageWindow::_UpdateStatusText(const BMessage* message)
|
||||
if (fImageView->Bitmap() != NULL) {
|
||||
BRect bounds = fImageView->Bitmap()->Bounds();
|
||||
status << bounds.IntegerWidth() + 1
|
||||
<< "x" << bounds.IntegerHeight() + 1 << ", " << fImageType;
|
||||
<< "x" << bounds.IntegerHeight() + 1;
|
||||
}
|
||||
|
||||
BString text;
|
||||
if (message != NULL && message->FindString("status", &text) == B_OK
|
||||
&& text.Length() > 0) {
|
||||
status << ", " << text;
|
||||
}
|
||||
|
||||
fStatusView->Update(fNavigator.CurrentRef(), status);
|
||||
fStatusView->Update(fNavigator.CurrentRef(), status, fImageType,
|
||||
fImageView->Zoom());
|
||||
}
|
||||
|
||||
|
||||
@ -1546,8 +1514,6 @@ ShowImageWindow::_SetToolBarVisible(bool visible, bool animate)
|
||||
} else {
|
||||
fScrollView->ResizeBy(0, -diff);
|
||||
fScrollView->MoveBy(0, diff);
|
||||
fVerticalScrollBar->ResizeBy(0, -diff);
|
||||
fVerticalScrollBar->MoveBy(0, diff);
|
||||
fToolBar->MoveBy(0, diff);
|
||||
if (!visible)
|
||||
fToolBar->Hide();
|
||||
|
@ -35,6 +35,7 @@ enum {
|
||||
MSG_MODIFIED = 'mMOD',
|
||||
MSG_UPDATE_STATUS = 'mUPS',
|
||||
MSG_UPDATE_STATUS_TEXT = 'mUPT',
|
||||
MSG_UPDATE_STATUS_ZOOM = 'mUPZ',
|
||||
MSG_SELECTION = 'mSEL',
|
||||
MSG_FILE_NEXT = 'mFLN',
|
||||
MSG_FILE_PREV = 'mFLP',
|
||||
@ -118,7 +119,6 @@ private:
|
||||
BToolBar* fToolBar;
|
||||
bool fToolBarVisible;
|
||||
BScrollView* fScrollView;
|
||||
BScrollBar* fVerticalScrollBar;
|
||||
ShowImageView* fImageView;
|
||||
ShowImageStatusView* fStatusView;
|
||||
ProgressWindow* fProgressWindow;
|
||||
|
Loading…
x
Reference in New Issue
Block a user