views: Support styling of menus (issue #2102)
This commit is contained in:
parent
b08f0ed713
commit
8fa8af357b
|
@ -301,6 +301,8 @@
|
||||||
'tests/cefclient/browser/temp_window_win.h',
|
'tests/cefclient/browser/temp_window_win.h',
|
||||||
'tests/cefclient/browser/views_menu_bar.cc',
|
'tests/cefclient/browser/views_menu_bar.cc',
|
||||||
'tests/cefclient/browser/views_menu_bar.h',
|
'tests/cefclient/browser/views_menu_bar.h',
|
||||||
|
'tests/cefclient/browser/views_style.cc',
|
||||||
|
'tests/cefclient/browser/views_style.h',
|
||||||
'tests/cefclient/browser/views_window.cc',
|
'tests/cefclient/browser/views_window.cc',
|
||||||
'tests/cefclient/browser/views_window.h',
|
'tests/cefclient/browser/views_window.h',
|
||||||
'tests/cefclient/browser/window_test_runner_views.cc',
|
'tests/cefclient/browser/window_test_runner_views.cc',
|
||||||
|
@ -354,6 +356,8 @@
|
||||||
'tests/cefclient/browser/temp_window_x11.h',
|
'tests/cefclient/browser/temp_window_x11.h',
|
||||||
'tests/cefclient/browser/views_menu_bar.cc',
|
'tests/cefclient/browser/views_menu_bar.cc',
|
||||||
'tests/cefclient/browser/views_menu_bar.h',
|
'tests/cefclient/browser/views_menu_bar.h',
|
||||||
|
'tests/cefclient/browser/views_style.cc',
|
||||||
|
'tests/cefclient/browser/views_style.h',
|
||||||
'tests/cefclient/browser/views_window.cc',
|
'tests/cefclient/browser/views_window.cc',
|
||||||
'tests/cefclient/browser/views_window.h',
|
'tests/cefclient/browser/views_window.h',
|
||||||
'tests/cefclient/browser/window_test_runner_gtk.cc',
|
'tests/cefclient/browser/window_test_runner_gtk.cc',
|
||||||
|
|
|
@ -384,6 +384,73 @@ typedef struct _cef_menu_model_t {
|
||||||
int (CEF_CALLBACK *get_accelerator_at)(struct _cef_menu_model_t* self,
|
int (CEF_CALLBACK *get_accelerator_at)(struct _cef_menu_model_t* self,
|
||||||
int index, int* key_code, int* shift_pressed, int* ctrl_pressed,
|
int index, int* key_code, int* shift_pressed, int* ctrl_pressed,
|
||||||
int* alt_pressed);
|
int* alt_pressed);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Set the explicit color for |command_id| and |color_type| to |color|.
|
||||||
|
// Specify a |color| value of 0 to remove the explicit color. If no explicit
|
||||||
|
// color or default color is set for |color_type| then the system color will
|
||||||
|
// be used. Returns true (1) on success.
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *set_color)(struct _cef_menu_model_t* self, int command_id,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t color);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Set the explicit color for |command_id| and |index| to |color|. Specify a
|
||||||
|
// |color| value of 0 to remove the explicit color. Specify an |index| value
|
||||||
|
// of -1 to set the default color for items that do not have an explicit color
|
||||||
|
// set. If no explicit color or default color is set for |color_type| then the
|
||||||
|
// system color will be used. Returns true (1) on success.
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *set_color_at)(struct _cef_menu_model_t* self, int index,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t color);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Returns in |color| the color that was explicitly set for |command_id| and
|
||||||
|
// |color_type|. If a color was not set then 0 will be returned in |color|.
|
||||||
|
// Returns true (1) on success.
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *get_color)(struct _cef_menu_model_t* self, int command_id,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t* color);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Returns in |color| the color that was explicitly set for |command_id| and
|
||||||
|
// |color_type|. Specify an |index| value of -1 to return the default color in
|
||||||
|
// |color|. If a color was not set then 0 will be returned in |color|. Returns
|
||||||
|
// true (1) on success.
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *get_color_at)(struct _cef_menu_model_t* self, int index,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t* color);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Sets the font list for the specified |command_id|. If |font_list| is NULL
|
||||||
|
// the system font will be used. Returns true (1) on success. The format is
|
||||||
|
// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a comma-
|
||||||
|
// separated list of font family names, - STYLES is an optional space-
|
||||||
|
// separated list of style names (case-sensitive
|
||||||
|
// "Bold" and "Italic" are supported), and
|
||||||
|
// - SIZE is an integer font size in pixels with the suffix "px".
|
||||||
|
//
|
||||||
|
// Here are examples of valid font description strings: - "Arial, Helvetica,
|
||||||
|
// Bold Italic 14px" - "Arial, 14px"
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *set_font_list)(struct _cef_menu_model_t* self,
|
||||||
|
int command_id, const cef_string_t* font_list);
|
||||||
|
|
||||||
|
///
|
||||||
|
// Sets the font list for the specified |index|. Specify an |index| value of
|
||||||
|
// -1 to set the default font. If |font_list| is NULL the system font will be
|
||||||
|
// used. Returns true (1) on success. The format is
|
||||||
|
// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where: - FONT_FAMILY_LIST is a comma-
|
||||||
|
// separated list of font family names, - STYLES is an optional space-
|
||||||
|
// separated list of style names (case-sensitive
|
||||||
|
// "Bold" and "Italic" are supported), and
|
||||||
|
// - SIZE is an integer font size in pixels with the suffix "px".
|
||||||
|
//
|
||||||
|
// Here are examples of valid font description strings: - "Arial, Helvetica,
|
||||||
|
// Bold Italic 14px" - "Arial, 14px"
|
||||||
|
///
|
||||||
|
int (CEF_CALLBACK *set_font_list_at)(struct _cef_menu_model_t* self,
|
||||||
|
int index, const cef_string_t* font_list);
|
||||||
} cef_menu_model_t;
|
} cef_menu_model_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -411,6 +411,85 @@ class CefMenuModel : public virtual CefBaseRefCounted {
|
||||||
bool& shift_pressed,
|
bool& shift_pressed,
|
||||||
bool& ctrl_pressed,
|
bool& ctrl_pressed,
|
||||||
bool& alt_pressed) =0;
|
bool& alt_pressed) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Set the explicit color for |command_id| and |color_type| to |color|.
|
||||||
|
// Specify a |color| value of 0 to remove the explicit color. If no explicit
|
||||||
|
// color or default color is set for |color_type| then the system color will
|
||||||
|
// be used. Returns true on success.
|
||||||
|
///
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual bool SetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Set the explicit color for |command_id| and |index| to |color|. Specify a
|
||||||
|
// |color| value of 0 to remove the explicit color. Specify an |index| value
|
||||||
|
// of -1 to set the default color for items that do not have an explicit
|
||||||
|
// color set. If no explicit color or default color is set for |color_type|
|
||||||
|
// then the system color will be used. Returns true on success.
|
||||||
|
///
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual bool SetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Returns in |color| the color that was explicitly set for |command_id| and
|
||||||
|
// |color_type|. If a color was not set then 0 will be returned in |color|.
|
||||||
|
// Returns true on success.
|
||||||
|
///
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual bool GetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Returns in |color| the color that was explicitly set for |command_id| and
|
||||||
|
// |color_type|. Specify an |index| value of -1 to return the default color
|
||||||
|
// in |color|. If a color was not set then 0 will be returned in |color|.
|
||||||
|
// Returns true on success.
|
||||||
|
///
|
||||||
|
/*--cef()--*/
|
||||||
|
virtual bool GetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Sets the font list for the specified |command_id|. If |font_list| is empty
|
||||||
|
// the system font will be used. Returns true on success. The format is
|
||||||
|
// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
|
||||||
|
// - FONT_FAMILY_LIST is a comma-separated list of font family names,
|
||||||
|
// - STYLES is an optional space-separated list of style names (case-sensitive
|
||||||
|
// "Bold" and "Italic" are supported), and
|
||||||
|
// - SIZE is an integer font size in pixels with the suffix "px".
|
||||||
|
//
|
||||||
|
// Here are examples of valid font description strings:
|
||||||
|
// - "Arial, Helvetica, Bold Italic 14px"
|
||||||
|
// - "Arial, 14px"
|
||||||
|
///
|
||||||
|
/*--cef(optional_param=font_list)--*/
|
||||||
|
virtual bool SetFontList(int command_id,
|
||||||
|
const CefString& font_list) =0;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Sets the font list for the specified |index|. Specify an |index| value of
|
||||||
|
// -1 to set the default font. If |font_list| is empty the system font will
|
||||||
|
// be used. Returns true on success. The format is
|
||||||
|
// "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
|
||||||
|
// - FONT_FAMILY_LIST is a comma-separated list of font family names,
|
||||||
|
// - STYLES is an optional space-separated list of style names (case-sensitive
|
||||||
|
// "Bold" and "Italic" are supported), and
|
||||||
|
// - SIZE is an integer font size in pixels with the suffix "px".
|
||||||
|
//
|
||||||
|
// Here are examples of valid font description strings:
|
||||||
|
// - "Arial, Helvetica, Bold Italic 14px"
|
||||||
|
// - "Arial, 14px"
|
||||||
|
///
|
||||||
|
/*--cef(optional_param=font_list)--*/
|
||||||
|
virtual bool SetFontListAt(int index,
|
||||||
|
const CefString& font_list) =0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CEF_INCLUDE_CEF_MENU_MODEL_H_
|
#endif // CEF_INCLUDE_CEF_MENU_MODEL_H_
|
||||||
|
|
|
@ -2732,6 +2732,19 @@ typedef enum {
|
||||||
CEF_MENU_ANCHOR_BOTTOMCENTER,
|
CEF_MENU_ANCHOR_BOTTOMCENTER,
|
||||||
} cef_menu_anchor_position_t;
|
} cef_menu_anchor_position_t;
|
||||||
|
|
||||||
|
///
|
||||||
|
// Supported color types for menu items.
|
||||||
|
///
|
||||||
|
typedef enum {
|
||||||
|
CEF_MENU_COLOR_TEXT,
|
||||||
|
CEF_MENU_COLOR_TEXT_HOVERED,
|
||||||
|
CEF_MENU_COLOR_TEXT_ACCELERATOR,
|
||||||
|
CEF_MENU_COLOR_TEXT_ACCELERATOR_HOVERED,
|
||||||
|
CEF_MENU_COLOR_BACKGROUND,
|
||||||
|
CEF_MENU_COLOR_BACKGROUND_HOVERED,
|
||||||
|
CEF_MENU_COLOR_COUNT,
|
||||||
|
} cef_menu_color_type_t;
|
||||||
|
|
||||||
// Supported SSL version values. See net/ssl/ssl_connection_status_flags.h
|
// Supported SSL version values. See net/ssl/ssl_connection_status_flags.h
|
||||||
// for more information.
|
// for more information.
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -19,6 +19,10 @@
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
const int kSeparatorId = -1;
|
const int kSeparatorId = -1;
|
||||||
|
const int kInvalidGroupId = -1;
|
||||||
|
const int kInvalidCommandId = -1;
|
||||||
|
const int kDefaultIndex = -1;
|
||||||
|
const int kInvalidIndex = -2;
|
||||||
|
|
||||||
// A simple MenuModel implementation that delegates to CefMenuModelImpl.
|
// A simple MenuModel implementation that delegates to CefMenuModelImpl.
|
||||||
class CefSimpleMenuModel : public ui::MenuModel {
|
class CefSimpleMenuModel : public ui::MenuModel {
|
||||||
|
@ -73,6 +77,10 @@ class CefSimpleMenuModel : public ui::MenuModel {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gfx::FontList* GetLabelFontListAt(int index) const override {
|
||||||
|
return impl_->GetLabelFontListAt(index);
|
||||||
|
}
|
||||||
|
|
||||||
bool GetAcceleratorAt(int index,
|
bool GetAcceleratorAt(int index,
|
||||||
ui::Accelerator* accelerator) const override {
|
ui::Accelerator* accelerator) const override {
|
||||||
int key_code = 0;
|
int key_code = 0;
|
||||||
|
@ -151,6 +159,24 @@ class CefSimpleMenuModel : public ui::MenuModel {
|
||||||
impl_->UnhandledCloseSubmenu(is_rtl);
|
impl_->UnhandledCloseSubmenu(is_rtl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool GetTextColor(int index,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const override {
|
||||||
|
return impl_->GetTextColor(index, false, is_hovered, override_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetMinorTextColor(int index,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const override {
|
||||||
|
return impl_->GetTextColor(index, true, is_hovered, override_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GetBackgroundColor(int index,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const override {
|
||||||
|
return impl_->GetBackgroundColor(index, is_hovered, override_color);
|
||||||
|
}
|
||||||
|
|
||||||
void MenuWillShow() override {
|
void MenuWillShow() override {
|
||||||
impl_->MenuWillShow();
|
impl_->MenuWillShow();
|
||||||
}
|
}
|
||||||
|
@ -175,6 +201,22 @@ class CefSimpleMenuModel : public ui::MenuModel {
|
||||||
DISALLOW_COPY_AND_ASSIGN(CefSimpleMenuModel);
|
DISALLOW_COPY_AND_ASSIGN(CefSimpleMenuModel);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
cef_menu_color_type_t GetMenuColorType(bool is_text,
|
||||||
|
bool is_accelerator,
|
||||||
|
bool is_hovered) {
|
||||||
|
if (is_text) {
|
||||||
|
if (is_accelerator) {
|
||||||
|
return is_hovered ? CEF_MENU_COLOR_TEXT_ACCELERATOR_HOVERED :
|
||||||
|
CEF_MENU_COLOR_TEXT_ACCELERATOR;
|
||||||
|
}
|
||||||
|
return is_hovered ? CEF_MENU_COLOR_TEXT_HOVERED : CEF_MENU_COLOR_TEXT;
|
||||||
|
}
|
||||||
|
|
||||||
|
DCHECK(!is_accelerator);
|
||||||
|
return is_hovered ? CEF_MENU_COLOR_BACKGROUND_HOVERED :
|
||||||
|
CEF_MENU_COLOR_BACKGROUND;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
// static
|
// static
|
||||||
|
@ -198,15 +240,7 @@ struct CefMenuModelImpl::Item {
|
||||||
: type_(type),
|
: type_(type),
|
||||||
command_id_(command_id),
|
command_id_(command_id),
|
||||||
label_(label),
|
label_(label),
|
||||||
group_id_(group_id),
|
group_id_(group_id) {
|
||||||
enabled_(true),
|
|
||||||
visible_(true),
|
|
||||||
checked_(false),
|
|
||||||
has_accelerator_(false),
|
|
||||||
key_code_(0),
|
|
||||||
shift_pressed_(false),
|
|
||||||
ctrl_pressed_(false),
|
|
||||||
alt_pressed_(false) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Basic information.
|
// Basic information.
|
||||||
|
@ -217,16 +251,20 @@ struct CefMenuModelImpl::Item {
|
||||||
CefRefPtr<CefMenuModelImpl> submenu_;
|
CefRefPtr<CefMenuModelImpl> submenu_;
|
||||||
|
|
||||||
// State information.
|
// State information.
|
||||||
bool enabled_;
|
bool enabled_ = true;
|
||||||
bool visible_;
|
bool visible_ = true;
|
||||||
bool checked_;
|
bool checked_ = false;
|
||||||
|
|
||||||
// Accelerator information.
|
// Accelerator information.
|
||||||
bool has_accelerator_;
|
bool has_accelerator_ = false;
|
||||||
int key_code_;
|
int key_code_ = 0;
|
||||||
bool shift_pressed_;
|
bool shift_pressed_ = false;
|
||||||
bool ctrl_pressed_;
|
bool ctrl_pressed_ = false;
|
||||||
bool alt_pressed_;
|
bool alt_pressed_ = false;
|
||||||
|
|
||||||
|
cef_color_t colors_[CEF_MENU_COLOR_COUNT] = {0};
|
||||||
|
gfx::FontList font_list_;
|
||||||
|
bool has_font_list_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -270,7 +308,8 @@ bool CefMenuModelImpl::AddSeparator() {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
AppendItem(Item(MENUITEMTYPE_SEPARATOR, kSeparatorId, CefString(), -1));
|
AppendItem(Item(MENUITEMTYPE_SEPARATOR, kSeparatorId, CefString(),
|
||||||
|
kInvalidGroupId));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -278,7 +317,8 @@ bool CefMenuModelImpl::AddItem(int command_id, const CefString& label) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
AppendItem(Item(MENUITEMTYPE_COMMAND, command_id, label, -1));
|
AppendItem(Item(MENUITEMTYPE_COMMAND, command_id, label,
|
||||||
|
kInvalidGroupId));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -286,7 +326,7 @@ bool CefMenuModelImpl::AddCheckItem(int command_id, const CefString& label) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
AppendItem(Item(MENUITEMTYPE_CHECK, command_id, label, -1));
|
AppendItem(Item(MENUITEMTYPE_CHECK, command_id, label, kInvalidGroupId));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,7 +344,7 @@ CefRefPtr<CefMenuModel> CefMenuModelImpl::AddSubMenu(int command_id,
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Item item(MENUITEMTYPE_SUBMENU, command_id, label, -1);
|
Item item(MENUITEMTYPE_SUBMENU, command_id, label, kInvalidGroupId);
|
||||||
item.submenu_ = new CefMenuModelImpl(delegate_, menu_model_delegate_, true);
|
item.submenu_ = new CefMenuModelImpl(delegate_, menu_model_delegate_, true);
|
||||||
AppendItem(item);
|
AppendItem(item);
|
||||||
return item.submenu_.get();
|
return item.submenu_.get();
|
||||||
|
@ -314,8 +354,9 @@ bool CefMenuModelImpl::InsertSeparatorAt(int index) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
InsertItemAt(Item(MENUITEMTYPE_SEPARATOR, kSeparatorId, CefString(), -1),
|
InsertItemAt(Item(MENUITEMTYPE_SEPARATOR, kSeparatorId, CefString(),
|
||||||
index);
|
kInvalidGroupId),
|
||||||
|
index);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -324,7 +365,8 @@ bool CefMenuModelImpl::InsertItemAt(int index, int command_id,
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
InsertItemAt(Item(MENUITEMTYPE_COMMAND, command_id, label, -1), index);
|
InsertItemAt(Item(MENUITEMTYPE_COMMAND, command_id, label, kInvalidGroupId),
|
||||||
|
index);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,7 +375,8 @@ bool CefMenuModelImpl::InsertCheckItemAt(int index, int command_id,
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
InsertItemAt(Item(MENUITEMTYPE_CHECK, command_id, label, -1), index);
|
InsertItemAt(Item(MENUITEMTYPE_CHECK, command_id, label, kInvalidGroupId),
|
||||||
|
index);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -342,7 +385,7 @@ bool CefMenuModelImpl::InsertRadioItemAt(int index, int command_id,
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
InsertItemAt(Item(MENUITEMTYPE_RADIO, command_id, label, -1), index);
|
InsertItemAt(Item(MENUITEMTYPE_RADIO, command_id, label, group_id), index);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +394,7 @@ CefRefPtr<CefMenuModel> CefMenuModelImpl::InsertSubMenuAt(
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
Item item(MENUITEMTYPE_SUBMENU, command_id, label, -1);
|
Item item(MENUITEMTYPE_SUBMENU, command_id, label, kInvalidGroupId);
|
||||||
item.submenu_ = new CefMenuModelImpl(delegate_, menu_model_delegate_, true);
|
item.submenu_ = new CefMenuModelImpl(delegate_, menu_model_delegate_, true);
|
||||||
InsertItemAt(item, index);
|
InsertItemAt(item, index);
|
||||||
return item.submenu_.get();
|
return item.submenu_.get();
|
||||||
|
@ -374,23 +417,23 @@ bool CefMenuModelImpl::RemoveAt(int index) {
|
||||||
|
|
||||||
int CefMenuModelImpl::GetIndexOf(int command_id) {
|
int CefMenuModelImpl::GetIndexOf(int command_id) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return -1;
|
return kInvalidIndex;
|
||||||
|
|
||||||
for (ItemVector::iterator i = items_.begin(); i != items_.end(); ++i) {
|
for (ItemVector::iterator i = items_.begin(); i != items_.end(); ++i) {
|
||||||
if ((*i).command_id_ == command_id) {
|
if ((*i).command_id_ == command_id) {
|
||||||
return static_cast<int>(std::distance(items_.begin(), i));
|
return static_cast<int>(std::distance(items_.begin(), i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return -1;
|
return kInvalidIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
int CefMenuModelImpl::GetCommandIdAt(int index) {
|
int CefMenuModelImpl::GetCommandIdAt(int index) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return -1;
|
return kInvalidCommandId;
|
||||||
|
|
||||||
if (index >= 0 && index < static_cast<int>(items_.size()))
|
if (index >= 0 && index < static_cast<int>(items_.size()))
|
||||||
return items_[index].command_id_;
|
return items_[index].command_id_;
|
||||||
return -1;
|
return kInvalidCommandId;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CefMenuModelImpl::SetCommandIdAt(int index, int command_id) {
|
bool CefMenuModelImpl::SetCommandIdAt(int index, int command_id) {
|
||||||
|
@ -451,11 +494,11 @@ int CefMenuModelImpl::GetGroupId(int command_id) {
|
||||||
|
|
||||||
int CefMenuModelImpl::GetGroupIdAt(int index) {
|
int CefMenuModelImpl::GetGroupIdAt(int index) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return -1;
|
return kInvalidGroupId;
|
||||||
|
|
||||||
if (index >= 0 && index < static_cast<int>(items_.size()))
|
if (index >= 0 && index < static_cast<int>(items_.size()))
|
||||||
return items_[index].group_id_;
|
return items_[index].group_id_;
|
||||||
return -1;
|
return kInvalidGroupId;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CefMenuModelImpl::SetGroupId(int command_id, int group_id) {
|
bool CefMenuModelImpl::SetGroupId(int command_id, int group_id) {
|
||||||
|
@ -656,6 +699,95 @@ bool CefMenuModelImpl::GetAcceleratorAt(int index, int& key_code,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::SetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) {
|
||||||
|
return SetColorAt(GetIndexOf(command_id), color_type, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::SetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) {
|
||||||
|
if (!VerifyContext())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (color_type < 0 || color_type >= CEF_MENU_COLOR_COUNT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (index == kDefaultIndex) {
|
||||||
|
default_colors_[color_type] = color;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
Item& item = items_[index];
|
||||||
|
item.colors_[color_type] = color;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::GetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) {
|
||||||
|
return GetColorAt(GetIndexOf(command_id), color_type, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::GetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) {
|
||||||
|
if (!VerifyContext())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (color_type < 0 || color_type >= CEF_MENU_COLOR_COUNT)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (index == kDefaultIndex) {
|
||||||
|
color = default_colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
Item& item = items_[index];
|
||||||
|
color = item.colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::SetFontList(int command_id, const CefString& font_list) {
|
||||||
|
return SetFontListAt(GetIndexOf(command_id), font_list);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::SetFontListAt(int index, const CefString& font_list) {
|
||||||
|
if (!VerifyContext())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (index == kDefaultIndex) {
|
||||||
|
if (font_list.empty()) {
|
||||||
|
has_default_font_list_ = false;
|
||||||
|
} else {
|
||||||
|
default_font_list_ = gfx::FontList(font_list);
|
||||||
|
has_default_font_list_ = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
Item& item = items_[index];
|
||||||
|
if (font_list.empty()) {
|
||||||
|
item.has_font_list_ = false;
|
||||||
|
} else {
|
||||||
|
item.font_list_ = gfx::FontList(font_list);
|
||||||
|
item.has_font_list_ = true;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CefMenuModelImpl::ActivatedAt(int index, cef_event_flags_t event_flags) {
|
void CefMenuModelImpl::ActivatedAt(int index, cef_event_flags_t event_flags) {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return;
|
return;
|
||||||
|
@ -700,6 +832,57 @@ void CefMenuModelImpl::UnhandledCloseSubmenu(bool is_rtl) {
|
||||||
base::Bind(&CefMenuModelImpl::OnUnhandledCloseSubmenu, this, is_rtl));
|
base::Bind(&CefMenuModelImpl::OnUnhandledCloseSubmenu, this, is_rtl));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::GetTextColor(int index,
|
||||||
|
bool is_accelerator,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const {
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
const Item& item = items_[index];
|
||||||
|
if (!item.enabled_) {
|
||||||
|
// Use accelerator color for disabled item text.
|
||||||
|
is_accelerator = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const cef_menu_color_type_t color_type =
|
||||||
|
GetMenuColorType(true, is_accelerator, is_hovered);
|
||||||
|
if (item.colors_[color_type] != 0) {
|
||||||
|
*override_color = item.colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const cef_menu_color_type_t color_type =
|
||||||
|
GetMenuColorType(true, is_accelerator, is_hovered);
|
||||||
|
if (default_colors_[color_type] != 0) {
|
||||||
|
*override_color = default_colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelImpl::GetBackgroundColor(int index,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const {
|
||||||
|
const cef_menu_color_type_t color_type =
|
||||||
|
GetMenuColorType(false, false, is_hovered);
|
||||||
|
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
const Item& item = items_[index];
|
||||||
|
if (item.colors_[color_type] != 0) {
|
||||||
|
*override_color = item.colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (default_colors_[color_type] != 0) {
|
||||||
|
*override_color = default_colors_[color_type];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
void CefMenuModelImpl::MenuWillShow() {
|
void CefMenuModelImpl::MenuWillShow() {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return;
|
return;
|
||||||
|
@ -737,6 +920,18 @@ base::string16 CefMenuModelImpl::GetFormattedLabelAt(int index) {
|
||||||
return label;
|
return label;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const gfx::FontList* CefMenuModelImpl::GetLabelFontListAt(int index) const {
|
||||||
|
if (index >= 0 && index < static_cast<int>(items_.size())) {
|
||||||
|
const Item& item = items_[index];
|
||||||
|
if (item.has_font_list_)
|
||||||
|
return &item.font_list_;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has_default_font_list_)
|
||||||
|
return &default_font_list_;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
bool CefMenuModelImpl::VerifyRefCount() {
|
bool CefMenuModelImpl::VerifyRefCount() {
|
||||||
if (!VerifyContext())
|
if (!VerifyContext())
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include "base/threading/platform_thread.h"
|
#include "base/threading/platform_thread.h"
|
||||||
#include "ui/base/models/menu_model.h"
|
#include "ui/base/models/menu_model.h"
|
||||||
|
#include "ui/gfx/font_list.h"
|
||||||
|
|
||||||
namespace content {
|
namespace content {
|
||||||
struct MenuItem;
|
struct MenuItem;
|
||||||
|
@ -123,15 +124,37 @@ class CefMenuModelImpl : public CefMenuModel {
|
||||||
bool& shift_pressed, bool& ctrl_pressed, bool& alt_pressed) override;
|
bool& shift_pressed, bool& ctrl_pressed, bool& alt_pressed) override;
|
||||||
bool GetAcceleratorAt(int index, int& key_code, bool& shift_pressed,
|
bool GetAcceleratorAt(int index, int& key_code, bool& shift_pressed,
|
||||||
bool& ctrl_pressed, bool& alt_pressed) override;
|
bool& ctrl_pressed, bool& alt_pressed) override;
|
||||||
|
bool SetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) override;
|
||||||
|
bool SetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) override;
|
||||||
|
bool GetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) override;
|
||||||
|
bool GetColorAt(int index,
|
||||||
|
cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) override;
|
||||||
|
bool SetFontList(int command_id, const CefString& font_list) override;
|
||||||
|
bool SetFontListAt(int index, const CefString& font_list) override;
|
||||||
|
|
||||||
// Callbacks from the ui::MenuModel implementation.
|
// Callbacks from the ui::MenuModel implementation.
|
||||||
void ActivatedAt(int index, cef_event_flags_t event_flags);
|
void ActivatedAt(int index, cef_event_flags_t event_flags);
|
||||||
void MouseOutsideMenu(const gfx::Point& screen_point);
|
void MouseOutsideMenu(const gfx::Point& screen_point);
|
||||||
void UnhandledOpenSubmenu(bool is_rtl);
|
void UnhandledOpenSubmenu(bool is_rtl);
|
||||||
void UnhandledCloseSubmenu(bool is_rtl);
|
void UnhandledCloseSubmenu(bool is_rtl);
|
||||||
|
bool GetTextColor(int index,
|
||||||
|
bool is_accelerator,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const;
|
||||||
|
bool GetBackgroundColor(int index,
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const;
|
||||||
void MenuWillShow();
|
void MenuWillShow();
|
||||||
void MenuWillClose();
|
void MenuWillClose();
|
||||||
base::string16 GetFormattedLabelAt(int index);
|
base::string16 GetFormattedLabelAt(int index);
|
||||||
|
const gfx::FontList* GetLabelFontListAt(int index) const;
|
||||||
|
|
||||||
// Verify that only a single reference exists to all CefMenuModelImpl objects.
|
// Verify that only a single reference exists to all CefMenuModelImpl objects.
|
||||||
bool VerifyRefCount();
|
bool VerifyRefCount();
|
||||||
|
@ -182,6 +205,11 @@ class CefMenuModelImpl : public CefMenuModel {
|
||||||
ItemVector items_;
|
ItemVector items_;
|
||||||
std::unique_ptr<ui::MenuModel> model_;
|
std::unique_ptr<ui::MenuModel> model_;
|
||||||
|
|
||||||
|
// Style information.
|
||||||
|
cef_color_t default_colors_[CEF_MENU_COLOR_COUNT] = {0};
|
||||||
|
gfx::FontList default_font_list_;
|
||||||
|
bool has_default_font_list_ = false;
|
||||||
|
|
||||||
bool auto_notify_menu_closed_ = true;
|
bool auto_notify_menu_closed_ = true;
|
||||||
|
|
||||||
IMPLEMENT_REFCOUNTING(CefMenuModelImpl);
|
IMPLEMENT_REFCOUNTING(CefMenuModelImpl);
|
||||||
|
|
|
@ -57,6 +57,13 @@ CEF_BUTTON_VIEW_T void CEF_BUTTON_VIEW_D::ButtonPressed(
|
||||||
views::Button* sender, const ui::Event& event) {
|
views::Button* sender, const ui::Event& event) {
|
||||||
if (ParentClass::cef_delegate())
|
if (ParentClass::cef_delegate())
|
||||||
ParentClass::cef_delegate()->OnButtonPressed(GetCefButton());
|
ParentClass::cef_delegate()->OnButtonPressed(GetCefButton());
|
||||||
|
if (ParentClass::ink_drop_mode() != views::CustomButton::InkDropMode::OFF &&
|
||||||
|
!ParentClass::IsFocusable()) {
|
||||||
|
// When ink drop is enabled for non-focusable buttons the ink drop state
|
||||||
|
// does not get reset properly on click, so we do it here explicitly.
|
||||||
|
ParentClass::AnimateInkDrop(views::InkDropState::HIDDEN,
|
||||||
|
ui::LocatedEvent::FromIfValid(&event));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // CEF_LIBCEF_BROWSER_VIEWS_BUTTON_VIEW_H_
|
#endif // CEF_LIBCEF_BROWSER_VIEWS_BUTTON_VIEW_H_
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "libcef/browser/views/menu_button_view.h"
|
#include "libcef/browser/views/menu_button_view.h"
|
||||||
|
|
||||||
#include "ui/gfx/canvas.h"
|
#include "ui/gfx/canvas.h"
|
||||||
|
#include "ui/views/controls/menu/menu_config.h"
|
||||||
|
|
||||||
CefMenuButtonView::CefMenuButtonView(
|
CefMenuButtonView::CefMenuButtonView(
|
||||||
CefMenuButtonDelegate* cef_delegate)
|
CefMenuButtonDelegate* cef_delegate)
|
||||||
|
@ -17,6 +18,9 @@ void CefMenuButtonView::Initialize() {
|
||||||
|
|
||||||
SetDrawStringsFlags(IsFocusable() ? gfx::Canvas::SHOW_PREFIX :
|
SetDrawStringsFlags(IsFocusable() ? gfx::Canvas::SHOW_PREFIX :
|
||||||
gfx::Canvas::HIDE_PREFIX);
|
gfx::Canvas::HIDE_PREFIX);
|
||||||
|
|
||||||
|
// Use the same default font as MenuItemView.
|
||||||
|
SetFontList(views::MenuConfig::instance().font_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
CefRefPtr<CefMenuButton> CefMenuButtonView::GetCefMenuButton() const {
|
CefRefPtr<CefMenuButton> CefMenuButtonView::GetCefMenuButton() const {
|
||||||
|
|
|
@ -994,6 +994,136 @@ int CEF_CALLBACK menu_model_get_accelerator_at(struct _cef_menu_model_t* self,
|
||||||
return _retval;
|
return _retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_set_color(struct _cef_menu_model_t* self,
|
||||||
|
int command_id, cef_menu_color_type_t color_type, cef_color_t color) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->SetColor(
|
||||||
|
command_id,
|
||||||
|
color_type,
|
||||||
|
color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_set_color_at(struct _cef_menu_model_t* self,
|
||||||
|
int index, cef_menu_color_type_t color_type, cef_color_t color) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->SetColorAt(
|
||||||
|
index,
|
||||||
|
color_type,
|
||||||
|
color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_get_color(struct _cef_menu_model_t* self,
|
||||||
|
int command_id, cef_menu_color_type_t color_type, cef_color_t* color) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
// Verify param: color; type: simple_byref
|
||||||
|
DCHECK(color);
|
||||||
|
if (!color)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Translate param: color; type: simple_byref
|
||||||
|
cef_color_t colorVal = color?*color:0;
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->GetColor(
|
||||||
|
command_id,
|
||||||
|
color_type,
|
||||||
|
colorVal);
|
||||||
|
|
||||||
|
// Restore param: color; type: simple_byref
|
||||||
|
if (color)
|
||||||
|
*color = colorVal;
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_get_color_at(struct _cef_menu_model_t* self,
|
||||||
|
int index, cef_menu_color_type_t color_type, cef_color_t* color) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
// Verify param: color; type: simple_byref
|
||||||
|
DCHECK(color);
|
||||||
|
if (!color)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Translate param: color; type: simple_byref
|
||||||
|
cef_color_t colorVal = color?*color:0;
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->GetColorAt(
|
||||||
|
index,
|
||||||
|
color_type,
|
||||||
|
colorVal);
|
||||||
|
|
||||||
|
// Restore param: color; type: simple_byref
|
||||||
|
if (color)
|
||||||
|
*color = colorVal;
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_set_font_list(struct _cef_menu_model_t* self,
|
||||||
|
int command_id, const cef_string_t* font_list) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
// Unverified params: font_list
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->SetFontList(
|
||||||
|
command_id,
|
||||||
|
CefString(font_list));
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
int CEF_CALLBACK menu_model_set_font_list_at(struct _cef_menu_model_t* self,
|
||||||
|
int index, const cef_string_t* font_list) {
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
DCHECK(self);
|
||||||
|
if (!self)
|
||||||
|
return 0;
|
||||||
|
// Unverified params: font_list
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
bool _retval = CefMenuModelCppToC::Get(self)->SetFontListAt(
|
||||||
|
index,
|
||||||
|
CefString(font_list));
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
|
@ -1050,6 +1180,12 @@ CefMenuModelCppToC::CefMenuModelCppToC() {
|
||||||
GetStruct()->remove_accelerator_at = menu_model_remove_accelerator_at;
|
GetStruct()->remove_accelerator_at = menu_model_remove_accelerator_at;
|
||||||
GetStruct()->get_accelerator = menu_model_get_accelerator;
|
GetStruct()->get_accelerator = menu_model_get_accelerator;
|
||||||
GetStruct()->get_accelerator_at = menu_model_get_accelerator_at;
|
GetStruct()->get_accelerator_at = menu_model_get_accelerator_at;
|
||||||
|
GetStruct()->set_color = menu_model_set_color;
|
||||||
|
GetStruct()->set_color_at = menu_model_set_color_at;
|
||||||
|
GetStruct()->get_color = menu_model_get_color;
|
||||||
|
GetStruct()->get_color_at = menu_model_get_color_at;
|
||||||
|
GetStruct()->set_font_list = menu_model_set_font_list;
|
||||||
|
GetStruct()->set_font_list_at = menu_model_set_font_list_at;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<> CefRefPtr<CefMenuModel> CefCppToCRefCounted<CefMenuModelCppToC,
|
template<> CefRefPtr<CefMenuModel> CefCppToCRefCounted<CefMenuModelCppToC,
|
||||||
|
|
|
@ -915,6 +915,115 @@ bool CefMenuModelCToCpp::GetAcceleratorAt(int index, int& key_code,
|
||||||
return _retval?true:false;
|
return _retval?true:false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::SetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t color) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, set_color))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->set_color(_struct,
|
||||||
|
command_id,
|
||||||
|
color_type,
|
||||||
|
color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::SetColorAt(int index, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, set_color_at))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->set_color_at(_struct,
|
||||||
|
index,
|
||||||
|
color_type,
|
||||||
|
color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::GetColor(int command_id,
|
||||||
|
cef_menu_color_type_t color_type, cef_color_t& color) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, get_color))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->get_color(_struct,
|
||||||
|
command_id,
|
||||||
|
color_type,
|
||||||
|
&color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::GetColorAt(int index, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, get_color_at))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->get_color_at(_struct,
|
||||||
|
index,
|
||||||
|
color_type,
|
||||||
|
&color);
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::SetFontList(int command_id,
|
||||||
|
const CefString& font_list) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, set_font_list))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Unverified params: font_list
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->set_font_list(_struct,
|
||||||
|
command_id,
|
||||||
|
font_list.GetStruct());
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CefMenuModelCToCpp::SetFontListAt(int index, const CefString& font_list) {
|
||||||
|
cef_menu_model_t* _struct = GetStruct();
|
||||||
|
if (CEF_MEMBER_MISSING(_struct, set_font_list_at))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// AUTO-GENERATED CONTENT - DELETE THIS COMMENT BEFORE MODIFYING
|
||||||
|
|
||||||
|
// Unverified params: font_list
|
||||||
|
|
||||||
|
// Execute
|
||||||
|
int _retval = _struct->set_font_list_at(_struct,
|
||||||
|
index,
|
||||||
|
font_list.GetStruct());
|
||||||
|
|
||||||
|
// Return type: bool
|
||||||
|
return _retval?true:false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// CONSTRUCTOR - Do not edit by hand.
|
// CONSTRUCTOR - Do not edit by hand.
|
||||||
|
|
||||||
|
|
|
@ -90,6 +90,16 @@ class CefMenuModelCToCpp
|
||||||
bool& ctrl_pressed, bool& alt_pressed) OVERRIDE;
|
bool& ctrl_pressed, bool& alt_pressed) OVERRIDE;
|
||||||
bool GetAcceleratorAt(int index, int& key_code, bool& shift_pressed,
|
bool GetAcceleratorAt(int index, int& key_code, bool& shift_pressed,
|
||||||
bool& ctrl_pressed, bool& alt_pressed) OVERRIDE;
|
bool& ctrl_pressed, bool& alt_pressed) OVERRIDE;
|
||||||
|
bool SetColor(int command_id, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) OVERRIDE;
|
||||||
|
bool SetColorAt(int index, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t color) OVERRIDE;
|
||||||
|
bool GetColor(int command_id, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) OVERRIDE;
|
||||||
|
bool GetColorAt(int index, cef_menu_color_type_t color_type,
|
||||||
|
cef_color_t& color) OVERRIDE;
|
||||||
|
bool SetFontList(int command_id, const CefString& font_list) OVERRIDE;
|
||||||
|
bool SetFontListAt(int index, const CefString& font_list) OVERRIDE;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CEF_LIBCEF_DLL_CTOCPP_MENU_MODEL_CTOCPP_H_
|
#endif // CEF_LIBCEF_DLL_CTOCPP_MENU_MODEL_CTOCPP_H_
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
diff --git ui/base/models/menu_model.h ui/base/models/menu_model.h
|
diff --git ui/base/models/menu_model.h ui/base/models/menu_model.h
|
||||||
index 0755f27..72db677 100644
|
index 0755f27..76ad6d6 100644
|
||||||
--- ui/base/models/menu_model.h
|
--- ui/base/models/menu_model.h
|
||||||
+++ ui/base/models/menu_model.h
|
+++ ui/base/models/menu_model.h
|
||||||
@@ -15,6 +15,7 @@
|
@@ -15,6 +15,7 @@
|
||||||
|
@ -10,7 +10,7 @@ index 0755f27..72db677 100644
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace ui {
|
namespace ui {
|
||||||
@@ -115,6 +116,15 @@ class UI_BASE_EXPORT MenuModel {
|
@@ -115,6 +116,30 @@ class UI_BASE_EXPORT MenuModel {
|
||||||
// |event_flags| is a bit mask of ui::EventFlags.
|
// |event_flags| is a bit mask of ui::EventFlags.
|
||||||
virtual void ActivatedAt(int index, int event_flags);
|
virtual void ActivatedAt(int index, int event_flags);
|
||||||
|
|
||||||
|
@ -22,6 +22,21 @@ index 0755f27..72db677 100644
|
||||||
+ // true if the menu is displaying a right-to-left language.
|
+ // true if the menu is displaying a right-to-left language.
|
||||||
+ virtual void UnhandledOpenSubmenu(bool is_rtl) {}
|
+ virtual void UnhandledOpenSubmenu(bool is_rtl) {}
|
||||||
+ virtual void UnhandledCloseSubmenu(bool is_rtl) {}
|
+ virtual void UnhandledCloseSubmenu(bool is_rtl) {}
|
||||||
|
+
|
||||||
|
+ // Override the text/background color of a given menu item dependent on the
|
||||||
|
+ // |index| and its |is_hovered| state. Returns true if it chooses to override
|
||||||
|
+ // the color.
|
||||||
|
+ virtual bool GetTextColor(int index,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const { return false; }
|
||||||
|
+ virtual bool GetMinorTextColor(int index,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const
|
||||||
|
+ { return false; }
|
||||||
|
+ virtual bool GetBackgroundColor(int index,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const
|
||||||
|
+ { return false; }
|
||||||
+
|
+
|
||||||
// Called when the menu is about to be shown.
|
// Called when the menu is about to be shown.
|
||||||
virtual void MenuWillShow() {}
|
virtual void MenuWillShow() {}
|
||||||
|
@ -231,10 +246,25 @@ index 79ff77c..a0582c0 100644
|
||||||
SetSelection(item, SELECTION_UPDATE_IMMEDIATELY);
|
SetSelection(item, SELECTION_UPDATE_IMMEDIATELY);
|
||||||
else if (item->GetParentMenuItem()->GetParentMenuItem())
|
else if (item->GetParentMenuItem()->GetParentMenuItem())
|
||||||
diff --git ui/views/controls/menu/menu_delegate.h ui/views/controls/menu/menu_delegate.h
|
diff --git ui/views/controls/menu/menu_delegate.h ui/views/controls/menu/menu_delegate.h
|
||||||
index 3b7cb7f..3ad68d0 100644
|
index 3b7cb7f..7481553 100644
|
||||||
--- ui/views/controls/menu/menu_delegate.h
|
--- ui/views/controls/menu/menu_delegate.h
|
||||||
+++ ui/views/controls/menu/menu_delegate.h
|
+++ ui/views/controls/menu/menu_delegate.h
|
||||||
@@ -229,6 +229,11 @@ class VIEWS_EXPORT MenuDelegate {
|
@@ -87,6 +87,14 @@ class VIEWS_EXPORT MenuDelegate {
|
||||||
|
bool is_hovered,
|
||||||
|
SkColor* override_color) const;
|
||||||
|
|
||||||
|
+ // Override the minor text color of a given menu item dependent on the
|
||||||
|
+ // |command_id| and its |is_hovered| state. Returns true if it chooses to
|
||||||
|
+ // override the color.
|
||||||
|
+ virtual bool GetMinorTextColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const
|
||||||
|
+ { return false; }
|
||||||
|
+
|
||||||
|
// Override the background color of a given menu item dependent on the
|
||||||
|
// |command_id| and its |is_hovered| state. Returns true if it chooses to
|
||||||
|
// override the color.
|
||||||
|
@@ -229,6 +237,11 @@ class VIEWS_EXPORT MenuDelegate {
|
||||||
bool* has_mnemonics,
|
bool* has_mnemonics,
|
||||||
MenuButton** button);
|
MenuButton** button);
|
||||||
|
|
||||||
|
@ -246,11 +276,44 @@ index 3b7cb7f..3ad68d0 100644
|
||||||
// Returns the max width menus can grow to be.
|
// Returns the max width menus can grow to be.
|
||||||
virtual int GetMaxWidthForMenu(MenuItemView* menu);
|
virtual int GetMaxWidthForMenu(MenuItemView* menu);
|
||||||
|
|
||||||
|
diff --git ui/views/controls/menu/menu_item_view.cc ui/views/controls/menu/menu_item_view.cc
|
||||||
|
index b4129049..a23670a 100644
|
||||||
|
--- ui/views/controls/menu/menu_item_view.cc
|
||||||
|
+++ ui/views/controls/menu/menu_item_view.cc
|
||||||
|
@@ -871,6 +871,17 @@ void MenuItemView::PaintMinorText(gfx::Canvas* canvas,
|
||||||
|
if (minor_text.empty())
|
||||||
|
return;
|
||||||
|
|
||||||
|
+ SkColor text_color;
|
||||||
|
+
|
||||||
|
+ MenuDelegate *delegate = GetDelegate();
|
||||||
|
+ if (!delegate || !delegate->GetMinorTextColor(GetCommand(),
|
||||||
|
+ render_selection,
|
||||||
|
+ &text_color)) {
|
||||||
|
+ text_color = GetNativeTheme()->GetSystemColor(render_selection ?
|
||||||
|
+ ui::NativeTheme::kColorId_SelectedMenuItemForegroundColor :
|
||||||
|
+ ui::NativeTheme::kColorId_MenuItemSubtitleColor);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
int available_height = height() - GetTopMargin() - GetBottomMargin();
|
||||||
|
int max_accel_width =
|
||||||
|
parent_menu_item_->GetSubmenu()->max_minor_text_width();
|
||||||
|
@@ -889,9 +900,7 @@ void MenuItemView::PaintMinorText(gfx::Canvas* canvas,
|
||||||
|
canvas->DrawStringRectWithFlags(
|
||||||
|
minor_text,
|
||||||
|
GetFontList(),
|
||||||
|
- GetNativeTheme()->GetSystemColor(render_selection ?
|
||||||
|
- ui::NativeTheme::kColorId_SelectedMenuItemForegroundColor :
|
||||||
|
- ui::NativeTheme::kColorId_MenuItemSubtitleColor),
|
||||||
|
+ text_color,
|
||||||
|
accel_bounds,
|
||||||
|
flags);
|
||||||
|
}
|
||||||
diff --git ui/views/controls/menu/menu_model_adapter.cc ui/views/controls/menu/menu_model_adapter.cc
|
diff --git ui/views/controls/menu/menu_model_adapter.cc ui/views/controls/menu/menu_model_adapter.cc
|
||||||
index bc04dcb..b2ec114 100644
|
index bc04dcb..d786a0b 100644
|
||||||
--- ui/views/controls/menu/menu_model_adapter.cc
|
--- ui/views/controls/menu/menu_model_adapter.cc
|
||||||
+++ ui/views/controls/menu/menu_model_adapter.cc
|
+++ ui/views/controls/menu/menu_model_adapter.cc
|
||||||
@@ -245,6 +245,49 @@ void MenuModelAdapter::SelectionChanged(MenuItemView* menu) {
|
@@ -245,6 +245,88 @@ void MenuModelAdapter::SelectionChanged(MenuItemView* menu) {
|
||||||
NOTREACHED();
|
NOTREACHED();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,15 +359,54 @@ index bc04dcb..b2ec114 100644
|
||||||
+
|
+
|
||||||
+ NOTREACHED();
|
+ NOTREACHED();
|
||||||
+}
|
+}
|
||||||
|
+
|
||||||
|
+bool MenuModelAdapter::GetForegroundColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const {
|
||||||
|
+ ui::MenuModel* model = menu_model_;
|
||||||
|
+ int index = 0;
|
||||||
|
+ if (ui::MenuModel::GetModelAndIndexForCommandId(command_id, &model, &index))
|
||||||
|
+ return model->GetTextColor(index, is_hovered, override_color);
|
||||||
|
+
|
||||||
|
+ NOTREACHED();
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool MenuModelAdapter::GetMinorTextColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const {
|
||||||
|
+ ui::MenuModel* model = menu_model_;
|
||||||
|
+ int index = 0;
|
||||||
|
+ if (ui::MenuModel::GetModelAndIndexForCommandId(command_id, &model, &index))
|
||||||
|
+ return model->GetMinorTextColor(index, is_hovered, override_color);
|
||||||
|
+
|
||||||
|
+ NOTREACHED();
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+bool MenuModelAdapter::GetBackgroundColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const {
|
||||||
|
+ if (command_id == -1)
|
||||||
|
+ return menu_model_->GetBackgroundColor(-1, is_hovered, override_color);
|
||||||
|
+
|
||||||
|
+ ui::MenuModel* model = menu_model_;
|
||||||
|
+ int index = 0;
|
||||||
|
+ if (ui::MenuModel::GetModelAndIndexForCommandId(command_id, &model, &index))
|
||||||
|
+ return model->GetBackgroundColor(index, is_hovered, override_color);
|
||||||
|
+
|
||||||
|
+ NOTREACHED();
|
||||||
|
+ return false;
|
||||||
|
+}
|
||||||
+
|
+
|
||||||
void MenuModelAdapter::WillShowMenu(MenuItemView* menu) {
|
void MenuModelAdapter::WillShowMenu(MenuItemView* menu) {
|
||||||
// Look up the menu model for this menu.
|
// Look up the menu model for this menu.
|
||||||
const std::map<MenuItemView*, ui::MenuModel*>::const_iterator map_iterator =
|
const std::map<MenuItemView*, ui::MenuModel*>::const_iterator map_iterator =
|
||||||
diff --git ui/views/controls/menu/menu_model_adapter.h ui/views/controls/menu/menu_model_adapter.h
|
diff --git ui/views/controls/menu/menu_model_adapter.h ui/views/controls/menu/menu_model_adapter.h
|
||||||
index c9799da..c7ecca6 100644
|
index c9799da..827f786 100644
|
||||||
--- ui/views/controls/menu/menu_model_adapter.h
|
--- ui/views/controls/menu/menu_model_adapter.h
|
||||||
+++ ui/views/controls/menu/menu_model_adapter.h
|
+++ ui/views/controls/menu/menu_model_adapter.h
|
||||||
@@ -76,6 +76,13 @@ class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate {
|
@@ -76,6 +76,22 @@ class VIEWS_EXPORT MenuModelAdapter : public MenuDelegate {
|
||||||
bool IsCommandVisible(int id) const override;
|
bool IsCommandVisible(int id) const override;
|
||||||
bool IsItemChecked(int id) const override;
|
bool IsItemChecked(int id) const override;
|
||||||
void SelectionChanged(MenuItemView* menu) override;
|
void SelectionChanged(MenuItemView* menu) override;
|
||||||
|
@ -315,6 +417,31 @@ index c9799da..c7ecca6 100644
|
||||||
+ MenuButton** button) override;
|
+ MenuButton** button) override;
|
||||||
+ void OnUnhandledOpenSubmenu(MenuItemView* menu, bool is_rtl) override;
|
+ void OnUnhandledOpenSubmenu(MenuItemView* menu, bool is_rtl) override;
|
||||||
+ void OnUnhandledCloseSubmenu(MenuItemView* menu, bool is_rtl) override;
|
+ void OnUnhandledCloseSubmenu(MenuItemView* menu, bool is_rtl) override;
|
||||||
|
+ bool GetForegroundColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const override;
|
||||||
|
+ bool GetMinorTextColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const override;
|
||||||
|
+ bool GetBackgroundColor(int command_id,
|
||||||
|
+ bool is_hovered,
|
||||||
|
+ SkColor* override_color) const override;
|
||||||
void WillShowMenu(MenuItemView* menu) override;
|
void WillShowMenu(MenuItemView* menu) override;
|
||||||
void WillHideMenu(MenuItemView* menu) override;
|
void WillHideMenu(MenuItemView* menu) override;
|
||||||
void OnMenuClosed(MenuItemView* menu, MenuRunner::RunResult result) override;
|
void OnMenuClosed(MenuItemView* menu, MenuRunner::RunResult result) override;
|
||||||
|
diff --git ui/views/controls/menu/menu_scroll_view_container.cc ui/views/controls/menu/menu_scroll_view_container.cc
|
||||||
|
index 455d289..f5f7419 100644
|
||||||
|
--- ui/views/controls/menu/menu_scroll_view_container.cc
|
||||||
|
+++ ui/views/controls/menu/menu_scroll_view_container.cc
|
||||||
|
@@ -184,6 +184,11 @@ MenuScrollViewContainer::MenuScrollViewContainer(SubmenuView* content_view)
|
||||||
|
scroll_view_ = new MenuScrollView(content_view);
|
||||||
|
AddChildView(scroll_view_);
|
||||||
|
|
||||||
|
+ SkColor override_color;
|
||||||
|
+ MenuDelegate* delegate = content_view_->GetMenuItem()->GetDelegate();
|
||||||
|
+ if (delegate && delegate->GetBackgroundColor(-1, false, &override_color))
|
||||||
|
+ set_background(views::Background::CreateSolidBackground(override_color));
|
||||||
|
+
|
||||||
|
arrow_ = BubbleBorderTypeFromAnchor(
|
||||||
|
content_view_->GetMenuItem()->GetMenuController()->GetAnchorPosition());
|
||||||
|
|
||||||
|
|
|
@ -325,6 +325,9 @@ void ClientHandler::OnBeforeContextMenu(
|
||||||
// Test context menu features.
|
// Test context menu features.
|
||||||
BuildTestMenu(model);
|
BuildTestMenu(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (delegate_)
|
||||||
|
delegate_->OnBeforeContextMenu(model);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ClientHandler::OnContextMenuCommand(
|
bool ClientHandler::OnContextMenuCommand(
|
||||||
|
|
|
@ -38,7 +38,8 @@ class ClientHandler : public CefClient,
|
||||||
public CefRequestHandler {
|
public CefRequestHandler {
|
||||||
public:
|
public:
|
||||||
// Implement this interface to receive notification of ClientHandler
|
// Implement this interface to receive notification of ClientHandler
|
||||||
// events. The methods of this class will be called on the main thread.
|
// events. The methods of this class will be called on the main thread unless
|
||||||
|
// otherwise indicated.
|
||||||
class Delegate {
|
class Delegate {
|
||||||
public:
|
public:
|
||||||
// Called when the browser is created.
|
// Called when the browser is created.
|
||||||
|
@ -74,6 +75,9 @@ class ClientHandler : public CefClient,
|
||||||
// Set focus to the next/previous control.
|
// Set focus to the next/previous control.
|
||||||
virtual void OnTakeFocus(bool next) {}
|
virtual void OnTakeFocus(bool next) {}
|
||||||
|
|
||||||
|
// Called on the UI thread before a context menu is displayed.
|
||||||
|
virtual void OnBeforeContextMenu(CefRefPtr<CefMenuModel> model) {}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~Delegate() {}
|
virtual ~Delegate() {}
|
||||||
};
|
};
|
||||||
|
|
|
@ -33,7 +33,7 @@ cef_color_t ParseColor(const std::string& color) {
|
||||||
return CefColorSetARGB(255, 255, 255, 255);
|
return CefColorSetARGB(255, 255, 255, 255);
|
||||||
|
|
||||||
// Use the default color.
|
// Use the default color.
|
||||||
return 0U;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -44,7 +44,7 @@ MainContextImpl::MainContextImpl(CefRefPtr<CefCommandLine> command_line,
|
||||||
terminate_when_all_windows_closed_(terminate_when_all_windows_closed),
|
terminate_when_all_windows_closed_(terminate_when_all_windows_closed),
|
||||||
initialized_(false),
|
initialized_(false),
|
||||||
shutdown_(false),
|
shutdown_(false),
|
||||||
background_color_(CefColorSetARGB(255, 255, 255, 255)),
|
background_color_(0),
|
||||||
use_views_(false) {
|
use_views_(false) {
|
||||||
DCHECK(command_line_.get());
|
DCHECK(command_line_.get());
|
||||||
|
|
||||||
|
@ -54,12 +54,6 @@ MainContextImpl::MainContextImpl(CefRefPtr<CefCommandLine> command_line,
|
||||||
if (main_url_.empty())
|
if (main_url_.empty())
|
||||||
main_url_ = kDefaultUrl;
|
main_url_ = kDefaultUrl;
|
||||||
|
|
||||||
if (command_line_->HasSwitch(switches::kBackgroundColor)) {
|
|
||||||
// Parse the background color value.
|
|
||||||
background_color_ =
|
|
||||||
ParseColor(command_line_->GetSwitchValue(switches::kBackgroundColor));
|
|
||||||
}
|
|
||||||
|
|
||||||
// Whether windowless (off-screen) rendering will be used.
|
// Whether windowless (off-screen) rendering will be used.
|
||||||
use_windowless_rendering_ =
|
use_windowless_rendering_ =
|
||||||
command_line_->HasSwitch(switches::kOffScreenRenderingEnabled);
|
command_line_->HasSwitch(switches::kOffScreenRenderingEnabled);
|
||||||
|
@ -81,8 +75,19 @@ MainContextImpl::MainContextImpl(CefRefPtr<CefCommandLine> command_line,
|
||||||
}
|
}
|
||||||
#endif // defined(OS_WIN) || defined(OS_LINUX)
|
#endif // defined(OS_WIN) || defined(OS_LINUX)
|
||||||
|
|
||||||
|
if (command_line_->HasSwitch(switches::kBackgroundColor)) {
|
||||||
|
// Parse the background color value.
|
||||||
|
background_color_ =
|
||||||
|
ParseColor(command_line_->GetSwitchValue(switches::kBackgroundColor));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!use_views_ && background_color_ == 0) {
|
||||||
|
// Set an explicit background color when not using Views.
|
||||||
|
background_color_ = CefColorSetARGB(255, 255, 255, 255);
|
||||||
|
}
|
||||||
|
|
||||||
const std::string& cdm_path =
|
const std::string& cdm_path =
|
||||||
command_line_->GetSwitchValue(switches::kWidevineCdmPath);
|
command_line_->GetSwitchValue(switches::kWidevineCdmPath);
|
||||||
if (!cdm_path.empty()) {
|
if (!cdm_path.empty()) {
|
||||||
// Register the Widevine CDM at the specified path. See comments in
|
// Register the Widevine CDM at the specified path. See comments in
|
||||||
// cef_web_plugin.h for details. It's safe to call this method before
|
// cef_web_plugin.h for details. It's safe to call this method before
|
||||||
|
@ -135,7 +140,8 @@ void MainContextImpl::PopulateSettings(CefSettings* settings) {
|
||||||
if (use_windowless_rendering_)
|
if (use_windowless_rendering_)
|
||||||
settings->windowless_rendering_enabled = true;
|
settings->windowless_rendering_enabled = true;
|
||||||
|
|
||||||
settings->background_color = background_color_;
|
if (background_color_ != 0)
|
||||||
|
settings->background_color = background_color_;
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) {
|
void MainContextImpl::PopulateBrowserSettings(CefBrowserSettings* settings) {
|
||||||
|
@ -150,7 +156,8 @@ void MainContextImpl::PopulateOsrSettings(OsrRenderer::Settings* settings) {
|
||||||
command_line_->HasSwitch(switches::kTransparentPaintingEnabled);
|
command_line_->HasSwitch(switches::kTransparentPaintingEnabled);
|
||||||
settings->show_update_rect =
|
settings->show_update_rect =
|
||||||
command_line_->HasSwitch(switches::kShowUpdateRect);
|
command_line_->HasSwitch(switches::kShowUpdateRect);
|
||||||
settings->background_color = background_color_;
|
if (background_color_ != 0)
|
||||||
|
settings->background_color = background_color_;
|
||||||
}
|
}
|
||||||
|
|
||||||
RootWindowManager* MainContextImpl::GetRootWindowManager() {
|
RootWindowManager* MainContextImpl::GetRootWindowManager() {
|
||||||
|
|
|
@ -341,6 +341,12 @@ void RootWindowViews::OnTakeFocus(bool next) {
|
||||||
window_->TakeFocus(next);
|
window_->TakeFocus(next);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RootWindowViews::OnBeforeContextMenu(CefRefPtr<CefMenuModel> model) {
|
||||||
|
CEF_REQUIRE_UI_THREAD();
|
||||||
|
if (window_)
|
||||||
|
window_->OnBeforeContextMenu(model);
|
||||||
|
}
|
||||||
|
|
||||||
void RootWindowViews::CreateClientHandler(const std::string& url) {
|
void RootWindowViews::CreateClientHandler(const std::string& url) {
|
||||||
DCHECK(!client_handler_);
|
DCHECK(!client_handler_);
|
||||||
|
|
||||||
|
|
|
@ -74,6 +74,7 @@ class RootWindowViews : public RootWindow,
|
||||||
void OnSetDraggableRegions(
|
void OnSetDraggableRegions(
|
||||||
const std::vector<CefDraggableRegion>& regions) OVERRIDE;
|
const std::vector<CefDraggableRegion>& regions) OVERRIDE;
|
||||||
void OnTakeFocus(bool next) OVERRIDE;
|
void OnTakeFocus(bool next) OVERRIDE;
|
||||||
|
void OnBeforeContextMenu(CefRefPtr<CefMenuModel> model) OVERRIDE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void CreateClientHandler(const std::string& url);
|
void CreateClientHandler(const std::string& url);
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
#include "include/views/cef_box_layout.h"
|
#include "include/views/cef_box_layout.h"
|
||||||
#include "include/views/cef_window.h"
|
#include "include/views/cef_window.h"
|
||||||
|
#include "tests/cefclient/browser/views_style.h"
|
||||||
|
|
||||||
namespace client {
|
namespace client {
|
||||||
|
|
||||||
|
@ -71,12 +72,14 @@ CefRefPtr<CefMenuModel> ViewsMenuBar::CreateMenuModel(const CefString& label,
|
||||||
|
|
||||||
// Create the new MenuModel.
|
// Create the new MenuModel.
|
||||||
CefRefPtr<CefMenuModel> model = CefMenuModel::CreateMenuModel(this);
|
CefRefPtr<CefMenuModel> model = CefMenuModel::CreateMenuModel(this);
|
||||||
|
views_style::ApplyTo(model);
|
||||||
models_.push_back(model);
|
models_.push_back(model);
|
||||||
|
|
||||||
// Create the new MenuButton.
|
// Create the new MenuButton.
|
||||||
CefRefPtr<CefMenuButton> button =
|
CefRefPtr<CefMenuButton> button =
|
||||||
CefMenuButton::CreateMenuButton(this, label, false, false);
|
CefMenuButton::CreateMenuButton(this, label, false, false);
|
||||||
button->SetID(new_menu_id);
|
button->SetID(new_menu_id);
|
||||||
|
views_style::ApplyTo(button.get());
|
||||||
button->SetInkDropEnabled(true);
|
button->SetInkDropEnabled(true);
|
||||||
|
|
||||||
// Assign a group ID to allow focus traversal between MenuButtons using the
|
// Assign a group ID to allow focus traversal between MenuButtons using the
|
||||||
|
@ -236,6 +239,7 @@ void ViewsMenuBar::EnsureMenuPanel() {
|
||||||
return;
|
return;
|
||||||
|
|
||||||
panel_ = CefPanel::CreatePanel(NULL);
|
panel_ = CefPanel::CreatePanel(NULL);
|
||||||
|
views_style::ApplyTo(panel_);
|
||||||
|
|
||||||
// Use a horizontal box layout.
|
// Use a horizontal box layout.
|
||||||
CefBoxLayoutSettings top_panel_layout_settings;
|
CefBoxLayoutSettings top_panel_layout_settings;
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
// Copyright (c) 2017 The Chromium Embedded Framework Authors. All rights
|
||||||
|
// reserved. Use of this source code is governed by a BSD-style license that
|
||||||
|
// can be found in the LICENSE file.
|
||||||
|
|
||||||
|
#include "tests/cefclient/browser/views_style.h"
|
||||||
|
|
||||||
|
#include "tests/cefclient/browser/main_context.h"
|
||||||
|
|
||||||
|
namespace client {
|
||||||
|
|
||||||
|
namespace views_style {
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
cef_color_t g_background_color = 0;
|
||||||
|
cef_color_t g_background_hover_color = 0;
|
||||||
|
cef_color_t g_text_color = 0;
|
||||||
|
|
||||||
|
int GetShade(int component) {
|
||||||
|
return (component < 127) ? component + 75 : component - 75;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MaybeInitialize() {
|
||||||
|
static bool initialized = false;
|
||||||
|
if (initialized)
|
||||||
|
return;
|
||||||
|
|
||||||
|
g_background_color = MainContext::Get()->GetBackgroundColor();
|
||||||
|
if (g_background_color != 0) {
|
||||||
|
// Use a slightly modified shade of the background color for hover.
|
||||||
|
g_background_hover_color = CefColorSetARGB(255,
|
||||||
|
GetShade(CefColorGetR(g_background_color)),
|
||||||
|
GetShade(CefColorGetG(g_background_color)),
|
||||||
|
GetShade(CefColorGetB(g_background_color)));
|
||||||
|
|
||||||
|
// Invert the background color for text.
|
||||||
|
g_text_color = CefColorSetARGB(255,
|
||||||
|
255 - CefColorGetR(g_background_color),
|
||||||
|
255 - CefColorGetG(g_background_color),
|
||||||
|
255 - CefColorGetB(g_background_color));
|
||||||
|
}
|
||||||
|
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
bool IsSet() {
|
||||||
|
MaybeInitialize();
|
||||||
|
return g_background_color != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyTo(CefRefPtr<CefPanel> panel) {
|
||||||
|
if (!IsSet())
|
||||||
|
return;
|
||||||
|
|
||||||
|
panel->SetBackgroundColor(g_background_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyTo(CefRefPtr<CefLabelButton> label_button) {
|
||||||
|
if (!IsSet())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// All text except disabled gets the same color.
|
||||||
|
label_button->SetEnabledTextColors(g_text_color);
|
||||||
|
label_button->SetTextColor(CEF_BUTTON_STATE_DISABLED,
|
||||||
|
g_background_hover_color);
|
||||||
|
|
||||||
|
label_button->SetBackgroundColor(g_background_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyTo(CefRefPtr<CefTextfield> textfield) {
|
||||||
|
if (!IsSet())
|
||||||
|
return;
|
||||||
|
|
||||||
|
textfield->SetBackgroundColor(g_background_color);
|
||||||
|
textfield->SetTextColor(g_text_color);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ApplyTo(CefRefPtr<CefMenuModel> menu_model) {
|
||||||
|
if (!IsSet())
|
||||||
|
return;
|
||||||
|
|
||||||
|
// All text except non-hovered accelerator gets the same color.
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_TEXT, g_text_color);
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_TEXT_HOVERED, g_text_color);
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_TEXT_ACCELERATOR,
|
||||||
|
g_background_hover_color);
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_TEXT_ACCELERATOR_HOVERED,
|
||||||
|
g_text_color);
|
||||||
|
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_BACKGROUND, g_background_color);
|
||||||
|
menu_model->SetColorAt(-1, CEF_MENU_COLOR_BACKGROUND_HOVERED,
|
||||||
|
g_background_hover_color);
|
||||||
|
|
||||||
|
// Recursively color sub-menus.
|
||||||
|
for (int i = 0; i < menu_model->GetCount(); ++i) {
|
||||||
|
if (menu_model->GetTypeAt(i) == MENUITEMTYPE_SUBMENU)
|
||||||
|
ApplyTo(menu_model->GetSubMenuAt(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace views_style
|
||||||
|
|
||||||
|
} // namespace client
|
|
@ -0,0 +1,31 @@
|
||||||
|
// Copyright (c) 2017 The Chromium Embedded Framework Authors. All rights
|
||||||
|
// reserved. Use of this source code is governed by a BSD-style license that
|
||||||
|
// can be found in the LICENSE file.
|
||||||
|
|
||||||
|
#ifndef CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_STYLE_H_
|
||||||
|
#define CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_STYLE_H_
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "include/cef_menu_model.h"
|
||||||
|
#include "include/views/cef_label_button.h"
|
||||||
|
#include "include/views/cef_panel.h"
|
||||||
|
#include "include/views/cef_textfield.h"
|
||||||
|
|
||||||
|
namespace client {
|
||||||
|
|
||||||
|
namespace views_style {
|
||||||
|
|
||||||
|
// Returns true if a style is set.
|
||||||
|
bool IsSet();
|
||||||
|
|
||||||
|
// Apply style to views objects.
|
||||||
|
void ApplyTo(CefRefPtr<CefPanel> panel);
|
||||||
|
void ApplyTo(CefRefPtr<CefLabelButton> label_button);
|
||||||
|
void ApplyTo(CefRefPtr<CefTextfield> textfield);
|
||||||
|
void ApplyTo(CefRefPtr<CefMenuModel> menu_model);
|
||||||
|
|
||||||
|
} // namespace views_style
|
||||||
|
|
||||||
|
} // namespace client
|
||||||
|
|
||||||
|
#endif // CEF_TESTS_CEFCLIENT_BROWSER_VIEWS_STYLE_H_
|
|
@ -11,8 +11,8 @@
|
||||||
#include "include/views/cef_box_layout.h"
|
#include "include/views/cef_box_layout.h"
|
||||||
#include "include/wrapper/cef_helpers.h"
|
#include "include/wrapper/cef_helpers.h"
|
||||||
#include "include/cef_app.h"
|
#include "include/cef_app.h"
|
||||||
#include "tests/cefclient/browser/main_context.h"
|
|
||||||
#include "tests/cefclient/browser/resource.h"
|
#include "tests/cefclient/browser/resource.h"
|
||||||
|
#include "tests/cefclient/browser/views_style.h"
|
||||||
#include "tests/shared/browser/resource_util.h"
|
#include "tests/shared/browser/resource_util.h"
|
||||||
#include "tests/shared/common/client_switches.h"
|
#include "tests/shared/common/client_switches.h"
|
||||||
|
|
||||||
|
@ -28,6 +28,7 @@ namespace {
|
||||||
// Control IDs for Views in the top-level Window.
|
// Control IDs for Views in the top-level Window.
|
||||||
enum ControlIds {
|
enum ControlIds {
|
||||||
ID_WINDOW = 1,
|
ID_WINDOW = 1,
|
||||||
|
ID_BROWSER_VIEW,
|
||||||
ID_BACK_BUTTON,
|
ID_BACK_BUTTON,
|
||||||
ID_FORWARD_BUTTON,
|
ID_FORWARD_BUTTON,
|
||||||
ID_STOP_BUTTON,
|
ID_STOP_BUTTON,
|
||||||
|
@ -81,11 +82,12 @@ void AddTestMenuItems(CefRefPtr<CefMenuModel> test_menu) {
|
||||||
test_menu->AddItem(ID_TESTS_OTHER_TESTS, "Other Tests");
|
test_menu->AddItem(ID_TESTS_OTHER_TESTS, "Other Tests");
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddFileMenuItems(CefRefPtr<CefMenuModel> file_menu, int offset) {
|
void AddFileMenuItems(CefRefPtr<CefMenuModel> file_menu) {
|
||||||
file_menu->AddItem(ID_QUIT, "E&xit");
|
file_menu->AddItem(ID_QUIT, "E&xit");
|
||||||
|
|
||||||
// Show the accelerator shortcut text in the menu.
|
// Show the accelerator shortcut text in the menu.
|
||||||
file_menu->SetAcceleratorAt(offset, 'X', false, false, true);
|
file_menu->SetAcceleratorAt(file_menu->GetCount() - 1,
|
||||||
|
'X', false, false, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
@ -243,6 +245,12 @@ void ViewsWindow::TakeFocus(bool next) {
|
||||||
window_->GetViewForID(ID_URL_TEXTFIELD)->RequestFocus();
|
window_->GetViewForID(ID_URL_TEXTFIELD)->RequestFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ViewsWindow::OnBeforeContextMenu(CefRefPtr<CefMenuModel> model) {
|
||||||
|
CEF_REQUIRE_UI_THREAD();
|
||||||
|
|
||||||
|
views_style::ApplyTo(model);
|
||||||
|
}
|
||||||
|
|
||||||
bool ViewsWindow::OnPopupBrowserViewCreated(
|
bool ViewsWindow::OnPopupBrowserViewCreated(
|
||||||
CefRefPtr<CefBrowserView> browser_view,
|
CefRefPtr<CefBrowserView> browser_view,
|
||||||
CefRefPtr<CefBrowserView> popup_browser_view,
|
CefRefPtr<CefBrowserView> popup_browser_view,
|
||||||
|
@ -380,7 +388,7 @@ void ViewsWindow::OnWindowCreated(CefRefPtr<CefWindow> window) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the background color for regions that are not obscured by other Views.
|
// Set the background color for regions that are not obscured by other Views.
|
||||||
window_->SetBackgroundColor(MainContext::Get()->GetBackgroundColor());
|
views_style::ApplyTo(window_.get());
|
||||||
|
|
||||||
if (with_controls_) {
|
if (with_controls_) {
|
||||||
// Add the BrowserView and other controls to the Window.
|
// Add the BrowserView and other controls to the Window.
|
||||||
|
@ -452,8 +460,18 @@ bool ViewsWindow::OnKeyEvent(CefRefPtr<CefWindow> window,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (event.type == KEYEVENT_RAWKEYDOWN && event.windows_key_code == VK_MENU) {
|
if (event.type == KEYEVENT_RAWKEYDOWN && event.windows_key_code == VK_MENU) {
|
||||||
// ALT key is pressed. Make the menu buttons focusable.
|
// ALT key is pressed.
|
||||||
SetMenuFocusable(true);
|
int last_focused_view = last_focused_view_;
|
||||||
|
bool menu_had_focus = menu_has_focus_;
|
||||||
|
|
||||||
|
// Toggle menu button focusable.
|
||||||
|
SetMenuFocusable(!menu_has_focus_);
|
||||||
|
|
||||||
|
if (menu_had_focus && last_focused_view != 0) {
|
||||||
|
// Restore focus to the view that was previously focused.
|
||||||
|
window_->GetViewForID(last_focused_view)->RequestFocus();
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,9 +493,16 @@ CefSize ViewsWindow::GetMinimumSize(CefRefPtr<CefView> view) {
|
||||||
void ViewsWindow::OnFocus(CefRefPtr<CefView> view) {
|
void ViewsWindow::OnFocus(CefRefPtr<CefView> view) {
|
||||||
CEF_REQUIRE_UI_THREAD();
|
CEF_REQUIRE_UI_THREAD();
|
||||||
|
|
||||||
|
const int view_id = view->GetID();
|
||||||
|
|
||||||
|
// Keep track of the non-menu view that was last focused.
|
||||||
|
if (last_focused_view_ != view_id &&
|
||||||
|
(!top_menu_bar_ || !top_menu_bar_->HasMenuId(view_id))) {
|
||||||
|
last_focused_view_ = view_id;
|
||||||
|
}
|
||||||
|
|
||||||
// When focus leaves the menu buttons make them unfocusable.
|
// When focus leaves the menu buttons make them unfocusable.
|
||||||
if (menu_has_focus_) {
|
if (menu_has_focus_) {
|
||||||
const int view_id = view->GetID();
|
|
||||||
if (top_menu_bar_) {
|
if (top_menu_bar_) {
|
||||||
if (!top_menu_bar_->HasMenuId(view_id))
|
if (!top_menu_bar_->HasMenuId(view_id))
|
||||||
SetMenuFocusable(false);
|
SetMenuFocusable(false);
|
||||||
|
@ -497,7 +522,8 @@ ViewsWindow::ViewsWindow(Delegate* delegate,
|
||||||
CefRefPtr<CefBrowserView> browser_view)
|
CefRefPtr<CefBrowserView> browser_view)
|
||||||
: delegate_(delegate),
|
: delegate_(delegate),
|
||||||
with_controls_(false),
|
with_controls_(false),
|
||||||
menu_has_focus_(false) {
|
menu_has_focus_(false),
|
||||||
|
last_focused_view_(false) {
|
||||||
DCHECK(delegate_);
|
DCHECK(delegate_);
|
||||||
if (browser_view)
|
if (browser_view)
|
||||||
SetBrowserView(browser_view);
|
SetBrowserView(browser_view);
|
||||||
|
@ -506,8 +532,9 @@ ViewsWindow::ViewsWindow(Delegate* delegate,
|
||||||
CefCommandLine::GetGlobalCommandLine();
|
CefCommandLine::GetGlobalCommandLine();
|
||||||
frameless_ = command_line->HasSwitch(switches::kHideFrame);
|
frameless_ = command_line->HasSwitch(switches::kHideFrame);
|
||||||
|
|
||||||
if (!command_line->HasSwitch(switches::kHideTopMenu))
|
if (!command_line->HasSwitch(switches::kHideTopMenu)) {
|
||||||
top_menu_bar_ = new ViewsMenuBar(this, ID_TOP_MENU_FIRST);
|
top_menu_bar_ = new ViewsMenuBar(this, ID_TOP_MENU_FIRST);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewsWindow::SetBrowserView(CefRefPtr<CefBrowserView> browser_view) {
|
void ViewsWindow::SetBrowserView(CefRefPtr<CefBrowserView> browser_view) {
|
||||||
|
@ -516,6 +543,7 @@ void ViewsWindow::SetBrowserView(CefRefPtr<CefBrowserView> browser_view) {
|
||||||
DCHECK(browser_view->IsValid());
|
DCHECK(browser_view->IsValid());
|
||||||
DCHECK(!browser_view->IsAttached());
|
DCHECK(!browser_view->IsAttached());
|
||||||
browser_view_ = browser_view;
|
browser_view_ = browser_view;
|
||||||
|
browser_view_->SetID(ID_BROWSER_VIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ViewsWindow::CreateMenuModel() {
|
void ViewsWindow::CreateMenuModel() {
|
||||||
|
@ -523,12 +551,13 @@ void ViewsWindow::CreateMenuModel() {
|
||||||
button_menu_model_ = CefMenuModel::CreateMenuModel(this);
|
button_menu_model_ = CefMenuModel::CreateMenuModel(this);
|
||||||
CefRefPtr<CefMenuModel> test_menu =
|
CefRefPtr<CefMenuModel> test_menu =
|
||||||
button_menu_model_->AddSubMenu(0, "&Tests");
|
button_menu_model_->AddSubMenu(0, "&Tests");
|
||||||
|
views_style::ApplyTo(button_menu_model_);
|
||||||
AddTestMenuItems(test_menu);
|
AddTestMenuItems(test_menu);
|
||||||
AddFileMenuItems(button_menu_model_, 1);
|
AddFileMenuItems(button_menu_model_);
|
||||||
|
|
||||||
if (top_menu_bar_) {
|
if (top_menu_bar_) {
|
||||||
// Add the menus to the top menu bar.
|
// Add the menus to the top menu bar.
|
||||||
AddFileMenuItems(top_menu_bar_->CreateMenuModel("&File", NULL), 0);
|
AddFileMenuItems(top_menu_bar_->CreateMenuModel("&File", NULL));
|
||||||
AddTestMenuItems(top_menu_bar_->CreateMenuModel("&Tests", NULL));
|
AddTestMenuItems(top_menu_bar_->CreateMenuModel("&Tests", NULL));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -536,11 +565,23 @@ void ViewsWindow::CreateMenuModel() {
|
||||||
CefRefPtr<CefLabelButton> ViewsWindow::CreateBrowseButton(
|
CefRefPtr<CefLabelButton> ViewsWindow::CreateBrowseButton(
|
||||||
const std::string& label,
|
const std::string& label,
|
||||||
int id) {
|
int id) {
|
||||||
|
// The default framed button image resources (IDR_BUTTON_*) look pretty bad
|
||||||
|
// with non-default background colors, so we'll use frameless buttons with
|
||||||
|
// ink drop when a background color is specified.
|
||||||
|
const bool with_frame = !views_style::IsSet();
|
||||||
|
|
||||||
CefRefPtr<CefLabelButton> button =
|
CefRefPtr<CefLabelButton> button =
|
||||||
CefLabelButton::CreateLabelButton(this, label, true);
|
CefLabelButton::CreateLabelButton(this, label, with_frame);
|
||||||
button->SetID(id);
|
button->SetID(id);
|
||||||
button->SetEnabled(false); // Disabled by default.
|
button->SetEnabled(false); // Disabled by default.
|
||||||
button->SetFocusable(false); // Don't give focus to the button.
|
button->SetFocusable(false); // Don't give focus to the button.
|
||||||
|
|
||||||
|
if (!with_frame) {
|
||||||
|
views_style::ApplyTo(button);
|
||||||
|
button->SetInkDropEnabled(true);
|
||||||
|
button->SetHorizontalAlignment(CEF_HORIZONTAL_ALIGNMENT_CENTER);
|
||||||
|
}
|
||||||
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,12 +604,14 @@ void ViewsWindow::AddControls() {
|
||||||
CefRefPtr<CefTextfield> url_textfield = CefTextfield::CreateTextfield(this);
|
CefRefPtr<CefTextfield> url_textfield = CefTextfield::CreateTextfield(this);
|
||||||
url_textfield->SetID(ID_URL_TEXTFIELD);
|
url_textfield->SetID(ID_URL_TEXTFIELD);
|
||||||
url_textfield->SetEnabled(false); // Disabled by default.
|
url_textfield->SetEnabled(false); // Disabled by default.
|
||||||
|
views_style::ApplyTo(url_textfield);
|
||||||
|
|
||||||
// Create the menu button.
|
// Create the menu button.
|
||||||
CefRefPtr<CefMenuButton> menu_button =
|
CefRefPtr<CefMenuButton> menu_button =
|
||||||
CefMenuButton::CreateMenuButton(this, CefString(), false, false);
|
CefMenuButton::CreateMenuButton(this, CefString(), false, false);
|
||||||
menu_button->SetID(ID_MENU_BUTTON);
|
menu_button->SetID(ID_MENU_BUTTON);
|
||||||
menu_button->SetImage(CEF_BUTTON_STATE_NORMAL, LoadImageIcon("menu_icon"));
|
menu_button->SetImage(CEF_BUTTON_STATE_NORMAL, LoadImageIcon("menu_icon"));
|
||||||
|
views_style::ApplyTo(menu_button.get());
|
||||||
menu_button->SetInkDropEnabled(true);
|
menu_button->SetInkDropEnabled(true);
|
||||||
// Override the default minimum size.
|
// Override the default minimum size.
|
||||||
menu_button->SetMinimumSize(CefSize(0, 0));
|
menu_button->SetMinimumSize(CefSize(0, 0));
|
||||||
|
@ -587,6 +630,7 @@ void ViewsWindow::AddControls() {
|
||||||
top_panel->AddChildView(browse_buttons[i]);
|
top_panel->AddChildView(browse_buttons[i]);
|
||||||
top_panel->AddChildView(url_textfield);
|
top_panel->AddChildView(url_textfield);
|
||||||
top_panel->AddChildView(menu_button);
|
top_panel->AddChildView(menu_button);
|
||||||
|
views_style::ApplyTo(top_panel);
|
||||||
|
|
||||||
// Allow |url_textfield| to grow and fill any remaining space.
|
// Allow |url_textfield| to grow and fill any remaining space.
|
||||||
top_panel_layout->SetFlexForView(url_textfield, 1);
|
top_panel_layout->SetFlexForView(url_textfield, 1);
|
||||||
|
|
|
@ -86,6 +86,7 @@ class ViewsWindow : public CefBrowserViewDelegate,
|
||||||
bool canGoForward);
|
bool canGoForward);
|
||||||
void SetDraggableRegions(const std::vector<CefDraggableRegion>& regions);
|
void SetDraggableRegions(const std::vector<CefDraggableRegion>& regions);
|
||||||
void TakeFocus(bool next);
|
void TakeFocus(bool next);
|
||||||
|
void OnBeforeContextMenu(CefRefPtr<CefMenuModel> model);
|
||||||
|
|
||||||
// CefBrowserViewDelegate methods:
|
// CefBrowserViewDelegate methods:
|
||||||
bool OnPopupBrowserViewCreated(
|
bool OnPopupBrowserViewCreated(
|
||||||
|
@ -164,6 +165,7 @@ class ViewsWindow : public CefBrowserViewDelegate,
|
||||||
CefRefPtr<CefMenuModel> button_menu_model_;
|
CefRefPtr<CefMenuModel> button_menu_model_;
|
||||||
CefRefPtr<ViewsMenuBar> top_menu_bar_;
|
CefRefPtr<ViewsMenuBar> top_menu_bar_;
|
||||||
bool menu_has_focus_;
|
bool menu_has_focus_;
|
||||||
|
int last_focused_view_;
|
||||||
|
|
||||||
CefSize minimum_window_size_;
|
CefSize minimum_window_size_;
|
||||||
|
|
||||||
|
|
|
@ -393,6 +393,79 @@ class TestMenuButtonDelegate : public CefMenuButtonDelegate,
|
||||||
CefRefPtr<CefMenuModel> model = CefMenuModel::CreateMenuModel(this);
|
CefRefPtr<CefMenuModel> model = CefMenuModel::CreateMenuModel(this);
|
||||||
model->AddItem(kMenuItemID, kMenuItemLabel);
|
model->AddItem(kMenuItemID, kMenuItemLabel);
|
||||||
|
|
||||||
|
// Verify color accessors.
|
||||||
|
for (int i = 0; i < CEF_MENU_COLOR_COUNT; ++i) {
|
||||||
|
cef_menu_color_type_t color_type = static_cast<cef_menu_color_type_t>(i);
|
||||||
|
cef_color_t color_out;
|
||||||
|
cef_color_t color = CefColorSetARGB(255, 255, 255, i);
|
||||||
|
|
||||||
|
// No color set yet.
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColor(kMenuItemID, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(0, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(-1, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
|
||||||
|
// Set the default color.
|
||||||
|
EXPECT_TRUE(model->SetColorAt(-1, color_type, color));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(-1, color_type, color_out));
|
||||||
|
EXPECT_EQ(color, color_out);
|
||||||
|
|
||||||
|
// Clear the default color.
|
||||||
|
EXPECT_TRUE(model->SetColorAt(-1, color_type, 0));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(-1, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
|
||||||
|
// Set the index color.
|
||||||
|
EXPECT_TRUE(model->SetColorAt(0, color_type, color));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(0, color_type, color_out));
|
||||||
|
EXPECT_EQ(color, color_out);
|
||||||
|
|
||||||
|
// Clear the index color.
|
||||||
|
EXPECT_TRUE(model->SetColorAt(0, color_type, 0));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColorAt(0, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
|
||||||
|
// Set the ID color.
|
||||||
|
EXPECT_TRUE(model->SetColor(kMenuItemID, color_type, color));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColor(kMenuItemID, color_type, color_out));
|
||||||
|
EXPECT_EQ(color, color_out);
|
||||||
|
|
||||||
|
// Clear the ID color.
|
||||||
|
EXPECT_TRUE(model->SetColor(kMenuItemID, color_type, 0));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_TRUE(model->GetColor(kMenuItemID, color_type, color_out));
|
||||||
|
EXPECT_EQ(0U, color_out);
|
||||||
|
|
||||||
|
// Index/ID doesn't exist.
|
||||||
|
EXPECT_FALSE(model->SetColorAt(4, color_type, color));
|
||||||
|
EXPECT_FALSE(model->SetColor(4, color_type, color));
|
||||||
|
color_out = 1;
|
||||||
|
EXPECT_FALSE(model->GetColorAt(4, color_type, color_out));
|
||||||
|
EXPECT_FALSE(model->GetColor(4, color_type, color_out));
|
||||||
|
EXPECT_EQ(1U, color_out);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify font accessors.
|
||||||
|
const std::string& font = "Tahoma, 12px";
|
||||||
|
EXPECT_TRUE(model->SetFontListAt(0, font));
|
||||||
|
EXPECT_TRUE(model->SetFontListAt(0, CefString()));
|
||||||
|
EXPECT_TRUE(model->SetFontList(kMenuItemID, font));
|
||||||
|
EXPECT_TRUE(model->SetFontList(kMenuItemID, CefString()));
|
||||||
|
|
||||||
|
// Index/ID doesn't exist.
|
||||||
|
EXPECT_FALSE(model->SetFontListAt(4, font));
|
||||||
|
EXPECT_FALSE(model->SetFontList(4, font));
|
||||||
|
|
||||||
// Wait a bit before trying to click the menu item.
|
// Wait a bit before trying to click the menu item.
|
||||||
CefPostDelayedTask(TID_UI, base::Bind(ClickMenuItem, menu_button),
|
CefPostDelayedTask(TID_UI, base::Bind(ClickMenuItem, menu_button),
|
||||||
kClickDelayMS);
|
kClickDelayMS);
|
||||||
|
|
Loading…
Reference in New Issue