f0d95841ee
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@27811 a95241bf-73f2-0310-859d-f6bbb57e9c96
392 lines
10 KiB
C++
392 lines
10 KiB
C++
/*
|
|
* Copyright 2000-2008, François Revol, <revol@free.fr>. All rights reserved.
|
|
* Distributed under the terms of the MIT License.
|
|
*/
|
|
|
|
/*
|
|
* ui_settings ThemesAddon class
|
|
*/
|
|
|
|
#include <BeBuild.h>
|
|
#ifdef B_HAIKU_VERSION_1
|
|
|
|
#include <Alert.h>
|
|
#include <Application.h>
|
|
#include <InterfaceDefs.h>
|
|
#include <Entry.h>
|
|
#include <Font.h>
|
|
#include <Menu.h>
|
|
#include <Message.h>
|
|
#include <Roster.h>
|
|
#include <Debug.h>
|
|
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
#include "ThemesAddon.h"
|
|
#include "UITheme.h"
|
|
#include "Utils.h"
|
|
|
|
#ifdef SINGLE_BINARY
|
|
#define instantiate_themes_addon instantiate_themes_addon_ui_settings
|
|
#endif
|
|
|
|
#define DEBUG_TA
|
|
#ifdef DEBUG_TA
|
|
#define FENTRY PRINT(("*ThemesAddon[%s]::%s()\n", Name(), __FUNCTION__))
|
|
#else
|
|
#define FENTRY
|
|
#endif
|
|
|
|
#define DERR(e) { PRINT(("%s: err: %s\n", __FUNCTION__, strerror(e))); }
|
|
|
|
// private font API
|
|
extern void _set_system_font_(const char *which, font_family family,
|
|
font_style style, float size);
|
|
extern status_t _get_system_default_font_(const char* which,
|
|
font_family family, font_style style, float* _size);
|
|
|
|
|
|
#define A_NAME "System Colors and Fonts"
|
|
#define A_MSGNAME Z_THEME_UI_SETTINGS
|
|
#define A_DESCRIPTION "System colors, fonts and other goodies"
|
|
|
|
|
|
class UISettingsThemesAddon : public ThemesAddon {
|
|
public:
|
|
UISettingsThemesAddon();
|
|
~UISettingsThemesAddon();
|
|
|
|
const char *Description();
|
|
|
|
status_t RunPreferencesPanel();
|
|
|
|
status_t AddNames(BMessage &names);
|
|
|
|
status_t ApplyTheme(BMessage &theme, uint32 flags=0L);
|
|
status_t MakeTheme(BMessage &theme, uint32 flags=0L);
|
|
|
|
status_t ApplyDefaultTheme(uint32 flags=0L);
|
|
};
|
|
|
|
|
|
struct ui_color_map {
|
|
const char *name;
|
|
color_which id;
|
|
} gUIColorMap[] = {
|
|
{ B_UI_PANEL_BACKGROUND_COLOR, B_PANEL_BACKGROUND_COLOR },
|
|
{ B_UI_PANEL_TEXT_COLOR, B_PANEL_TEXT_COLOR },
|
|
// { B_UI_PANEL_LINK_COLOR, B_PANEL_LINK_COLOR },
|
|
{ B_UI_DOCUMENT_BACKGROUND_COLOR, B_DOCUMENT_BACKGROUND_COLOR },
|
|
{ B_UI_DOCUMENT_TEXT_COLOR, B_DOCUMENT_TEXT_COLOR },
|
|
// { B_UI_DOCUMENT_LINK_COLOR, B_DOCUMENT_LINK_COLOR },
|
|
{ B_UI_CONTROL_BACKGROUND_COLOR, B_CONTROL_BACKGROUND_COLOR },
|
|
{ B_UI_CONTROL_TEXT_COLOR, B_CONTROL_TEXT_COLOR },
|
|
{ B_UI_CONTROL_BORDER_COLOR, B_CONTROL_BORDER_COLOR },
|
|
{ B_UI_CONTROL_HIGHLIGHT_COLOR, B_CONTROL_HIGHLIGHT_COLOR },
|
|
{ B_UI_NAVIGATION_BASE_COLOR, B_NAVIGATION_BASE_COLOR },
|
|
{ B_UI_NAVIGATION_PULSE_COLOR, B_NAVIGATION_PULSE_COLOR },
|
|
{ B_UI_SHINE_COLOR, B_SHINE_COLOR },
|
|
{ B_UI_SHADOW_COLOR, B_SHADOW_COLOR },
|
|
{ B_UI_TOOLTIP_BACKGROUND_COLOR, B_TOOLTIP_BACKGROUND_COLOR },
|
|
{ B_UI_TOOLTIP_TEXT_COLOR, B_TOOLTIP_TEXT_COLOR },
|
|
{ B_UI_MENU_BACKGROUND_COLOR, B_MENU_BACKGROUND_COLOR },
|
|
{ B_UI_MENU_SELECTED_BACKGROUND_COLOR, B_MENU_SELECTED_BACKGROUND_COLOR },
|
|
{ B_UI_MENU_ITEM_TEXT_COLOR, B_MENU_ITEM_TEXT_COLOR },
|
|
{ B_UI_MENU_SELECTED_ITEM_TEXT_COLOR, B_MENU_SELECTED_ITEM_TEXT_COLOR },
|
|
{ B_UI_MENU_SELECTED_BORDER_COLOR, B_MENU_SELECTED_BORDER_COLOR },
|
|
{ B_UI_SUCCESS_COLOR, B_SUCCESS_COLOR },
|
|
{ B_UI_FAILURE_COLOR, B_FAILURE_COLOR },
|
|
{ NULL, (color_which)-1 }
|
|
};
|
|
|
|
|
|
UISettingsThemesAddon::UISettingsThemesAddon()
|
|
: ThemesAddon(A_NAME, A_MSGNAME)
|
|
{
|
|
FENTRY;
|
|
}
|
|
|
|
|
|
UISettingsThemesAddon::~UISettingsThemesAddon()
|
|
{
|
|
FENTRY;
|
|
}
|
|
|
|
|
|
const char *
|
|
UISettingsThemesAddon::Description()
|
|
{
|
|
return A_DESCRIPTION;
|
|
}
|
|
|
|
|
|
status_t
|
|
UISettingsThemesAddon::RunPreferencesPanel()
|
|
{
|
|
status_t err = B_OK;
|
|
entry_ref ref;
|
|
BEntry ent;
|
|
FENTRY;
|
|
/*
|
|
err = ent.SetTo("/boot/beos/preferences/Colors");
|
|
if (!err) {
|
|
err = ent.GetRef(&ref);
|
|
if (!err) {
|
|
err = be_roster->Launch(&ref);
|
|
}
|
|
}
|
|
*/
|
|
if (!err)
|
|
return B_OK;
|
|
err = ent.SetTo("/boot/beos/preferences/Appearance");
|
|
if (!err) {
|
|
err = ent.GetRef(&ref);
|
|
if (!err) {
|
|
err = be_roster->Launch(&ref);
|
|
}
|
|
}
|
|
return err;
|
|
}
|
|
|
|
|
|
status_t
|
|
UISettingsThemesAddon::AddNames(BMessage &names)
|
|
{
|
|
FENTRY;
|
|
|
|
names.AddString(Z_THEME_UI_SETTINGS, "UI Settings");
|
|
// Haiku doesn't know about them, wo add them
|
|
//XXX: use symbolic names.
|
|
names.AddString("be:c:PanBg", "Panel Background");
|
|
names.AddString("be:c:PanTx", "Panel Text");
|
|
names.AddString("be:c:PanLn", "Panel Link");
|
|
names.AddString("be:c:DocBg", "Document Background");
|
|
names.AddString("be:c:DocTx", "Document Text");
|
|
names.AddString("be:c:DocLn", "Document Link");
|
|
names.AddString("be:c:CtlBg", "Control Background");
|
|
names.AddString("be:c:CtlTx", "Control Text");
|
|
names.AddString("be:c:CtlBr", "Control Border");
|
|
names.AddString("be:c:CtlHg", "Control Highlight");
|
|
names.AddString("be:c:NavBs", "Navigation Base");
|
|
names.AddString("be:c:NavPl", "Navigation Pulse");
|
|
names.AddString("be:c:Shine", "Shine");
|
|
names.AddString("be:c:Shadow", "Shadow");
|
|
names.AddString("be:c:TipBg", "ToolTip Background");
|
|
names.AddString("be:c:TipTx", "ToolTip Text");
|
|
names.AddString("be:c:MenBg", "Menu Background");
|
|
names.AddString("be:c:MenSBg", "Menu Selected Background");
|
|
names.AddString("be:c:MenTx", "Menu Item Text");
|
|
names.AddString("be:c:MenSTx", "Menu Selected Item Text");
|
|
names.AddString("be:c:MenSBr", "Menu Selected Border");
|
|
names.AddString("be:c:Success", "Success");
|
|
names.AddString("be:c:Failure", "Failure");
|
|
names.AddString("be:f:MenTx", "Menu Item Text");
|
|
names.AddString("be:MenSep", "Menu Separator");
|
|
names.AddString("be:MenTrig", "Show Menu Triggers");
|
|
names.AddString("be:MenZSnake", "Menu ZSnake");
|
|
names.AddString("be:f:Tip", "ToolTip");
|
|
names.AddString("be:f:be_plain_font", "System Plain");
|
|
names.AddString("be:f:be_bold_font", "System Bold");
|
|
names.AddString("be:f:be_fixed_font", "System Fixed");
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
UISettingsThemesAddon::ApplyTheme(BMessage &theme, uint32 flags)
|
|
{
|
|
BMessage uisettings;
|
|
BFont fnt;
|
|
struct menu_info menuInfo;
|
|
status_t err;
|
|
status_t gmierr = ENOENT;
|
|
int i;
|
|
FENTRY;
|
|
|
|
if (!(flags & UI_THEME_SETTINGS_SET_ALL) || !(AddonFlags() & Z_THEME_ADDON_DO_SET_ALL))
|
|
return B_OK;
|
|
|
|
err = MyMessage(theme, uisettings);
|
|
DERR(err);
|
|
if (err)
|
|
return err;
|
|
|
|
font_family family;
|
|
font_style style;
|
|
|
|
err = FindFont(uisettings, "be:f:be_plain_font", 0, &fnt);
|
|
//uisettings.RemoveName("be:f:be_plain_font");
|
|
DERR(err);
|
|
if (err == B_OK) {
|
|
fnt.GetFamilyAndStyle(&family, &style);
|
|
_set_system_font_("plain", family, style, fnt.Size());
|
|
}
|
|
|
|
err = FindFont(uisettings, "be:f:be_bold_font", 0, &fnt);
|
|
DERR(err);
|
|
//uisettings.RemoveName("be:f:be_bold_font");
|
|
if (err == B_OK) {
|
|
fnt.GetFamilyAndStyle(&family, &style);
|
|
_set_system_font_("bold", family, style, fnt.Size());
|
|
}
|
|
|
|
err = FindFont(uisettings, "be:f:be_fixed_font", 0, &fnt);
|
|
DERR(err);
|
|
//uisettings.RemoveName("be:f:be_fixed_font");
|
|
if (err == B_OK) {
|
|
fnt.GetFamilyAndStyle(&family, &style);
|
|
_set_system_font_("fixed", family, style, fnt.Size());
|
|
}
|
|
|
|
err = FindFont(uisettings, "be:f:Tip", 0, &fnt);
|
|
DERR(err);
|
|
//uisettings.RemoveName("be:f:Tip");
|
|
if (err == B_OK) {
|
|
fnt.GetFamilyAndStyle(&family, &style);
|
|
// not implemented yet in Haiku
|
|
//_set_system_font_("tip", family, style, fnt.Size());
|
|
//_set_system_font_("tooltip", family, style, fnt.Size());
|
|
}
|
|
|
|
gmierr = get_menu_info(&menuInfo);
|
|
|
|
for (i = 0; gUIColorMap[i].name; i++) {
|
|
rgb_color c;
|
|
if (FindRGBColor(uisettings, gUIColorMap[i].name, 0, &c) == B_OK) {
|
|
set_ui_color(gUIColorMap[i].id, c);
|
|
PRINT(("set_ui_color(%d, #%02x%02x%02x)\n",
|
|
gUIColorMap[i].id, c.red, c.green, c.blue));
|
|
if (gUIColorMap[i].id == B_MENU_BACKGROUND_COLOR)
|
|
menuInfo.background_color = c;
|
|
}
|
|
}
|
|
|
|
if (gmierr >= B_OK) {
|
|
bool bval;
|
|
int32 ival;
|
|
if (uisettings.FindBool("be:MenTrig", &bval) >= B_OK)
|
|
menuInfo.triggers_always_shown = bval;
|
|
if (uisettings.FindInt32("be:MenSep", &ival) >= B_OK)
|
|
menuInfo.separator = ival;
|
|
err = FindFont(uisettings, "be:f:MenTx", 0, &fnt);
|
|
DERR(err);
|
|
if (err == B_OK) {
|
|
fnt.GetFamilyAndStyle(&menuInfo.f_family, &menuInfo.f_style);
|
|
menuInfo.font_size = fnt.Size();
|
|
}
|
|
set_menu_info(&menuInfo);
|
|
}
|
|
|
|
return B_OK;
|
|
}
|
|
|
|
|
|
status_t
|
|
UISettingsThemesAddon::MakeTheme(BMessage &theme, uint32 flags)
|
|
{
|
|
BMessage uisettings;
|
|
BMessage names;
|
|
BFont fnt;
|
|
menu_info menuInfo;
|
|
status_t err;
|
|
int i;
|
|
FENTRY;
|
|
|
|
(void)flags;
|
|
err = MyMessage(theme, uisettings);
|
|
if (err)
|
|
uisettings.MakeEmpty();
|
|
|
|
for (i = 0; gUIColorMap[i].name; i++) {
|
|
rgb_color c = ui_color(gUIColorMap[i].id);
|
|
AddRGBColor(uisettings, gUIColorMap[i].name, c);
|
|
}
|
|
|
|
// hack for legacy fonts
|
|
AddFont(uisettings, "be:f:be_plain_font", (BFont *)be_plain_font);
|
|
AddFont(uisettings, "be:f:be_bold_font", (BFont *)be_bold_font);
|
|
AddFont(uisettings, "be:f:be_fixed_font", (BFont *)be_fixed_font);
|
|
// XXX: FIXME
|
|
//AddFont(uisettings, "be:f:Tip", (BFont *)be_tip_font);
|
|
|
|
// menu stuff
|
|
err = get_menu_info(&menuInfo);
|
|
if (err >= B_OK) {
|
|
uisettings.AddBool("be:MenTrig", menuInfo.triggers_always_shown);
|
|
uisettings.AddInt32("be:MenSep", menuInfo.separator);
|
|
fnt.SetFamilyAndStyle(menuInfo.f_family, menuInfo.f_style);
|
|
fnt.SetSize(menuInfo.font_size);
|
|
AddFont(uisettings, "be:f:MenTx", &fnt);
|
|
}
|
|
|
|
err = SetMyMessage(theme, uisettings);
|
|
return err;
|
|
}
|
|
|
|
|
|
status_t
|
|
UISettingsThemesAddon::ApplyDefaultTheme(uint32 flags)
|
|
{
|
|
BMessage theme;
|
|
BMessage uisettings;
|
|
rgb_color color;
|
|
FENTRY;
|
|
|
|
/*
|
|
status_t err;
|
|
err = get_default_settings(&uisettings);
|
|
if (err)
|
|
return err;
|
|
*/
|
|
|
|
font_family family;
|
|
font_style style;
|
|
float size;
|
|
BFont f;
|
|
if (_get_system_default_font_("plain", family, style, &size) != B_OK)
|
|
return B_ERROR;
|
|
f.SetFamilyAndStyle(family, style);
|
|
f.SetSize(size);
|
|
AddFont(uisettings, "be:f:be_plain_font", &f);
|
|
|
|
if (_get_system_default_font_(Name(), family, style, &size) != B_OK)
|
|
return B_ERROR;
|
|
f.SetFamilyAndStyle(family, style);
|
|
f.SetSize(size);
|
|
AddFont(uisettings, "be:f:be_plain_font", &f);
|
|
|
|
if (_get_system_default_font_(Name(), family, style, &size) != B_OK)
|
|
return B_ERROR;
|
|
f.SetFamilyAndStyle(family, style);
|
|
f.SetSize(size);
|
|
AddFont(uisettings, "be:f:be_plain_font", &f);
|
|
|
|
// menu stuff
|
|
sprintf(family,"%s","Bitstream Vera Sans");
|
|
sprintf(style,"%s","Roman");
|
|
f.SetFamilyAndStyle(family, style);
|
|
f.SetSize(12.0);
|
|
AddFont(uisettings, "be:f:MenTx", &f);
|
|
color.red = 216;
|
|
color.blue = 216;
|
|
color.green = 216;
|
|
color.alpha = 255;
|
|
AddRGBColor(uisettings, "be:c:MenBg", color);
|
|
uisettings.AddBool("be:MenTrig", false);
|
|
uisettings.AddInt32("be:MenSep", 0);
|
|
|
|
theme.AddMessage(A_MSGNAME, &uisettings);
|
|
return ApplyTheme(theme, flags);
|
|
}
|
|
|
|
|
|
ThemesAddon *
|
|
instantiate_themes_addon()
|
|
{
|
|
return (ThemesAddon *) new UISettingsThemesAddon;
|
|
}
|
|
|
|
|
|
#endif /* B_BEOS_VERSION_DANO */
|