Unify the Font menu and Font size menu into one.

The Font size menu becomes a submenu of Font so that you can set
both the font and font size at once.

This fixes #4198
This commit is contained in:
John Scipione
2012-12-07 19:57:59 -05:00
parent 9e4281adaf
commit bfbcec141e
3 changed files with 106 additions and 65 deletions
+94 -58
View File
@@ -93,12 +93,7 @@ AppearancePrefView::AppearancePrefView(const char* name,
BMenu* fontMenu = _MakeFontMenu(MSG_HALF_FONT_CHANGED, BMenu* fontMenu = _MakeFontMenu(MSG_HALF_FONT_CHANGED,
PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY), PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY),
PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE)); PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE));
fFontField = new BMenuField(B_TRANSLATE("Font:"), fontMenu);
BMenu* fontSizeMenu = _MakeFontSizeMenu(MSG_HALF_SIZE_CHANGED,
PrefHandler::Default()->getInt32(PREF_HALF_FONT_SIZE));
fFont = new BMenuField(B_TRANSLATE("Font:"), fontMenu);
fFontSize = new BMenuField(B_TRANSLATE("Font size:"), fontSizeMenu);
BPopUpMenu* schemesPopUp = _MakeColorSchemeMenu(MSG_COLOR_SCHEME_CHANGED, BPopUpMenu* schemesPopUp = _MakeColorSchemeMenu(MSG_COLOR_SCHEME_CHANGED,
gPredefinedColorSchemes, gPredefinedColorSchemes[0]); gPredefinedColorSchemes, gPredefinedColorSchemes[0]);
@@ -134,14 +129,12 @@ AppearancePrefView::AppearancePrefView(const char* name,
.Add(fTabTitle->CreateTextViewLayoutItem(), 1, 0) .Add(fTabTitle->CreateTextViewLayoutItem(), 1, 0)
.Add(fWindowTitle->CreateLabelLayoutItem(), 0, 1) .Add(fWindowTitle->CreateLabelLayoutItem(), 0, 1)
.Add(fWindowTitle->CreateTextViewLayoutItem(), 1, 1) .Add(fWindowTitle->CreateTextViewLayoutItem(), 1, 1)
.Add(fFont->CreateLabelLayoutItem(), 0, 2) .Add(fFontField->CreateLabelLayoutItem(), 0, 2)
.Add(fFont->CreateMenuBarLayoutItem(), 1, 2) .Add(fFontField->CreateMenuBarLayoutItem(), 1, 2)
.Add(fFontSize->CreateLabelLayoutItem(), 0, 3) .Add(fColorSchemeField->CreateLabelLayoutItem(), 0, 3)
.Add(fFontSize->CreateMenuBarLayoutItem(), 1, 3) .Add(fColorSchemeField->CreateMenuBarLayoutItem(), 1, 3)
.Add(fColorSchemeField->CreateLabelLayoutItem(), 0, 4) .Add(fColorField->CreateLabelLayoutItem(), 0, 4)
.Add(fColorSchemeField->CreateMenuBarLayoutItem(), 1, 4) .Add(fColorField->CreateMenuBarLayoutItem(), 1, 4)
.Add(fColorField->CreateLabelLayoutItem(), 0, 5)
.Add(fColorField->CreateMenuBarLayoutItem(), 1, 5)
.End() .End()
.AddGlue() .AddGlue()
.Add(fColorControl = new BColorControl(BPoint(10, 10), .Add(fColorControl = new BColorControl(BPoint(10, 10),
@@ -151,8 +144,7 @@ AppearancePrefView::AppearancePrefView(const char* name,
fTabTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fTabTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
fWindowTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fWindowTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT);
fFont->SetAlignment(B_ALIGN_RIGHT); fFontField->SetAlignment(B_ALIGN_RIGHT);
fFontSize->SetAlignment(B_ALIGN_RIGHT);
fColorField->SetAlignment(B_ALIGN_RIGHT); fColorField->SetAlignment(B_ALIGN_RIGHT);
fColorSchemeField->SetAlignment(B_ALIGN_RIGHT); fColorSchemeField->SetAlignment(B_ALIGN_RIGHT);
@@ -190,20 +182,23 @@ AppearancePrefView::GetPreferredSize(float* _width, float* _height)
void void
AppearancePrefView::Revert() AppearancePrefView::Revert()
{ {
fTabTitle->SetText(PrefHandler::Default()->getString(PREF_TAB_TITLE)); PrefHandler* pref = PrefHandler::Default();
fWindowTitle->SetText(PrefHandler::Default()->getString(PREF_WINDOW_TITLE));
fWarnOnExit->SetValue(PrefHandler::Default()->getBool( fTabTitle->SetText(pref->getString(PREF_TAB_TITLE));
fWindowTitle->SetText(pref->getString(PREF_WINDOW_TITLE));
fWarnOnExit->SetValue(pref->getBool(
PREF_WARN_ON_EXIT)); PREF_WARN_ON_EXIT));
fColorSchemeField->Menu()->ItemAt(0)->SetMarked(true); fColorSchemeField->Menu()->ItemAt(0)->SetMarked(true);
fColorControl->SetValue(PrefHandler::Default()-> fColorControl->SetValue(pref->
getRGB(PREF_TEXT_FORE_COLOR)); getRGB(PREF_TEXT_FORE_COLOR));
fFont->Menu()->FindItem(PrefHandler::Default()->getString( const char* family = pref->getString(PREF_HALF_FONT_FAMILY);
PREF_HALF_FONT_FAMILY))->SetMarked(true); const char* style = pref->getString(PREF_HALF_FONT_STYLE);
fFontSize->Menu()->FindItem(PrefHandler::Default()->getString( const char* size = pref->getString(PREF_HALF_FONT_SIZE);
PREF_HALF_FONT_FAMILY))->SetMarked(true);
_MarkSelectedFont(family, style, size);
} }
@@ -215,8 +210,14 @@ AppearancePrefView::AttachedToWindow()
fBlinkCursor->SetTarget(this); fBlinkCursor->SetTarget(this);
fWarnOnExit->SetTarget(this); fWarnOnExit->SetTarget(this);
fFontSize->Menu()->SetTargetForItems(this); fFontField->Menu()->SetTargetForItems(this);
fFont->Menu()->SetTargetForItems(this); for (int32 i = 0; i < fFontField->Menu()->CountItems(); i++) {
BMenu* fontSizeMenu = fFontField->Menu()->SubmenuAt(i);
if (fontSizeMenu == NULL)
continue;
fontSizeMenu->SetTargetForItems(this);
}
fColorControl->SetTarget(this); fColorControl->SetTarget(this);
fColorField->Menu()->SetTargetForItems(this); fColorField->Menu()->SetTargetForItems(this);
@@ -232,6 +233,7 @@ AppearancePrefView::AttachedToWindow()
void void
AppearancePrefView::MessageReceived(BMessage* msg) AppearancePrefView::MessageReceived(BMessage* msg)
{ {
bool modified = false; bool modified = false;
@@ -241,34 +243,33 @@ AppearancePrefView::MessageReceived(BMessage* msg)
{ {
const char* family = NULL; const char* family = NULL;
const char* style = NULL; const char* style = NULL;
msg->FindString("font_family", &family); const char* size = NULL;
msg->FindString("font_style", &style); if (msg->FindString("font_family", &family) != B_OK
|| msg->FindString("font_style", &style) != B_OK
|| msg->FindString("font_size", &size) != B_OK) {
break;
}
PrefHandler* pref = PrefHandler::Default(); PrefHandler* pref = PrefHandler::Default();
const char* currentFamily const char* currentFamily
= pref->getString(PREF_HALF_FONT_FAMILY); = pref->getString(PREF_HALF_FONT_FAMILY);
const char* currentStyle const char* currentStyle
= pref->getString(PREF_HALF_FONT_STYLE); = pref->getString(PREF_HALF_FONT_STYLE);
const char* currentSize
= pref->getString(PREF_HALF_FONT_SIZE);
if (currentFamily == NULL || strcmp(currentFamily, family) != 0 if (currentFamily == NULL || strcmp(currentFamily, family) != 0
|| currentStyle == NULL || strcmp(currentStyle, style) != 0) { || currentStyle == NULL || strcmp(currentStyle, style) != 0
|| currentSize == NULL || strcmp(currentSize, size) != 0) {
pref->setString(PREF_HALF_FONT_FAMILY, family); pref->setString(PREF_HALF_FONT_FAMILY, family);
pref->setString(PREF_HALF_FONT_STYLE, style); pref->setString(PREF_HALF_FONT_STYLE, style);
pref->setString(PREF_HALF_FONT_SIZE, size);
_MarkSelectedFont(family, style, size);
modified = true; modified = true;
} }
break; break;
} }
case MSG_HALF_SIZE_CHANGED:
if (strcmp(PrefHandler::Default()->getString(PREF_HALF_FONT_SIZE),
fFontSize->Menu()->FindMarked()->Label()) != 0) {
PrefHandler::Default()->setString(PREF_HALF_FONT_SIZE,
fFontSize->Menu()->FindMarked()->Label());
msg->AddInt32("font size",
atoi(fFontSize->Menu()->FindMarked()->Label()));
modified = true;
}
break;
case MSG_COLOR_CHANGED: case MSG_COLOR_CHANGED:
{ {
rgb_color oldColor = PrefHandler::Default()->getRGB( rgb_color oldColor = PrefHandler::Default()->getRGB(
@@ -431,13 +432,17 @@ AppearancePrefView::_MakeFontMenu(uint32 command,
font.SetFamilyAndStyle(family, style); font.SetFamilyAndStyle(family, style);
if (IsFontUsable(font)) { if (IsFontUsable(font)) {
BMessage* message = new BMessage(command); BMessage* message = new BMessage(command);
const char* size
= PrefHandler::Default()->getString(PREF_HALF_FONT_SIZE);
message->AddString("font_family", family); message->AddString("font_family", family);
message->AddString("font_style", style); message->AddString("font_style", style);
char itemLabel[134]; message->AddString("font_size", size);
snprintf(itemLabel, sizeof(itemLabel), char fontMenuLabel[134];
snprintf(fontMenuLabel, sizeof(fontMenuLabel),
"%s - %s", family, style); "%s - %s", family, style);
BMenuItem* item = new BMenuItem(itemLabel, BMenu* fontSizeMenu = _MakeFontSizeMenu(fontMenuLabel,
message); MSG_HALF_FONT_CHANGED, family, style, size);
BMenuItem* item = new BMenuItem(fontSizeMenu, message);
menu->AddItem(item); menu->AddItem(item);
if (strcmp(defaultFamily, family) == 0 if (strcmp(defaultFamily, family) == 0
&& strcmp(defaultStyle, style) == 0) && strcmp(defaultStyle, style) == 0)
@@ -456,22 +461,27 @@ AppearancePrefView::_MakeFontMenu(uint32 command,
/*static*/ BMenu* /*static*/ BMenu*
AppearancePrefView::_MakeFontSizeMenu(uint32 command, uint8 defaultSize) AppearancePrefView::_MakeFontSizeMenu(const char* label, uint32 command,
const char* family, const char* style, const char* size)
{ {
BPopUpMenu* menu = new BPopUpMenu("size"); BMenu* menu = new BMenu(label);
menu->SetRadioMode(true);
menu->SetLabelFromMarked(false);
int32 sizes[] = {9, 10, 11, 12, 14, 16, 18, 0}; int32 sizes[] = {9, 10, 11, 12, 14, 16, 18, 0};
bool found = false; bool found = false;
for (uint32 i = 0; sizes[i]; i++) { for (uint32 i = 0; sizes[i]; i++) {
BString string; BString fontSize;
string << sizes[i]; fontSize << sizes[i];
BMessage* message = new BMessage(command);
BMenuItem* item = new BMenuItem(string.String(), message->AddString("font_family", family);
new BMessage(command)); message->AddString("font_style", style);
message->AddString("font_size", fontSize.String());
BMenuItem* item = new BMenuItem(fontSize.String(), message);
menu->AddItem(item); menu->AddItem(item);
if (sizes[i] == atoi(size)) {
if (sizes[i] == defaultSize) {
item->SetMarked(true); item->SetMarked(true);
found = true; found = true;
} }
@@ -479,11 +489,12 @@ AppearancePrefView::_MakeFontSizeMenu(uint32 command, uint8 defaultSize)
if (!found) { if (!found) {
for (uint32 i = 0; sizes[i]; i++) { for (uint32 i = 0; sizes[i]; i++) {
if (sizes[i] > defaultSize) { if (sizes[i] > atoi(size)) {
BString string; BMessage* message = new BMessage(command);
string << defaultSize; message->AddString("font_family", family);
BMenuItem* item = new BMenuItem(string.String(), message->AddString("font_style", style);
new BMessage(command)); message->AddString("font_size", size);
BMenuItem* item = new BMenuItem(size, message);
item->SetMarked(true); item->SetMarked(true);
menu->AddItem(item, i); menu->AddItem(item, i);
break; break;
@@ -543,3 +554,28 @@ AppearancePrefView::_MakeColorSchemeMenu(uint32 msg, const color_scheme** items,
} }
return menu; return menu;
} }
void
AppearancePrefView::_MarkSelectedFont(const char* family, const char* style,
const char* size)
{
char fontMenuLabel[134];
snprintf(fontMenuLabel, sizeof(fontMenuLabel), "%s - %s", family, style);
// mark the selected font
BMenuItem* selectedFont = fFontField->Menu()->FindItem(fontMenuLabel);
if (selectedFont != NULL)
selectedFont->SetMarked(true);
// mark the selected font size on all font menus
for (int32 i = 0; i < fFontField->Menu()->CountItems(); i++) {
BMenu* fontSizeMenu = fFontField->Menu()->SubmenuAt(i);
if (fontSizeMenu == NULL)
continue;
BMenuItem* item = fontSizeMenu->FindItem(size);
if (item != NULL)
item->SetMarked(true);
}
}
+9 -4
View File
@@ -62,8 +62,11 @@ private:
static BMenu* _MakeFontMenu(uint32 command, static BMenu* _MakeFontMenu(uint32 command,
const char* defaultFamily, const char* defaultFamily,
const char* defaultStyle); const char* defaultStyle);
static BMenu* _MakeFontSizeMenu(uint32 command, static BMenu* _MakeFontSizeMenu(const char* label,
uint8 defaultSize); uint32 command,
const char* family,
const char* style,
const char* size);
static BPopUpMenu* _MakeMenu(uint32 msg, const char** items, static BPopUpMenu* _MakeMenu(uint32 msg, const char** items,
const char* defaultItem); const char* defaultItem);
@@ -72,10 +75,12 @@ private:
const color_scheme** schemes, const color_scheme** schemes,
const color_scheme* defaultItemName); const color_scheme* defaultItemName);
void _MarkSelectedFont(const char* family,
const char* style, const char* size);
BCheckBox* fBlinkCursor; BCheckBox* fBlinkCursor;
BCheckBox* fWarnOnExit; BCheckBox* fWarnOnExit;
BMenuField* fFont; BMenuField* fFontField;
BMenuField* fFontSize;
BMenuField* fColorSchemeField; BMenuField* fColorSchemeField;
BMenuField* fColorField; BMenuField* fColorField;
+3 -3
View File
@@ -803,7 +803,7 @@ TermWindow::MessageReceived(BMessage *message)
view->GetTermFont(&font); view->GetTermFont(&font);
int32 size; int32 size;
if (message->FindInt32("font size", &size) != B_OK) if (message->FindInt32("font_size", &size) != B_OK)
break; break;
// mark the font size menu item // mark the font size menu item
@@ -1639,7 +1639,7 @@ TermWindow::_MakeFontSizeMenu(uint32 command, uint8 defaultSize)
BString string; BString string;
string << sizes[i]; string << sizes[i];
BMessage* message = new BMessage(command); BMessage* message = new BMessage(command);
message->AddInt32("font size", sizes[i]); message->AddInt32("font_size", sizes[i]);
BMenuItem* item = new BMenuItem(string.String(), message); BMenuItem* item = new BMenuItem(string.String(), message);
menu->AddItem(item); menu->AddItem(item);
if (sizes[i] == defaultSize) { if (sizes[i] == defaultSize) {
@@ -1654,7 +1654,7 @@ TermWindow::_MakeFontSizeMenu(uint32 command, uint8 defaultSize)
BString string; BString string;
string << defaultSize; string << defaultSize;
BMessage* message = new BMessage(command); BMessage* message = new BMessage(command);
message->AddInt32("font size", sizes[i]); message->AddInt32("font_size", sizes[i]);
BMenuItem* item = new BMenuItem(string.String(), message); BMenuItem* item = new BMenuItem(string.String(), message);
item->SetMarked(true); item->SetMarked(true);
menu->AddItem(item, i); menu->AddItem(item, i);