ShowImage: add feature to force original size.

* This is enabled by shift+click on the Original Size toolbar button.
* The button stays pressed as long as the feature is enabled. Clicking
it again disables it.
* When this is enabled, all images will be shown at original size,
instead of being scaled up or down to fit the window.
* This is not persistent, and only affects the current session/window.
This commit is contained in:
Adrien Destugues
2014-04-28 22:04:08 +02:00
parent 9494b43adc
commit 554e207384
5 changed files with 65 additions and 16 deletions
+2 -1
View File
@@ -186,6 +186,7 @@ ShowImageView::ShowImageView(BRect rect, const char* name, uint32 resizingMode,
fBitmapLocationInView(0.0, 0.0), fBitmapLocationInView(0.0, 0.0),
fStretchToBounds(false), fStretchToBounds(false),
fForceOriginalSize(false),
fHideCursor(false), fHideCursor(false),
fScrollingBitmap(false), fScrollingBitmap(false),
fCreatingSelection(false), fCreatingSelection(false),
@@ -1630,7 +1631,7 @@ ShowImageView::FitToBounds()
return; return;
float fitToBoundsZoom = _FitToBoundsZoom(); float fitToBoundsZoom = _FitToBoundsZoom();
if (!fStretchToBounds && fitToBoundsZoom > 1.0f) if (!fStretchToBounds && fitToBoundsZoom > 1.0f || fForceOriginalSize)
SetZoom(1.0f); SetZoom(1.0f);
else else
SetZoom(fitToBoundsZoom); SetZoom(fitToBoundsZoom);
+3
View File
@@ -87,6 +87,8 @@ public:
void CopySelectionToClipboard(); void CopySelectionToClipboard();
void FitToBounds(); void FitToBounds();
void ForceOriginalSize(bool force)
{ fForceOriginalSize = force; }
void SetZoom(float zoom, void SetZoom(float zoom,
BPoint where = BPoint(-1, -1)); BPoint where = BPoint(-1, -1));
float Zoom() const float Zoom() const
@@ -194,6 +196,7 @@ private:
BPoint fBitmapLocationInView; BPoint fBitmapLocationInView;
bool fStretchToBounds; bool fStretchToBounds;
bool fForceOriginalSize;
bool fHideCursor; bool fHideCursor;
bool fScrollingBitmap; bool fScrollingBitmap;
bool fCreatingSelection; bool fCreatingSelection;
+19 -9
View File
@@ -25,6 +25,7 @@
#include <Application.h> #include <Application.h>
#include <Bitmap.h> #include <Bitmap.h>
#include <BitmapStream.h> #include <BitmapStream.h>
#include <Button.h>
#include <Catalog.h> #include <Catalog.h>
#include <Clipboard.h> #include <Clipboard.h>
#include <Entry.h> #include <Entry.h>
@@ -176,29 +177,31 @@ ShowImageWindow::ShowImageWindow(BRect frame, const entry_ref& ref,
// fToolBarView->AddAction(MSG_FILE_OPEN, be_app, // fToolBarView->AddAction(MSG_FILE_OPEN, be_app,
// tool_bar_icon(kIconDocumentOpen), B_TRANSLATE("Open"B_UTF8_ELLIPSIS)); // tool_bar_icon(kIconDocumentOpen), B_TRANSLATE("Open"B_UTF8_ELLIPSIS));
fToolBarView->AddAction(MSG_FILE_PREV, this, fToolBarView->AddAction(MSG_FILE_PREV, this,
tool_bar_icon(kIconGoPrevious), B_TRANSLATE("Previous file")); tool_bar_icon(kIconGoPrevious), B_TRANSLATE("Previous file"), false);
fToolBarView->AddAction(MSG_FILE_NEXT, this, tool_bar_icon(kIconGoNext), fToolBarView->AddAction(MSG_FILE_NEXT, this, tool_bar_icon(kIconGoNext),
B_TRANSLATE("Next file")); B_TRANSLATE("Next file"), false);
BMessage* fullScreenSlideShow = new BMessage(MSG_SLIDE_SHOW); BMessage* fullScreenSlideShow = new BMessage(MSG_SLIDE_SHOW);
fullScreenSlideShow->AddBool("full screen", true); fullScreenSlideShow->AddBool("full screen", true);
fToolBarView->AddAction(fullScreenSlideShow, this, fToolBarView->AddAction(fullScreenSlideShow, this,
tool_bar_icon(kIconMediaMovieLibrary), B_TRANSLATE("Slide show")); tool_bar_icon(kIconMediaMovieLibrary), B_TRANSLATE("Slide show"),
false);
fToolBarView->AddSeparator(); fToolBarView->AddSeparator();
fToolBarView->AddAction(MSG_SELECTION_MODE, this, fToolBarView->AddAction(MSG_SELECTION_MODE, this,
tool_bar_icon(kIconDrawRectangularSelection), tool_bar_icon(kIconDrawRectangularSelection),
B_TRANSLATE("Selection mode")); B_TRANSLATE("Selection mode"), false);
fToolBarView->AddSeparator(); fToolBarView->AddSeparator();
fToolBarView->AddAction(kMsgOriginalSize, this, fToolBarView->AddAction(kMsgOriginalSize, this,
tool_bar_icon(kIconZoomOriginal), B_TRANSLATE("Original size")); tool_bar_icon(kIconZoomOriginal), B_TRANSLATE("Original size"), true);
fToolBarView->AddAction(kMsgFitToWindow, this, fToolBarView->AddAction(kMsgFitToWindow, this,
tool_bar_icon(kIconZoomFitBest), B_TRANSLATE("Fit to window")); tool_bar_icon(kIconZoomFitBest), B_TRANSLATE("Fit to window"), false);
fToolBarView->AddAction(MSG_ZOOM_IN, this, tool_bar_icon(kIconZoomIn), fToolBarView->AddAction(MSG_ZOOM_IN, this, tool_bar_icon(kIconZoomIn),
B_TRANSLATE("Zoom in")); B_TRANSLATE("Zoom in"), false);
fToolBarView->AddAction(MSG_ZOOM_OUT, this, tool_bar_icon(kIconZoomOut), fToolBarView->AddAction(MSG_ZOOM_OUT, this, tool_bar_icon(kIconZoomOut),
B_TRANSLATE("Zoom out")); B_TRANSLATE("Zoom out"), false);
fToolBarView->AddGlue(); fToolBarView->AddGlue();
fToolBarView->AddAction(MSG_FULL_SCREEN, this, fToolBarView->AddAction(MSG_FULL_SCREEN, this,
tool_bar_icon(kIconViewWindowed), B_TRANSLATE("Leave full screen")); tool_bar_icon(kIconViewWindowed), B_TRANSLATE("Leave full screen"),
false);
fToolBarView->SetActionVisible(MSG_FULL_SCREEN, false); fToolBarView->SetActionVisible(MSG_FULL_SCREEN, false);
fToolBarView->ResizeTo(viewFrame.Width(), fToolBarView->MinSize().height); fToolBarView->ResizeTo(viewFrame.Width(), fToolBarView->MinSize().height);
@@ -966,6 +969,13 @@ ShowImageWindow::MessageReceived(BMessage* message)
break; break;
case kMsgOriginalSize: case kMsgOriginalSize:
if (message->FindInt32("behavior") == BButton::B_TOGGLE_BEHAVIOR)
{
bool force = message->FindInt32("be:value");
fImageView->ForceOriginalSize(force);
if (!force)
break;
}
fImageView->SetZoom(1.0); fImageView->SetZoom(1.0);
break; break;
+37 -4
View File
@@ -10,6 +10,34 @@
#include <SeparatorView.h> #include <SeparatorView.h>
#include <SpaceLayoutItem.h> #include <SpaceLayoutItem.h>
class LockableButton: public BButton
{
public:
LockableButton(const char* name, const char* label, BMessage* message);
void MouseDown(BPoint point);
};
LockableButton::LockableButton(const char* name, const char* label,
BMessage* message)
: BButton(name, label, message)
{
}
void
LockableButton::MouseDown(BPoint point)
{
if (modifiers() & B_SHIFT_KEY || Value() == B_CONTROL_ON)
SetBehavior(B_TOGGLE_BEHAVIOR);
else
SetBehavior(B_BUTTON_BEHAVIOR);
Message()->SetInt32("behavior", Behavior());
BButton::MouseDown(point);
}
ToolBarView::ToolBarView(BRect frame) ToolBarView::ToolBarView(BRect frame)
: :
@@ -44,17 +72,22 @@ ToolBarView::Hide()
void void
ToolBarView::AddAction(uint32 command, BHandler* target, const BBitmap* icon, ToolBarView::AddAction(uint32 command, BHandler* target, const BBitmap* icon,
const char* toolTipText) const char* toolTipText, bool lockable)
{ {
AddAction(new BMessage(command), target, icon, toolTipText); AddAction(new BMessage(command), target, icon, toolTipText, lockable);
} }
void void
ToolBarView::AddAction(BMessage* message, BHandler* target, ToolBarView::AddAction(BMessage* message, BHandler* target,
const BBitmap* icon, const char* toolTipText) const BBitmap* icon, const char* toolTipText, bool lockable)
{ {
BButton* button = new BButton(NULL, NULL, message);
BButton* button;
if (lockable)
button = new LockableButton(NULL, NULL, message);
else
button = new BButton(NULL, NULL, message);
button->SetIcon(icon); button->SetIcon(icon);
button->SetFlat(true); button->SetFlat(true);
if (toolTipText != NULL) if (toolTipText != NULL)
+4 -2
View File
@@ -20,10 +20,12 @@ public:
void AddAction(uint32 command, BHandler* target, void AddAction(uint32 command, BHandler* target,
const BBitmap* icon, const BBitmap* icon,
const char* toolTipText = NULL); const char* toolTipText = NULL,
bool lockable = false);
void AddAction(BMessage* message, BHandler* target, void AddAction(BMessage* message, BHandler* target,
const BBitmap* icon, const BBitmap* icon,
const char* toolTipText = NULL); const char* toolTipText = NULL,
bool lockable = false);
void AddSeparator(); void AddSeparator();
void AddGlue(); void AddGlue();