diff --git a/src/apps/terminal/AppearPrefView.cpp b/src/apps/terminal/AppearPrefView.cpp index f78494cc0d..0e548c439b 100644 --- a/src/apps/terminal/AppearPrefView.cpp +++ b/src/apps/terminal/AppearPrefView.cpp @@ -93,12 +93,7 @@ AppearancePrefView::AppearancePrefView(const char* name, BMenu* fontMenu = _MakeFontMenu(MSG_HALF_FONT_CHANGED, PrefHandler::Default()->getString(PREF_HALF_FONT_FAMILY), PrefHandler::Default()->getString(PREF_HALF_FONT_STYLE)); - - 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); + fFontField = new BMenuField(B_TRANSLATE("Font:"), fontMenu); BPopUpMenu* schemesPopUp = _MakeColorSchemeMenu(MSG_COLOR_SCHEME_CHANGED, gPredefinedColorSchemes, gPredefinedColorSchemes[0]); @@ -134,14 +129,12 @@ AppearancePrefView::AppearancePrefView(const char* name, .Add(fTabTitle->CreateTextViewLayoutItem(), 1, 0) .Add(fWindowTitle->CreateLabelLayoutItem(), 0, 1) .Add(fWindowTitle->CreateTextViewLayoutItem(), 1, 1) - .Add(fFont->CreateLabelLayoutItem(), 0, 2) - .Add(fFont->CreateMenuBarLayoutItem(), 1, 2) - .Add(fFontSize->CreateLabelLayoutItem(), 0, 3) - .Add(fFontSize->CreateMenuBarLayoutItem(), 1, 3) - .Add(fColorSchemeField->CreateLabelLayoutItem(), 0, 4) - .Add(fColorSchemeField->CreateMenuBarLayoutItem(), 1, 4) - .Add(fColorField->CreateLabelLayoutItem(), 0, 5) - .Add(fColorField->CreateMenuBarLayoutItem(), 1, 5) + .Add(fFontField->CreateLabelLayoutItem(), 0, 2) + .Add(fFontField->CreateMenuBarLayoutItem(), 1, 2) + .Add(fColorSchemeField->CreateLabelLayoutItem(), 0, 3) + .Add(fColorSchemeField->CreateMenuBarLayoutItem(), 1, 3) + .Add(fColorField->CreateLabelLayoutItem(), 0, 4) + .Add(fColorField->CreateMenuBarLayoutItem(), 1, 4) .End() .AddGlue() .Add(fColorControl = new BColorControl(BPoint(10, 10), @@ -151,8 +144,7 @@ AppearancePrefView::AppearancePrefView(const char* name, fTabTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); fWindowTitle->SetAlignment(B_ALIGN_RIGHT, B_ALIGN_LEFT); - fFont->SetAlignment(B_ALIGN_RIGHT); - fFontSize->SetAlignment(B_ALIGN_RIGHT); + fFontField->SetAlignment(B_ALIGN_RIGHT); fColorField->SetAlignment(B_ALIGN_RIGHT); fColorSchemeField->SetAlignment(B_ALIGN_RIGHT); @@ -190,20 +182,23 @@ AppearancePrefView::GetPreferredSize(float* _width, float* _height) void AppearancePrefView::Revert() { - fTabTitle->SetText(PrefHandler::Default()->getString(PREF_TAB_TITLE)); - fWindowTitle->SetText(PrefHandler::Default()->getString(PREF_WINDOW_TITLE)); + PrefHandler* pref = PrefHandler::Default(); - 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)); fColorSchemeField->Menu()->ItemAt(0)->SetMarked(true); - fColorControl->SetValue(PrefHandler::Default()-> + fColorControl->SetValue(pref-> getRGB(PREF_TEXT_FORE_COLOR)); - fFont->Menu()->FindItem(PrefHandler::Default()->getString( - PREF_HALF_FONT_FAMILY))->SetMarked(true); - fFontSize->Menu()->FindItem(PrefHandler::Default()->getString( - PREF_HALF_FONT_FAMILY))->SetMarked(true); + const char* family = pref->getString(PREF_HALF_FONT_FAMILY); + const char* style = pref->getString(PREF_HALF_FONT_STYLE); + const char* size = pref->getString(PREF_HALF_FONT_SIZE); + + _MarkSelectedFont(family, style, size); } @@ -215,8 +210,14 @@ AppearancePrefView::AttachedToWindow() fBlinkCursor->SetTarget(this); fWarnOnExit->SetTarget(this); - fFontSize->Menu()->SetTargetForItems(this); - fFont->Menu()->SetTargetForItems(this); + fFontField->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); fColorField->Menu()->SetTargetForItems(this); @@ -232,6 +233,7 @@ AppearancePrefView::AttachedToWindow() void + AppearancePrefView::MessageReceived(BMessage* msg) { bool modified = false; @@ -241,34 +243,33 @@ AppearancePrefView::MessageReceived(BMessage* msg) { const char* family = NULL; const char* style = NULL; - msg->FindString("font_family", &family); - msg->FindString("font_style", &style); + const char* size = NULL; + 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(); const char* currentFamily = pref->getString(PREF_HALF_FONT_FAMILY); const char* currentStyle = pref->getString(PREF_HALF_FONT_STYLE); + const char* currentSize + = pref->getString(PREF_HALF_FONT_SIZE); + 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_STYLE, style); + pref->setString(PREF_HALF_FONT_SIZE, size); + _MarkSelectedFont(family, style, size); modified = true; } 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: { rgb_color oldColor = PrefHandler::Default()->getRGB( @@ -431,13 +432,17 @@ AppearancePrefView::_MakeFontMenu(uint32 command, font.SetFamilyAndStyle(family, style); if (IsFontUsable(font)) { BMessage* message = new BMessage(command); + const char* size + = PrefHandler::Default()->getString(PREF_HALF_FONT_SIZE); message->AddString("font_family", family); message->AddString("font_style", style); - char itemLabel[134]; - snprintf(itemLabel, sizeof(itemLabel), + message->AddString("font_size", size); + char fontMenuLabel[134]; + snprintf(fontMenuLabel, sizeof(fontMenuLabel), "%s - %s", family, style); - BMenuItem* item = new BMenuItem(itemLabel, - message); + BMenu* fontSizeMenu = _MakeFontSizeMenu(fontMenuLabel, + MSG_HALF_FONT_CHANGED, family, style, size); + BMenuItem* item = new BMenuItem(fontSizeMenu, message); menu->AddItem(item); if (strcmp(defaultFamily, family) == 0 && strcmp(defaultStyle, style) == 0) @@ -456,22 +461,27 @@ AppearancePrefView::_MakeFontMenu(uint32 command, /*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}; bool found = false; for (uint32 i = 0; sizes[i]; i++) { - BString string; - string << sizes[i]; - - BMenuItem* item = new BMenuItem(string.String(), - new BMessage(command)); + BString fontSize; + fontSize << sizes[i]; + BMessage* message = new BMessage(command); + message->AddString("font_family", family); + message->AddString("font_style", style); + message->AddString("font_size", fontSize.String()); + BMenuItem* item = new BMenuItem(fontSize.String(), message); menu->AddItem(item); - - if (sizes[i] == defaultSize) { + if (sizes[i] == atoi(size)) { item->SetMarked(true); found = true; } @@ -479,11 +489,12 @@ AppearancePrefView::_MakeFontSizeMenu(uint32 command, uint8 defaultSize) if (!found) { for (uint32 i = 0; sizes[i]; i++) { - if (sizes[i] > defaultSize) { - BString string; - string << defaultSize; - BMenuItem* item = new BMenuItem(string.String(), - new BMessage(command)); + if (sizes[i] > atoi(size)) { + BMessage* message = new BMessage(command); + message->AddString("font_family", family); + message->AddString("font_style", style); + message->AddString("font_size", size); + BMenuItem* item = new BMenuItem(size, message); item->SetMarked(true); menu->AddItem(item, i); break; @@ -543,3 +554,28 @@ AppearancePrefView::_MakeColorSchemeMenu(uint32 msg, const color_scheme** items, } 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); + } +} diff --git a/src/apps/terminal/AppearPrefView.h b/src/apps/terminal/AppearPrefView.h index e76dab6355..7f9f170fd6 100644 --- a/src/apps/terminal/AppearPrefView.h +++ b/src/apps/terminal/AppearPrefView.h @@ -62,8 +62,11 @@ private: static BMenu* _MakeFontMenu(uint32 command, const char* defaultFamily, const char* defaultStyle); - static BMenu* _MakeFontSizeMenu(uint32 command, - uint8 defaultSize); + static BMenu* _MakeFontSizeMenu(const char* label, + uint32 command, + const char* family, + const char* style, + const char* size); static BPopUpMenu* _MakeMenu(uint32 msg, const char** items, const char* defaultItem); @@ -72,10 +75,12 @@ private: const color_scheme** schemes, const color_scheme* defaultItemName); + void _MarkSelectedFont(const char* family, + const char* style, const char* size); + BCheckBox* fBlinkCursor; BCheckBox* fWarnOnExit; - BMenuField* fFont; - BMenuField* fFontSize; + BMenuField* fFontField; BMenuField* fColorSchemeField; BMenuField* fColorField; diff --git a/src/apps/terminal/TermWindow.cpp b/src/apps/terminal/TermWindow.cpp index b01dab238a..e93d4c5392 100644 --- a/src/apps/terminal/TermWindow.cpp +++ b/src/apps/terminal/TermWindow.cpp @@ -803,7 +803,7 @@ TermWindow::MessageReceived(BMessage *message) view->GetTermFont(&font); int32 size; - if (message->FindInt32("font size", &size) != B_OK) + if (message->FindInt32("font_size", &size) != B_OK) break; // mark the font size menu item @@ -1639,7 +1639,7 @@ TermWindow::_MakeFontSizeMenu(uint32 command, uint8 defaultSize) BString string; string << sizes[i]; BMessage* message = new BMessage(command); - message->AddInt32("font size", sizes[i]); + message->AddInt32("font_size", sizes[i]); BMenuItem* item = new BMenuItem(string.String(), message); menu->AddItem(item); if (sizes[i] == defaultSize) { @@ -1654,7 +1654,7 @@ TermWindow::_MakeFontSizeMenu(uint32 command, uint8 defaultSize) BString string; string << defaultSize; BMessage* message = new BMessage(command); - message->AddInt32("font size", sizes[i]); + message->AddInt32("font_size", sizes[i]); BMenuItem* item = new BMenuItem(string.String(), message); item->SetMarked(true); menu->AddItem(item, i);