| |
| /* |
| * Copyright 2006 The Android Open Source Project |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| |
| #ifndef SkOSMenu_DEFINED |
| #define SkOSMenu_DEFINED |
| |
| #include "SkEvent.h" |
| #include "SkTDArray.h" |
| |
| class SkOSMenu { |
| public: |
| explicit SkOSMenu(const char title[] = ""); |
| ~SkOSMenu(); |
| |
| /** |
| * Each of these (except action) has an associated value, which is stored in |
| * the event payload for the item. |
| * Each type has a specific type for its value... |
| * Action : none |
| * List : int (selected index) |
| * Segmented : int (selected index) |
| * Slider : float |
| * Switch : bool |
| * TextField : string |
| * TriState : TriState |
| * Custom : custom object/value |
| */ |
| enum Type { |
| kAction_Type, |
| kList_Type, |
| kSlider_Type, |
| kSwitch_Type, |
| kTriState_Type, |
| kTextField_Type, |
| kCustom_Type |
| }; |
| |
| enum TriState { |
| kMixedState = -1, |
| kOffState = 0, |
| kOnState = 1 |
| }; |
| |
| class Item { |
| public: |
| /** |
| * Auto increments a global to generate an unique ID for each new item |
| * Note: Thread safe |
| */ |
| Item(const char label[], SkOSMenu::Type type, const char slotName[], |
| SkEvent* evt); |
| ~Item() { delete fEvent; } |
| |
| SkEvent* getEvent() const { return fEvent; } |
| int getID() const { return fID; } |
| const char* getLabel() const { return fLabel.c_str(); } |
| const char* getSlotName() const { return fSlotName.c_str(); } |
| Type getType() const { return fType; } |
| void setKeyEquivalent(SkUnichar key) { fKey = key; } |
| SkUnichar getKeyEquivalent() const { return fKey; } |
| |
| /** |
| * Helper functions for predefined types |
| */ |
| void setBool(bool value) const; //For Switch |
| void setScalar(SkScalar value) const; //For Slider |
| void setInt(int value) const; //For List |
| void setTriState(TriState value) const; //For Tristate |
| void setString(const char value[]) const; //For TextField |
| |
| /** |
| * Post event associated with the menu item to target, any changes to |
| * the associated event must be made prior to calling this method |
| */ |
| void postEvent() const { (new SkEvent(*(fEvent)))->post(); } |
| |
| private: |
| int fID; |
| SkEvent* fEvent; |
| SkString fLabel; |
| SkString fSlotName; |
| Type fType; |
| SkUnichar fKey; |
| }; |
| |
| void reset(); |
| const char* getTitle() const { return fTitle.c_str(); } |
| void setTitle (const char title[]) { fTitle.set(title); } |
| int getCount() const { return fItems.count(); } |
| const Item* getItemByID(int itemID) const; |
| void getItems(const Item* items[]) const; |
| |
| /** |
| * Assign key to the menu item with itemID, will do nothing if there's no |
| * item with the id given |
| */ |
| void assignKeyEquivalentToItem(int itemID, SkUnichar key); |
| /** |
| * Call this in a SkView's onHandleChar to trigger any menu items with the |
| * given key equivalent. If such an item is found, the method will return |
| * true and its corresponding event will be triggered (default behavior |
| * defined for switches(toggling), tristates(cycle), and lists(cycle), |
| * for anything else, the event attached is posted without state changes) |
| * If no menu item can be matched with the key, false will be returned |
| */ |
| bool handleKeyEquivalent(SkUnichar key); |
| |
| /** |
| * The following functions append new items to the menu and returns their |
| * associated unique id, which can be used to by the client to refer to |
| * the menu item created and change its state. slotName specifies the string |
| * identifier of any state/value to be returned in the item's SkEvent object |
| * NOTE: evt must be dynamically allocated |
| */ |
| int appendItem(const char label[], Type type, const char slotName[], |
| SkEvent* evt); |
| |
| /** |
| * Create predefined items with the given parameters. To be used with the |
| * other helper functions below to retrive/update state information. |
| * Note: the helper functions below assume that slotName is UNIQUE for all |
| * menu items of the same type since it's used to identify the event |
| */ |
| int appendAction(const char label[], SkEventSinkID target); |
| int appendList(const char label[], const char slotName[], |
| SkEventSinkID target, int defaultIndex, const char[] ...); |
| int appendSlider(const char label[], const char slotName[], |
| SkEventSinkID target, SkScalar min, SkScalar max, |
| SkScalar defaultValue); |
| int appendSwitch(const char label[], const char slotName[], |
| SkEventSinkID target, bool defaultState = false); |
| int appendTriState(const char label[], const char slotName[], |
| SkEventSinkID target, TriState defaultState = kOffState); |
| int appendTextField(const char label[], const char slotName[], |
| SkEventSinkID target, const char placeholder[] = ""); |
| |
| |
| /** |
| * Helper functions to retrieve information other than the stored value for |
| * some predefined types |
| */ |
| static bool FindListItemCount(const SkEvent& evt, int* count); |
| /** |
| * Ensure that the items array can store n SkStrings where n is the count |
| * extracted using FindListItemCount |
| */ |
| static bool FindListItems(const SkEvent& evt, SkString items[]); |
| static bool FindSliderMin(const SkEvent& evt, SkScalar* min); |
| static bool FindSliderMax(const SkEvent& evt, SkScalar* max); |
| |
| /** |
| * Returns true if an action with the given label is found, false otherwise |
| */ |
| static bool FindAction(const SkEvent& evt, const char label[]); |
| /** |
| * The following helper functions will return true if evt is generated from |
| * a predefined item type and retrieve the corresponding state information. |
| * They will return false and leave value unchanged if there's a type |
| * mismatch or slotName is incorrect |
| */ |
| static bool FindListIndex(const SkEvent& evt, const char slotName[], int* value); |
| static bool FindSliderValue(const SkEvent& evt, const char slotName[], SkScalar* value); |
| static bool FindSwitchState(const SkEvent& evt, const char slotName[], bool* value); |
| static bool FindTriState(const SkEvent& evt, const char slotName[], TriState* value); |
| static bool FindText(const SkEvent& evt, const char slotName[], SkString* value); |
| |
| private: |
| SkString fTitle; |
| SkTDArray<Item*> fItems; |
| |
| // illegal |
| SkOSMenu(const SkOSMenu&); |
| SkOSMenu& operator=(const SkOSMenu&); |
| }; |
| |
| #endif |
| |