~unity-team/unity/trunk

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// -*- Mode: C++; indent-tabs-mode: nil; tab-width: 2 -*-
/*
 * Copyright (C) 2010-2012 Canonical Ltd
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 3 as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 * Authored by: Mirco Müller <mirco.mueller@canonical.com>
 *              Jay Taoko <jay.taoko@canonical.com>
 *              Marco Trevisan <marco.trevisan@canonical.com>
 */

#ifndef QUICKLISTMENUITEM_H
#define QUICKLISTMENUITEM_H

#include <Nux/Nux.h>
#include <Nux/View.h>
#include <NuxGraphics/CairoGraphics.h>
#include <libdbusmenu-glib/menuitem.h>
#include <UnityCore/GLibWrapper.h>

#include <pango/pango.h>
#include <pango/pangocairo.h>

#include "unity-shared/Introspectable.h"

namespace unity
{

enum class QuicklistMenuItemType
{
  UNKNOWN = 0,
  LABEL,
  SEPARATOR,
  CHECK,
  RADIO
};

class QuicklistMenuItem : public nux::View, public debug::Introspectable
{
  NUX_DECLARE_OBJECT_TYPE(QuicklistMenuItem, nux::View);
public:
  typedef nux::ObjectPtr<QuicklistMenuItem> Ptr;

  QuicklistMenuItem(QuicklistMenuItemType type, glib::Object<DbusmenuMenuitem> const& item, NUX_FILE_LINE_PROTO);
  virtual ~QuicklistMenuItem();

  QuicklistMenuItemType GetItemType() const;
  virtual std::string GetLabel() const;
  virtual std::string GetPlainTextLabel() const;
  virtual bool GetEnabled() const;
  virtual bool GetActive() const;
  virtual bool GetVisible() const;
  virtual bool GetSelectable() const;

  void EnableLabelMarkup(bool enabled);
  bool IsMarkupEnabled() const;
  void EnableLabelMarkupAccel(bool enabled);
  bool IsMarkupAccelEnabled() const;

  void SetMaxLabelWidth(int max_width);
  int GetMaxLabelWidth() const;

  virtual void SetScale(double);
  double GetScale() const;

  bool IsOverlayQuicklist() const;

  void Activate() const;

  void Select(bool select = true);
  bool IsSelected() const;

  nux::Size const& GetTextExtents() const;
  void UpdateTexture();
  unsigned GetCairoSurfaceWidth() const;

  sigc::signal<void, QuicklistMenuItem*> sigTextChanged;
  sigc::signal<void, QuicklistMenuItem*> sigColorChanged;
  sigc::signal<void, QuicklistMenuItem*> sigMouseEnter;
  sigc::signal<void, QuicklistMenuItem*> sigMouseLeave;
  sigc::signal<void, QuicklistMenuItem*, int, int> sigMouseReleased;
  sigc::signal<void, QuicklistMenuItem*, int, int> sigMouseClick;
  sigc::signal<void, QuicklistMenuItem*, int, int> sigMouseDrag;

  static const char* MARKUP_ENABLED_PROPERTY;
  static const char* MARKUP_ACCEL_DISABLED_PROPERTY;
  static const char* MAXIMUM_LABEL_WIDTH_PROPERTY;
  static const char* OVERLAY_MENU_ITEM_PROPERTY;
  static const char* QUIT_ACTION_PROPERTY;

protected:
  // Introspection
  std::string GetName() const;
  void AddProperties(debug::IntrospectionData&);

  static const int ITEM_INDENT_ABS = 16;
  static const int ITEM_CORNER_RADIUS_ABS = 3;
  static const int ITEM_MARGIN = 4;

  void InitializeText();

  virtual std::string GetDefaultText() const;
  std::string GetText() const;

  static double Align(double val);

  void RecvMouseEnter(int x, int y, unsigned long button_flags, unsigned long key_flags);
  void RecvMouseLeave(int x, int y, unsigned long button_flags, unsigned long key_flags);
  void RecvMouseUp(int x, int y, unsigned long button_flags, unsigned long key_flags);
  void RecvMouseClick(int x, int y, unsigned long button_flags, unsigned long key_flags);
  void RecvMouseDrag(int x, int y, int dx, int dy, unsigned long button_flags, unsigned long key_flags);

  void PreLayoutManagement();
  long PostLayoutManagement(long layoutResult);

  virtual void UpdateTexture(nux::CairoGraphics&, double width, double height) = 0;
  void Draw(nux::GraphicsEngine& gfxContext, bool forceDraw);
  void DrawText(nux::CairoGraphics& cairo, double width, double height, nux::Color const& color);
  void DrawPrelight(nux::CairoGraphics& cairo, double width, double height, nux::Color const& color);

  nux::ObjectPtr<nux::BaseTexture> _normalTexture[2];
  nux::ObjectPtr<nux::BaseTexture> _prelightTexture[2];
  QuicklistMenuItemType _item_type;
  glib::Object<DbusmenuMenuitem> _menu_item;
  mutable Time _activate_timestamp;
  bool _prelight;
  int _pre_layout_width;
  int _pre_layout_height;
  double _scale;
  nux::Size _text_extents;
  std::string _text;
};

} // NAMESPACE

#endif // QUICKLISTMENUITEM_H