Add support for flags in BCountry. The flags are stored as HVIF icon resources in liblocale.so.

Test french flag took from http://www.bastisoft.de/misc/flags/ (licence is very permissive), converted to HVIF with Icon O Matic.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36314 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Adrien Destugues
2010-04-15 18:52:20 +00:00
parent 8c4c164a91
commit ffbcecd489
6 changed files with 134 additions and 60 deletions
Binary file not shown.
+10 -2
View File
@@ -10,6 +10,7 @@
#include <assert.h>
#include <IconUtils.h>
#include <Resources.h>
#include <String.h>
#include <unicode/datefmt.h>
@@ -91,10 +92,17 @@ status_t
BCountry::GetIcon(BBitmap* result)
{
// TODO: a proper way to locate the library being used ?
BNode storage("/boot/system/lib/liblocale.so");
BResources storage("/boot/system/lib/liblocale.so");
if (storage.InitCheck() != B_OK)
return B_ERROR;
return BIconUtils::GetVectorIcon(&storage, Code(), result);
size_t size;
const void* buffer = storage.LoadResource(B_VECTOR_ICON_TYPE, Code(),
&size);
if (buffer != NULL && size != 0) {
return BIconUtils::GetVectorIcon(static_cast<const uint8*>(buffer),
size, result);
} else
return B_BAD_DATA;
}
+6
View File
@@ -0,0 +1,6 @@
resource(2, "fr") #'VICN' array {
$"6E636966030300335B05FF03D81C3F030A04B2FBB75DCC84B75DCC84C863B2FB"
$"C8630A04BB7EB75DCC84B75DCC84C863BB7EC8630A04C401B75DCC84B75DCC84"
$"C863C401C863030A000100000A010101000A02010200"
};
+2
View File
@@ -4,6 +4,8 @@ UsePrivateHeaders libbe locale shared ;
UsePublicHeaders locale storage icon ;
UseLibraryHeaders icu icon ;
AddResources liblocale.so : CountryFlags.rdef ;
SharedLibrary liblocale.so
: cat.cpp
Catalog.cpp
+104 -54
View File
@@ -7,6 +7,7 @@
#include "Locale.h"
#include <Bitmap.h>
#include <Country.h>
#define MAX_DRAG_HEIGHT 200.0
@@ -19,6 +20,56 @@ LanguageListItem::LanguageListItem(const char* text, const char* code)
BStringItem(text),
fLanguageCode(code)
{
// TODO: should probably keep the BCountry as a member of the class
BCountry myCountry(code);
BRect bounds(0, 0, 15, 15);
icon = new BBitmap(bounds, B_RGBA32);
myCountry.GetIcon(icon);
}
//MediaListItem - DrawItem
void
LanguageListItem::DrawItem(BView *owner, BRect frame, bool complete)
{
rgb_color kHighlight = { 140,140,140,0 };
rgb_color kBlack = { 0,0,0,0 };
BRect r(frame);
if (IsSelected() || complete) {
rgb_color color;
if (IsSelected()) {
color = kHighlight;
} else {
color = owner->ViewColor();
}
owner->SetHighColor(color);
owner->SetLowColor(color);
owner->FillRect(r);
owner->SetHighColor(kBlack);
} else {
owner->SetLowColor(owner->ViewColor());
}
frame.left += 4;
BRect iconFrame(frame);
iconFrame.Set(iconFrame.left, iconFrame.top+1, iconFrame.left+15, iconFrame.top+16);
owner->SetDrawingMode(B_OP_OVER);
owner->DrawBitmap(icon, iconFrame);
owner->SetDrawingMode(B_OP_COPY);
frame.left += 16 * (OutlineLevel() + 1);
owner->SetHighColor(kBlack);
BFont font = be_plain_font;
font_height finfo;
font.GetHeight(&finfo);
owner->SetFont(&font);
owner->MovePenTo(frame.left+8, frame.top + ((frame.Height() - (finfo.ascent + finfo.descent + finfo.leading)) / 2) +
(finfo.ascent + finfo.descent) - 1);
owner->DrawString(Text());
}
@@ -140,7 +191,8 @@ void LanguageListView::MessageReceived (BMessage* message)
}
Invoke(fMsgPrefLanguagesChanged);
}
} else BOutlineListView::MessageReceived(message);
} else
BOutlineListView::MessageReceived(message);
}
@@ -209,58 +261,57 @@ LanguageListView::InitiateDrag(BPoint point, int32 index, bool)
}
BBitmap* dragBitmap = new BBitmap(dragRect, B_RGB32, true);
if (dragBitmap && dragBitmap->IsValid()) {
if (BView* v = new BView(dragBitmap->Bounds(), "helper",
B_FOLLOW_NONE, B_WILL_DRAW)) {
dragBitmap->AddChild(v);
dragBitmap->Lock();
BRect itemBounds(dragRect) ;
itemBounds.bottom = 0.0;
// let all selected items, that fit into our drag_bitmap, draw
for (int32 i = 0; i < numItems; i++) {
int32 index = FullListCurrentSelection(i);
LanguageListItem* item
= static_cast<LanguageListItem*>(FullListItemAt(index));
itemBounds.bottom = itemBounds.top + ceilf(item->Height());
if (itemBounds.bottom > dragRect.bottom)
itemBounds.bottom = dragRect.bottom;
item->DrawItem(v, itemBounds);
itemBounds.top = itemBounds.bottom + 1.0;
}
// make a black frame arround the edge
v->SetHighColor(0, 0, 0, 255);
v->StrokeRect(v->Bounds());
v->Sync();
uint8* bits = (uint8*)dragBitmap->Bits();
int32 height = (int32)dragBitmap->Bounds().Height() + 1;
int32 width = (int32)dragBitmap->Bounds().Width() + 1;
int32 bpr = dragBitmap->BytesPerRow();
if (fade) {
for (int32 y = 0; y < height - ALPHA / 2;
y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = ALPHA;
}
for (int32 y = height - ALPHA / 2; y < height;
y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = (height - y) << 1;
}
} else {
for (int32 y = 0; y < height; y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = ALPHA;
}
}
dragBitmap->Unlock();
BView* v = new BView(dragBitmap->Bounds(), "helper",
B_FOLLOW_NONE, B_WILL_DRAW);
dragBitmap->AddChild(v);
dragBitmap->Lock();
BRect itemBounds(dragRect) ;
itemBounds.bottom = 0.0;
// let all selected items, that fit into our drag_bitmap, draw
for (int32 i = 0; i < numItems; i++) {
int32 index = FullListCurrentSelection(i);
LanguageListItem* item
= static_cast<LanguageListItem*>(FullListItemAt(index));
itemBounds.bottom = itemBounds.top + ceilf(item->Height());
if (itemBounds.bottom > dragRect.bottom)
itemBounds.bottom = dragRect.bottom;
item->DrawItem(v, itemBounds);
itemBounds.top = itemBounds.bottom + 1.0;
}
// make a black frame arround the edge
v->SetHighColor(0, 0, 0, 255);
v->StrokeRect(v->Bounds());
v->Sync();
uint8* bits = (uint8*)dragBitmap->Bits();
int32 height = (int32)dragBitmap->Bounds().Height() + 1;
int32 width = (int32)dragBitmap->Bounds().Width() + 1;
int32 bpr = dragBitmap->BytesPerRow();
if (fade) {
for (int32 y = 0; y < height - ALPHA / 2;
y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = ALPHA;
}
for (int32 y = height - ALPHA / 2; y < height;
y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = (height - y) << 1;
}
} else {
for (int32 y = 0; y < height; y++, bits += bpr) {
uint8* line = bits + 3;
for (uint8* end = line + 4 * width; line < end;
line += 4)
*line = ALPHA;
}
}
dragBitmap->Unlock();
} else {
delete dragBitmap;
dragBitmap = NULL;
@@ -317,7 +368,6 @@ LanguageListView::MouseMoved(BPoint where, uint32 transit, const BMessage* msg)
break;
}
}
} else {
} else
BOutlineListView::MouseMoved(where, transit, msg);
}
}
+12 -4
View File
@@ -1,3 +1,9 @@
/*
* Copyright 2010, Adrien Destugues, pulkomandy@gmail.com
* All rights reserved. Distributed under the terms of the MIT License.
*/
#ifndef __LANGUAGE_LIST_VIEW_H
#define __LANGUAGE_LIST_VIEW_H
@@ -7,8 +13,7 @@
#include <String.h>
class LanguageListItem: public BStringItem
{
class LanguageListItem: public BStringItem {
public:
LanguageListItem(const char* text, const char* code);
@@ -21,9 +26,13 @@ class LanguageListItem: public BStringItem
~LanguageListItem() {};
const inline BString LanguageCode() { return fLanguageCode; }
//virtual void Update(BView *owner, const BFont *finfo);
virtual void DrawItem(BView *owner, BRect frame, bool complete = false);
private:
const BString fLanguageCode;
BBitmap* icon;
};
@@ -36,8 +45,7 @@ compare_list_items(const void* _a, const void* _b)
}
class LanguageListView: public BOutlineListView
{
class LanguageListView: public BOutlineListView {
public:
LanguageListView(const char* name, list_view_type type);