⛏️ index : haiku.git

/*
 * Copyright 2001-2006, Haiku.
 * Distributed under the terms of the MIT License.
 *
 * Authors:
 *		Rafael Romo
 *		Stefano Ceccherini (burton666@libero.it)
 *		Axel DΓΆrfler, axeld@pinc-software.de
 */


#include "RefreshSlider.h"
#include "Constants.h"

#include <Catalog.h>
#include <String.h>
#include <Window.h>

#include <new>
#include <stdio.h>


#undef B_TRANSLATION_CONTEXT
#define B_TRANSLATION_CONTEXT "Screen"


RefreshSlider::RefreshSlider(BRect frame, float min, float max, uint32 resizingMode)
	: BSlider(frame, B_TRANSLATE("Screen"), B_TRANSLATE("Refresh rate:"),
		new BMessage(SLIDER_INVOKE_MSG), (int32)rintf(min * 10), (int32)rintf(max * 10),
		B_BLOCK_THUMB, resizingMode),
	fStatus(new (std::nothrow) char[32])
{
	BString minRefresh;
	minRefresh << (uint32)min;
	BString maxRefresh;
	maxRefresh << (uint32)max;
	SetLimitLabels(minRefresh.String(), maxRefresh.String());

	SetHashMarks(B_HASH_MARKS_BOTTOM);
	SetHashMarkCount(uint32(max - min) / 5 + 1);

	SetKeyIncrementValue(1);
}


RefreshSlider::~RefreshSlider()
{
	delete[] fStatus;
}


void
RefreshSlider::DrawFocusMark()
{
	if (IsFocus()) {
		rgb_color blue = { 0, 0, 229, 255 };
		
		BRect rect(ThumbFrame());		
		BView *view = OffscreenView();
				
		rect.InsetBy(2.0, 2.0);
		rect.right--;
		rect.bottom--;
		
		view->SetHighColor(blue);
		view->StrokeRect(rect);
	}
}


void
RefreshSlider::KeyDown(const char *bytes, int32 numBytes)
{
	switch (*bytes) {
		case B_LEFT_ARROW:
		{
			SetValue(Value() - 1);
			Invoke();
			break;
		}
		
		case B_RIGHT_ARROW:
		{
			SetValue(Value() + 1);
			Invoke();
			break;
		}

		default:
			break;
	}
}


const char*
RefreshSlider::UpdateText() const
{
	if (fStatus != NULL)
		snprintf(fStatus, 32, B_TRANSLATE("%.1f Hz"), (float)Value() / 10);

	return fStatus;
}