diff options
Diffstat (limited to 'include/views/SkOSMenu.h')
-rw-r--r-- | include/views/SkOSMenu.h | 194 |
1 files changed, 161 insertions, 33 deletions
diff --git a/include/views/SkOSMenu.h b/include/views/SkOSMenu.h index 433a601..0c4a619 100644 --- a/include/views/SkOSMenu.h +++ b/include/views/SkOSMenu.h @@ -1,19 +1,12 @@ + /* - * Copyright (C) 2006 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2006 The Android Open Source Project * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * 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 @@ -22,30 +15,165 @@ class SkOSMenu { public: - explicit SkOSMenu(const char title[]); + explicit SkOSMenu(const char title[] = ""); ~SkOSMenu(); - - const char* getTitle() const { return fTitle; } - - void appendItem(const char title[], const char eventType[], int32_t eventData); - - // called by SkOSWindow when it receives an OS menu event - int countItems() const; - const char* getItem(int index, uint32_t* cmdID) const; - - SkEvent* createEvent(uint32_t os_cmd); - -private: - const char* fTitle; - - struct Item { - const char* fTitle; - const char* fEventType; - uint32_t fEventData; - uint32_t fOSCmd; // internal + + /** + * 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 }; - SkTDArray<Item> fItems; + + 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&); |