1 // This file is part of GtkEveMon.
2 //
3 // GtkEveMon is free software: you can redistribute it and/or modify
4 // it under the terms of the GNU General Public License as published by
5 // the Free Software Foundation, either version 3 of the License, or
6 // (at your option) any later version.
7 //
8 // You should have received a copy of the GNU General Public License
9 // along with GtkEveMon. If not, see <http://www.gnu.org/licenses/>.
10 
11 #ifndef GTK_ITEM_BROWSER_HEADER
12 #define GTK_ITEM_BROWSER_HEADER
13 
14 #include <gtkmm.h>
15 
16 #include "api/apicharsheet.h"
17 #include "gtkplannerbase.h"
18 
19 class ItemBrowserBase
20 {
21   private:
22     SignalApiElementSelected sig_element_selected;
23     SignalApiElementActivated sig_element_activated;
24     SignalPlanningRequested sig_planning_requested;
25 
26   protected:
27     ApiCharSheetPtr charsheet;
28     GuiPlannerElemCols cols;
29     Glib::RefPtr<Gtk::TreeStore> store;
30     GtkListViewHelper view;
31 
32   protected:
33     /* Executed if the item selection changed. */
34     void on_selection_changed (void);
35     /* Executed if some item is double clicked. */
36     void on_row_activated (Gtk::TreeModel::Path const& path,
37         Gtk::TreeViewColumn* col);
38     /* Executed if a mouse button is pressed. */
39     void on_view_button_pressed (GdkEventButton* event);
40     /* Executed if planning was requested from the context menu. */
41     void on_planning_requested (ApiElement const* skill, int level);
42     /* Tooltip query. */
43     bool on_query_element_tooltip (int x, int y, bool key,
44         Glib::RefPtr<Gtk::Tooltip> const& tooltip);
45 
46   public:
47     ItemBrowserBase (void);
~ItemBrowserBase(void)48     virtual ~ItemBrowserBase (void) {};
49     virtual void set_character (ApiCharSheetPtr charsheet);
50     virtual void fill_store (void) = 0;
51 
52     SignalApiElementSelected& signal_element_selected (void);
53     SignalApiElementActivated& signal_element_activated (void);
54     SignalPlanningRequested& signal_planning_requested (void);
55 };
56 
57 /* ---------------------------------------------------------------- */
58 
59 class GtkSkillBrowser : public ItemBrowserBase, public Gtk::Box
60 {
61   private:
62     Gtk::Entry filter_entry;
63     Gtk::ComboBoxText filter_cb;
64     Gtk::ComboBoxText primary_cb;
65     Gtk::ComboBoxText secondary_cb;
66 
67   protected:
68     void fill_store (void);
69     void clear_filter (void);
70     bool have_prerequisites_for_skill (ApiSkill const* skill);
71 
72   public:
73     GtkSkillBrowser (void);
74 };
75 
76 /* ---------------------------------------------------------------- */
77 
78 class GtkCertBrowser : public ItemBrowserBase, public Gtk::Box
79 {
80   protected:
81     enum CertPrerequisite
82     {
83       CERT_PRE_HAVE_NONE,
84       CERT_PRE_HAVE_SOME,
85       CERT_PRE_HAVE_ALL
86     };
87 
88   private:
89     Gtk::Entry filter_entry;
90     Gtk::ComboBoxText filter_cb;
91 
92   protected:
93     void fill_store (void);
94     void clear_filter (void);
95     CertPrerequisite check_prerequisites_for_cert (ApiCert const* cert);
96 
97   public:
98     GtkCertBrowser (void);
99 };
100 
101 /* ---------------------------------------------------------------- */
102 
103 inline SignalApiElementSelected&
signal_element_selected(void)104 ItemBrowserBase::signal_element_selected (void)
105 {
106   return this->sig_element_selected;
107 }
108 
109 inline SignalApiElementActivated&
signal_element_activated(void)110 ItemBrowserBase::signal_element_activated (void)
111 {
112   return this->sig_element_activated;
113 }
114 
115 inline SignalPlanningRequested&
signal_planning_requested(void)116 ItemBrowserBase::signal_planning_requested (void)
117 {
118   return this->sig_planning_requested;
119 }
120 
121 inline void
on_planning_requested(ApiElement const * elem,int level)122 ItemBrowserBase::on_planning_requested (ApiElement const* elem, int level)
123 {
124   this->sig_planning_requested.emit(elem, level);
125 }
126 
127 inline void
set_character(ApiCharSheetPtr charsheet)128 ItemBrowserBase::set_character (ApiCharSheetPtr charsheet)
129 {
130   this->charsheet = charsheet;
131   this->fill_store();
132 }
133 
134 #endif /* GTK_ITEM_BROWSER_HEADER */
135