Ticket #254: menu.diff

File menu.diff, 16.0 KB (added by aldeck, 17 years ago)

Menu preflet should behave correctly with this.

  • src/preferences/menu/ColorWindow.cpp

     
    99
    1010
    1111#include "ColorWindow.h"
     12#include "MenuSettings.h"
    1213#include "msg.h"
    1314
    1415#include <Application.h>
     
    2223        B_NOT_ZOOMABLE | B_NOT_RESIZABLE),
    2324    fOwner(owner)
    2425{
    25     // Set and collect the variables for revert
    26     get_menu_info(&fInfo);
    27     get_menu_info(&fRevertInfo);
     26    fCurrentColor = MenuSettings::GetInstance()->BackgroundColor();
     27    fPreviousColor = MenuSettings::GetInstance()->PreviousBackgroundColor();
     28    fDefaultColor = MenuSettings::GetInstance()->DefaultBackgroundColor();
    2829
    2930    BView *topView = new BView(Bounds(), "topView", B_FOLLOW_ALL_SIDES, 0);
    3031    topView->SetViewColor(ui_color(B_PANEL_BACKGROUND_COLOR));
     
    3233
    3334    fColorControl = new BColorControl(BPoint(10, 10), B_CELLS_32x8,
    3435        9, "COLOR", new BMessage(MENU_COLOR), true);
    35     fColorControl->SetValue(fInfo.background_color);
     36    fColorControl->SetValue(fCurrentColor);
    3637    fColorControl->ResizeToPreferred();
    3738    topView->AddChild(fColorControl);
    3839
     
    4445        new BMessage(MENU_COLOR_DEFAULT), B_FOLLOW_LEFT | B_FOLLOW_TOP,
    4546        B_WILL_DRAW | B_NAVIGABLE);
    4647    fDefaultButton->ResizeToPreferred();
    47     fDefaultButton->SetEnabled(false);
     48    fDefaultButton->SetEnabled(fCurrentColor != fDefaultColor);
    4849    topView->AddChild(fDefaultButton);
    4950
    5051    rect.OffsetBy(fDefaultButton->Bounds().Width() + 10, 0);
     
    5253        new BMessage(MENU_REVERT), B_FOLLOW_LEFT | B_FOLLOW_TOP,
    5354        B_WILL_DRAW | B_NAVIGABLE);
    5455    fRevertButton->ResizeToPreferred();
    55     fRevertButton->SetEnabled(false);
     56    fRevertButton->SetEnabled(fCurrentColor != fPreviousColor);
    5657    topView->AddChild(fRevertButton);
    5758
    5859    ResizeTo(fColorControl->Bounds().Width() + 20, fRevertButton->Frame().bottom + 10);
     
    6869
    6970
    7071void
     72ColorWindow::_UpdateAndPost()
     73{
     74    fDefaultButton->SetEnabled(fCurrentColor != fDefaultColor);
     75    fRevertButton->SetEnabled(fCurrentColor != fPreviousColor);
     76   
     77    fCurrentColor = fColorControl->ValueAsColor();
     78       
     79    menu_info info;
     80    get_menu_info(&info);
     81    info.background_color = fCurrentColor;
     82    set_menu_info(&info);
     83   
     84    be_app->PostMessage(MENU_COLOR);   
     85}
     86
     87
     88void
    7189ColorWindow::MessageReceived(BMessage *msg)
    7290{
    7391    switch (msg->what) {
    7492        case MENU_REVERT:
    75             fColorControl->SetValue(fRevertInfo.background_color);
    76             fInfo.background_color = fColorControl->ValueAsColor();
    77             set_menu_info(&fInfo);
    78             be_app->PostMessage(UPDATE_WINDOW);
    79             fRevertButton->SetEnabled(false);
     93            fColorControl->SetValue(fPreviousColor);
     94            _UpdateAndPost();
    8095            break;
    8196
    82         case MENU_COLOR_DEFAULT:
    83             // change to system color for system wide
    84             // compatability
    85             rgb_color color;
    86             color.red = 216;
    87             color.blue = 216;
    88             color.green = 216;
    89             color.alpha = 255;
    90             fColorControl->SetValue(color);
    91             fDefaultButton->SetEnabled(false);
    92             get_menu_info(&fInfo);
    93             fInfo.background_color = fColorControl->ValueAsColor();
    94             set_menu_info(&fInfo);
    95             be_app->PostMessage(MENU_COLOR);
     97        case MENU_COLOR_DEFAULT:           
     98            fColorControl->SetValue(fDefaultColor);
     99            _UpdateAndPost();
    96100            break;
    97101
    98102        case MENU_COLOR:
    99             get_menu_info(&fInfo);
    100             fRevertInfo.background_color = fInfo.background_color;
    101             fInfo.background_color = fColorControl->ValueAsColor();
    102             set_menu_info(&fInfo);
    103             be_app->PostMessage(MENU_COLOR);
    104             fDefaultButton->SetEnabled(true);
    105             fRevertButton->SetEnabled(true);
     103            _UpdateAndPost();           
    106104            break;
    107105
    108106        default:
    109             be_app->PostMessage(UPDATE_WINDOW);
    110107            BWindow::MessageReceived(msg);
    111108            break;
    112109    }
  • src/preferences/menu/ColorWindow.h

     
    2727        virtual void Quit();
    2828        virtual void MessageReceived(BMessage* message);
    2929
     30    private:
     31        void        _UpdateAndPost();
     32
    3033    private:   
    31         BColorControl*      fColorControl;
     34        BColorControl*  fColorControl;
    3235        BButton*        fDefaultButton;
    33         BButton*        fRevertButton;
    34         menu_info       fRevertInfo;
    35         menu_info       fInfo;
     36        BButton*        fRevertButton;     
     37        rgb_color       fCurrentColor;
     38        rgb_color       fPreviousColor;
     39        rgb_color       fDefaultColor; 
    3640        BMessenger      fOwner;
    3741};
    3842
  • src/preferences/menu/MenuBar.cpp

     
    2020#include <TranslationUtils.h>   
    2121#include <Window.h>
    2222
    23 #include <stdio.h>
    24 #include <stdlib.h>
    2523
    26 
    2724MenuBar::MenuBar()
    2825    : BMenuBar(BRect(40, 10, 10, 10), "menu", B_FOLLOW_TOP | B_FRAME_EVENTS,
    2926        B_ITEMS_IN_COLUMN, true)
    3027{
    31     _BuildMenu();
    32     UpdateMenu();
     28    _BuildMenu();   
    3329    SetItemMargins(14.0, 2.0, 20.0, 0.0);
    3430}
    3531
     
    8177
    8278
    8379void
    84 MenuBar::UpdateMenu()
     80MenuBar::Update()
    8581{
    8682    menu_info info;
    8783    MenuSettings::GetInstance()->Get(info);
    8884
    8985    fAlwaysShowTriggersItem->SetMarked(info.triggers_always_shown);
    9086
    91     key_map *keys;
    92     char* chars;
    93     get_key_map(&keys, &chars);
    94 
    95     bool altAsShortcut = (keys->left_command_key == 0x5d)
    96         && (keys->right_command_key == 0x5f);
    97 
    98     free(chars);
    99     free(keys);
    100 
     87    bool altAsShortcut = MenuSettings::GetInstance()->AltAsShortcut();
    10188    fAltAsShortcutItem->SetMarked(altAsShortcut);
    10289    fControlAsShortcutItem->SetMarked(!altAsShortcut);
    103 }
    10490
    105 
    106 void
    107 MenuBar::Update()
    108 {
    109     UpdateMenu();
    110 
    11191    BFont font;
    11292    if (LockLooper()) {
    113         menu_info info;
    114         MenuSettings::GetInstance()->Get(info);
    115 
    11693        font.SetFamilyAndStyle(info.f_family, info.f_style);
    11794        font.SetSize(info.font_size);
    11895        SetFont(&font);
  • src/preferences/menu/MenuBar.h

     
    1818        MenuBar();
    1919
    2020        virtual void AttachedToWindow();
    21 
    22         void UpdateMenu();
     21               
    2322        void Update();
    2423        virtual void FrameResized(float width, float height);
    2524
  • src/preferences/menu/MenuSettings.cpp

     
    99
    1010
    1111#include "MenuSettings.h"
     12#include <Roster.h>
     13#include <Errors.h>
     14#include <stdio.h>
     15#include <stdlib.h>
    1216
    1317 
    1418MenuSettings::MenuSettings()
     
    1721    // would provide and execute this information, as it does
    1822    // for get_menu_info and set_menu_info (or is this information
    1923    // coming from libbe.so? or else where?).
    20     fDefaultSettings.font_size = 12;
    21     //info.f_family = "test";
    22     //info.f_style = "test";
    23     fDefaultSettings.background_color = ui_color(B_MENU_BACKGROUND_COLOR);
     24    fDefaultSettings.font_size = 12;   
     25    sprintf(fDefaultSettings.f_family,"%s","Bitstream Vera Sans");
     26    sprintf(fDefaultSettings.f_style,"%s","Roman");
     27    rgb_color color;
     28    color.red = 216;
     29    color.blue = 216;
     30    color.green = 216;
     31    color.alpha = 255;
     32    fDefaultSettings.background_color = color;//ui_color(B_MENU_BACKGROUND_COLOR);
    2433    fDefaultSettings.separator = 0;
    2534    fDefaultSettings.click_to_open = true;
    2635    fDefaultSettings.triggers_always_shown = false;
    27 
    28     fPreviousSettings = fDefaultSettings;
     36    fDefaultAltAsShortcut = true;
     37   
     38    get_menu_info(&fPreviousSettings);
     39    fPreviousAltAsShortcut = AltAsShortcut();
    2940}
    3041
    3142
     
    5566void
    5667MenuSettings::Set(menu_info &info)
    5768{
    58     get_menu_info(&fPreviousSettings);
    5969    set_menu_info(&info);
    6070}
    6171
    6272
     73bool
     74MenuSettings::AltAsShortcut() const
     75{
     76    key_map *keys;
     77    char* chars;
     78   
     79    get_key_map(&keys, &chars);
     80    bool altAsShortcut = (keys->left_command_key == 0x5d)
     81        && (keys->right_command_key == 0x5f);
     82
     83    free(chars);
     84    free(keys);
     85   
     86    return altAsShortcut;   
     87}
     88
     89
    6390void
     91MenuSettings::SetAltAsShortcut(bool altAsShortcut)
     92{
     93    if (altAsShortcut) {
     94        // This might not be the same for all keyboards
     95        set_modifier_key(B_LEFT_COMMAND_KEY, 0x5d);
     96        set_modifier_key(B_RIGHT_COMMAND_KEY, 0x5f);
     97        set_modifier_key(B_LEFT_CONTROL_KEY, 0x5c);
     98        set_modifier_key(B_RIGHT_OPTION_KEY, 0x60);
     99    } else {
     100        // This might not be the same for all keyboards
     101        set_modifier_key(B_LEFT_COMMAND_KEY, 0x5c);
     102        set_modifier_key(B_RIGHT_COMMAND_KEY, 0x60);
     103        set_modifier_key(B_LEFT_CONTROL_KEY, 0x5d);
     104        set_modifier_key(B_RIGHT_OPTION_KEY, 0x5f);
     105    }
     106    be_roster->Broadcast(new BMessage(B_MODIFIERS_CHANGED));   
     107}
     108
     109
     110void
    64111MenuSettings::Revert()
    65112{
    66113    set_menu_info(&fPreviousSettings);
     114    SetAltAsShortcut(fPreviousAltAsShortcut);
    67115}
    68116
    69117
    70118void
    71119MenuSettings::ResetToDefaults()
    72120{
    73     get_menu_info(&fPreviousSettings);
    74121    set_menu_info(&fDefaultSettings);
     122    SetAltAsShortcut(fDefaultAltAsShortcut);
    75123}
    76124
    77125
     126rgb_color
     127MenuSettings::BackgroundColor() const
     128{
     129    menu_info info;
     130    get_menu_info(&info);   
     131    return info.background_color;
     132}
     133
     134
     135rgb_color
     136MenuSettings::PreviousBackgroundColor() const
     137{
     138    return fPreviousSettings.background_color;
     139}
     140
     141
     142rgb_color
     143MenuSettings::DefaultBackgroundColor() const
     144{
     145    return fDefaultSettings.background_color;
     146}
     147
     148
    78149bool
    79150MenuSettings::IsDefaultable()
    80151{
     
    82153    get_menu_info(&info);
    83154
    84155    return info.font_size !=  fDefaultSettings.font_size
     156        || strcmp(info.f_family, fDefaultSettings.f_family) != 0
     157        || strcmp(info.f_style, fDefaultSettings.f_style) != 0
    85158        || info.background_color != fDefaultSettings.background_color
    86159        || info.separator != fDefaultSettings.separator
    87160        || info.click_to_open != fDefaultSettings.click_to_open
    88         || info.triggers_always_shown != fDefaultSettings.triggers_always_shown;
     161        || info.triggers_always_shown != fDefaultSettings.triggers_always_shown
     162        || AltAsShortcut() != fDefaultAltAsShortcut;
    89163}
    90164
     165
     166bool
     167MenuSettings::IsRevertable()
     168{
     169    menu_info info;
     170    get_menu_info(&info);
     171
     172    return info.font_size !=  fPreviousSettings.font_size
     173        || strcmp(info.f_family, fPreviousSettings.f_family) != 0
     174        || strcmp(info.f_style, fPreviousSettings.f_style) != 0
     175        || info.background_color != fPreviousSettings.background_color
     176        || info.separator != fPreviousSettings.separator
     177        || info.click_to_open != fPreviousSettings.click_to_open
     178        || info.triggers_always_shown != fPreviousSettings.triggers_always_shown
     179        || AltAsShortcut() != fPreviousAltAsShortcut;
     180}
     181
  • src/preferences/menu/MenuSettings.h

     
    1818
    1919        void Get(menu_info &info) const;
    2020        void Set(menu_info &info);
     21       
     22        bool        AltAsShortcut() const;
     23        void        SetAltAsShortcut(bool altAsShortcut);   
     24       
     25        rgb_color   BackgroundColor() const;       
     26        rgb_color   PreviousBackgroundColor() const;
     27        rgb_color   DefaultBackgroundColor() const;
     28   
    2129
    2230        void Revert();
    2331        void ResetToDefaults();
    2432        bool IsDefaultable();
    25 
     33        bool IsRevertable();
     34               
    2635    private:
    2736        MenuSettings();
    2837        ~MenuSettings();
    2938
    3039        menu_info fPreviousSettings;
    31         menu_info fDefaultSettings;
     40        menu_info fDefaultSettings;
     41        bool      fPreviousAltAsShortcut;
     42        bool      fDefaultAltAsShortcut;
    3243};
    3344
    3445#endif  // MENU_SETTINGS_H
  • src/preferences/menu/MenuWindow.cpp

     
    2020#include <Box.h>
    2121#include <Button.h>
    2222#include <MenuItem.h>
    23 #include <Roster.h>
    2423
    2524#include <stdio.h>
    2625#include <string.h>
     
    3130        B_NOT_ZOOMABLE | B_NOT_RESIZABLE | B_ASYNCHRONOUS_CONTROLS | B_QUIT_ON_WINDOW_CLOSE)
    3231{
    3332    fColorWindow = NULL;
     33   
     34    fSettings = MenuSettings::GetInstance();
    3435
    3536    BView* topView = new BView(Bounds(), "menuView", B_FOLLOW_ALL_SIDES,
    3637        B_WILL_DRAW);
     
    6061    topView->AddChild(fRevertButton);
    6162
    6263    topView->MakeFocus();
    63     fMenuBar->Update();
     64   
     65    _UpdateAll();
    6466}
    6567
    6668
    6769void
    6870MenuWindow::MessageReceived(BMessage *msg)
    6971{
    70     MenuSettings *settings = MenuSettings::GetInstance();
    7172    menu_info info;
    7273
    7374    switch (msg->what) {
    7475        case MENU_REVERT:
    75             settings->Revert();
    76 
    77             fRevertButton->SetEnabled(false);
    78             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    79             fMenuBar->Update();
     76            fSettings->Revert();
     77            _UpdateAll();
    8078            break;
    8179
    8280        case MENU_DEFAULT:
    83             settings->ResetToDefaults();
    84 
    85             fDefaultsButton->SetEnabled(false);
    86             fMenuBar->Update();
     81            fSettings->ResetToDefaults();
     82            _UpdateAll();
    8783            break;
    8884
    8985        case UPDATE_WINDOW:
    90             fMenuBar->Update();
     86            _UpdateAll();
    9187            break;
    9288
    9389        case MENU_FONT_FAMILY:
     
    9894            const font_style *style;
    9995            msg->FindString("style", (const char **)&style);
    10096
    101             settings->Get(info);
     97            fSettings->Get(info);
    10298            strlcpy(info.f_family, (const char *)family, B_FONT_FAMILY_LENGTH);
    10399            strlcpy(info.f_style, (const char *)style, B_FONT_STYLE_LENGTH);
    104             settings->Set(info);
     100            fSettings->Set(info);
    105101
    106             fRevertButton->SetEnabled(true);
    107             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    108             fMenuBar->Update();
     102            _UpdateAll();
    109103            break;
    110104        }
    111105
    112106        case MENU_FONT_SIZE:
    113             settings->Get(info);
     107            fSettings->Get(info);
    114108            msg->FindFloat("size", &info.font_size);
    115             settings->Set(info);
     109            fSettings->Set(info);
    116110
    117             fRevertButton->SetEnabled(true);
    118             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    119             fMenuBar->Update();
     111            _UpdateAll();
    120112            break;
    121113
    122114        case ALLWAYS_TRIGGERS_MSG:
    123             settings->Get(info);
     115            fSettings->Get(info);
    124116            info.triggers_always_shown = !info.triggers_always_shown;
    125             settings->Set(info);
     117            fSettings->Set(info);
    126118
    127             fRevertButton->SetEnabled(true);
    128             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    129             fMenuBar->UpdateMenu();
    130             fMenuBar->Update();
     119            _UpdateAll();
    131120            break;
    132121
    133         case CTL_MARKED_MSG:
    134             // This might not be the same for all keyboards
    135             set_modifier_key(B_LEFT_COMMAND_KEY, 0x5c);
    136             set_modifier_key(B_RIGHT_COMMAND_KEY, 0x60);
    137             set_modifier_key(B_LEFT_CONTROL_KEY, 0x5d);
    138             set_modifier_key(B_RIGHT_OPTION_KEY, 0x5f);
    139             be_roster->Broadcast(new BMessage(B_MODIFIERS_CHANGED));
    140 
    141             fRevertButton->SetEnabled(true);
    142             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    143             fMenuBar->Update();
     122        case CTL_MARKED_MSG:           
     123            fSettings->SetAltAsShortcut(false);
     124            _UpdateAll();
    144125            break;
    145126
    146127        case ALT_MARKED_MSG:
    147 
    148             // This might not be the same for all keyboards
    149             set_modifier_key(B_LEFT_COMMAND_KEY, 0x5d);
    150             set_modifier_key(B_RIGHT_COMMAND_KEY, 0x5f);
    151             set_modifier_key(B_LEFT_CONTROL_KEY, 0x5c);
    152             set_modifier_key(B_RIGHT_OPTION_KEY, 0x60);
    153 
    154             be_roster->Broadcast(new BMessage(B_MODIFIERS_CHANGED));
    155 
    156             fRevertButton->SetEnabled(true);
    157             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    158             fMenuBar->Update();
     128            fSettings->SetAltAsShortcut(true);         
     129            _UpdateAll();
    159130            break;
    160131
    161132        case COLOR_SCHEME_OPEN_MSG:
     
    170141            fColorWindow = NULL;
    171142            break;
    172143
    173         case MENU_COLOR:
    174             fRevertButton->SetEnabled(true);
    175             fDefaultsButton->SetEnabled(settings->IsDefaultable());
    176             fMenuBar->Update();
     144        case MENU_COLOR:           
     145            _UpdateAll();
    177146            break;
    178147
    179148        default:
     
    183152}
    184153
    185154
     155void
     156MenuWindow::_UpdateAll()
     157{
     158    fRevertButton->SetEnabled(fSettings->IsRevertable());
     159    fDefaultsButton->SetEnabled(fSettings->IsDefaultable());
     160    fMenuBar->Update();
     161}
     162
     163
    186164bool
    187165MenuWindow::QuitRequested()
    188166{
  • src/preferences/menu/MenuWindow.h

     
    1010#ifndef MENU_WINDOW_H
    1111#define MENU_WINDOW_H
    1212
    13 
     13#include "MenuSettings.h"
    1414#include <Menu.h>
    1515#include <Window.h>
    1616
     
    2020class MenuBar;
    2121class MenuWindow : public BWindow {
    2222    public:
    23         MenuWindow(BRect frame);
     23        MenuWindow(BRect frame);       
    2424       
    2525        virtual void MessageReceived(BMessage *message);
    2626        virtual bool QuitRequested();
    27 
     27       
     28    private:       
     29        void _UpdateAll();
     30       
    2831    private:   
    2932        ColorWindow*    fColorWindow;
    3033        MenuBar*        fMenuBar;
    3134        BButton*        fDefaultsButton;
    3235        BButton*        fRevertButton;
     36        MenuSettings*   fSettings;
    3337};
    3438
    3539#endif  // MENU_WINDOW_H