[Add] More vscroll widget work. Still incomplete though.
This commit is contained in:
		
							parent
							
								
									d7cd76510c
								
							
						
					
					
						commit
						406646f5f0
					
				| @ -10,11 +10,11 @@ include_HEADERS = body.h frame.h generic_system_view.h glfreetype.h gui_button.h | |||||||
| 		planet.h player.h dynamic_body.h sector.h sector_view.h ship_cpanel.h ship.h space.h star.h star_system.h system_info_view.h \
 | 		planet.h player.h dynamic_body.h sector.h sector_view.h ship_cpanel.h ship.h space.h star.h star_system.h system_info_view.h \
 | ||||||
| 		system_view.h vector3.h view.h world_view.h utils.h space_station.h space_station_view.h model_body.h gui_iselectable.h \
 | 		system_view.h vector3.h view.h world_view.h utils.h space_station.h space_station_view.h model_body.h gui_iselectable.h \
 | ||||||
| 		ship_type.h object.h info_view.h model_coll_mesh_data.h object_viewer_view.h fixed.h custom_starsystems.h gameconsts.h \
 | 		ship_type.h object.h info_view.h model_coll_mesh_data.h object_viewer_view.h fixed.h custom_starsystems.h gameconsts.h \
 | ||||||
| 		aabb.h serializer.h sfx.h gui_vscroll_bar.h | 		aabb.h serializer.h sfx.h gui_vscroll_portal.h gui_vscroll_bar.h gui_adjustment.h | ||||||
| 
 | 
 | ||||||
| libgui_a_SOURCES = gui_button.cpp gui.cpp gui_fixed.cpp gui_screen.cpp gui_label.cpp gui_tooltip.cpp gui_toggle_button.cpp gui_radio_button.cpp \
 | libgui_a_SOURCES = gui_button.cpp gui.cpp gui_fixed.cpp gui_screen.cpp gui_label.cpp gui_tooltip.cpp gui_toggle_button.cpp gui_radio_button.cpp \
 | ||||||
| 									 gui_radio_group.cpp gui_image_button.cpp gui_image.cpp gui_image_radio_button.cpp gui_multi_state_image_button.cpp gui_widget.cpp \
 | 									 gui_radio_group.cpp gui_image_button.cpp gui_image.cpp gui_image_radio_button.cpp gui_multi_state_image_button.cpp gui_widget.cpp \
 | ||||||
| 									 gui_container.cpp gui_vscroll_bar.cpp | 									 gui_container.cpp gui_vscroll_portal.cpp gui_vscroll_bar.cpp | ||||||
| 
 | 
 | ||||||
| Lephisto3D_SOURCES	= main.cpp glfreetype.cpp body.cpp space.cpp ship.cpp player.cpp dynamic_body.cpp planet.cpp \
 | Lephisto3D_SOURCES	= main.cpp glfreetype.cpp body.cpp space.cpp ship.cpp player.cpp dynamic_body.cpp planet.cpp \
 | ||||||
| 											star.cpp frame.cpp ship_cpanel.cpp sector_view.cpp mtrand.cpp world_view.cpp system_view.cpp \
 | 											star.cpp frame.cpp ship_cpanel.cpp sector_view.cpp mtrand.cpp world_view.cpp system_view.cpp \
 | ||||||
|  | |||||||
							
								
								
									
										16
									
								
								src/gui_adjustment.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/gui_adjustment.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | |||||||
|  | #pragma once | ||||||
|  | 
 | ||||||
|  | namespace Gui { | ||||||
|  | 
 | ||||||
|  | class Adjustment { | ||||||
|  | public: | ||||||
|  |   Adjustment(void): m_values(0) {} | ||||||
|  |   float GetValue(void) { return m_value; } | ||||||
|  |   void SetValue(float v) { m_value = (v>0?(v<1?v:1):0); } | ||||||
|  | 
 | ||||||
|  | private: | ||||||
|  |   float m_value; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -103,6 +103,15 @@ void Container::AppendChild(Widget* child, float x, float y) { | |||||||
|   m_children.push_back(wp); |   m_children.push_back(wp); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Container::RemoveChild(Widget* child) { | ||||||
|  |   for(std::list<widget_pos>::iterator i = m_children.begin(); i != m_children.end(); ++i) { | ||||||
|  |     if((*i).w == child) { | ||||||
|  |       m_children.erase(i); | ||||||
|  |       return; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Container::Draw(void) { | void Container::Draw(void) { | ||||||
|   for(std::list<widget_pos>::iterator i = m_children.begin(); i != m_children.end(); ++i) { |   for(std::list<widget_pos>::iterator i = m_children.begin(); i != m_children.end(); ++i) { | ||||||
|     if(!(*i).w->IsVisible()) continue; |     if(!(*i).w->IsVisible()) continue; | ||||||
|  | |||||||
| @ -15,12 +15,14 @@ namespace Gui { | |||||||
|     virtual void Draw(void); |     virtual void Draw(void); | ||||||
|     virtual void ShowAll(void); |     virtual void ShowAll(void); | ||||||
|     virtual void HideAll(void); |     virtual void HideAll(void); | ||||||
|  |     virtual void OnChildResizeRequest(Widget*) = 0; | ||||||
|   private: |   private: | ||||||
|     void _OnMouseLeave(void); |     void _OnMouseLeave(void); | ||||||
|     bool HandleMouseEvent(MouseButtonEvent* e); |     bool HandleMouseEvent(MouseButtonEvent* e); | ||||||
|   protected: |   protected: | ||||||
|     void PrependChild(Widget* w, float x, float y); |     void PrependChild(Widget* w, float x, float y); | ||||||
|     void AppendChild(Widget* w, float x, float y); |     void AppendChild(Widget* w, float x, float y); | ||||||
|  |     void RemoveChild(Widget* w); | ||||||
| 
 | 
 | ||||||
|     struct widget_pos { |     struct widget_pos { | ||||||
|       Widget* w; |       Widget* w; | ||||||
|  | |||||||
| @ -20,29 +20,44 @@ Fixed::~Fixed(void) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Fixed::Draw(void) { | void Fixed::Draw(void) { | ||||||
|  |   float size[2]; | ||||||
|  |   GetSize(size); | ||||||
|   if(!m_transparent) { |   if(!m_transparent) { | ||||||
|     glBegin(GL_QUADS); |     glBegin(GL_QUADS); | ||||||
|       glColor3f(m_bgcol[0], m_bgcol[1], m_bgcol[2]); |       glColor3f(m_bgcol[0], m_bgcol[1], m_bgcol[2]); | ||||||
|       glVertex2f(0, m_h); |       glVertex2f(0, size[1]); | ||||||
|       glVertex2f(m_w, m_h); |       glVertex2f(size[0], size[1]); | ||||||
|       glVertex2f(m_w, 0); |       glVertex2f(size[0], 0); | ||||||
|       glVertex2f(0, 0); |       glVertex2f(0, 0); | ||||||
|     glEnd(); |     glEnd(); | ||||||
|   } |   } | ||||||
|   Container::Draw(); |   Container::Draw(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Fixed::OnChildResizeRequest(Widget* child) { | ||||||
|  |   for(std::list<widget_pos>::iterator i = m_children.begin(); i != m_children.end(); ++i) { | ||||||
|  |     if((*i).w == child) { | ||||||
|  |       float rsize[2] = { m_w - (*i).pos[0], | ||||||
|  |                          m_h - (*i).pos[1] }; | ||||||
|  |       child->GetSizeRequested(rsize); | ||||||
|  |       if((*i).pos[0] + rsize[0] > m_w) rsize[0] = m_w - (*i).pos[0]; | ||||||
|  |       if((*i).pos[1] + rsize[1] > m_h) rsize[1] = m_w - (*i).pos[1]; | ||||||
|  |       child->SetSize(rsize[0], rsize[1]); | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Fixed::Add(Widget* child, float x, float y) { | void Fixed::Add(Widget* child, float x, float y) { | ||||||
|   AppendChild(child, x, y); |   AppendChild(child, x, y); | ||||||
|  |   float rsize[2] = { m_w - x, m_h - y }; | ||||||
|  |   child->GetSizeRequested(rsize); | ||||||
|  |   if(x+rsize[0] > m_w) rsize[0] = m_w-x; | ||||||
|  |   if(y+rsize[1] > m_h) rsize[1] = m_h-y; | ||||||
|  |   child->SetSize(rsize[0], rsize[1]); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Fixed::Remove(Widget* child) { | void Fixed::Remove(Widget* child) { | ||||||
|   for(std::list<widget_pos>::iterator i = m_children.begin(); i != m_children.end(); ++i) { |   Container::RemoveChild(child); | ||||||
|     if((*i).w == child) { |  | ||||||
|       m_children.erase(i); |  | ||||||
|       return; |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Fixed::SetBgColor(float rgb[3]) { | void Fixed::SetBgColor(float rgb[3]) { | ||||||
|  | |||||||
| @ -13,6 +13,7 @@ namespace Gui { | |||||||
|     virtual void Draw(void); |     virtual void Draw(void); | ||||||
|     virtual ~Fixed(void); |     virtual ~Fixed(void); | ||||||
|     virtual void GetSizeRequested(float size[2]); |     virtual void GetSizeRequested(float size[2]); | ||||||
|  |     virtual void OnChildResizeRequest(Widget*); | ||||||
|     void SetBgColor(float rgb[3]); |     void SetBgColor(float rgb[3]); | ||||||
|     void SetBgColor(float r, float g, float b); |     void SetBgColor(float r, float g, float b); | ||||||
|     void SetTransparency(bool a) { m_transparent = a; } |     void SetTransparency(bool a) { m_transparent = a; } | ||||||
|  | |||||||
| @ -3,19 +3,21 @@ | |||||||
| namespace Gui { | namespace Gui { | ||||||
| 
 | 
 | ||||||
| Label::Label(const char* text) { | Label::Label(const char* text) { | ||||||
|  |   m_dlist = 0; | ||||||
|   SetText(text); |   SetText(text); | ||||||
|   m_color[0] = m_color[1] = m_color[2] = 1.0f; |   m_color[0] = m_color[1] = m_color[2] = 1.0f; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| Label::Label(std::string& text) { | Label::Label(std::string& text) { | ||||||
|  |   m_dlist = 0; | ||||||
|   SetText(text); |   SetText(text); | ||||||
|   m_color[0] = m_color[1] = m_color[2] = 1.0f; |   m_color[0] = m_color[1] = m_color[2] = 1.0f; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Label::RecalcSize(void) { | void Label::RecalcSize(void) { | ||||||
|   float w, h; |   //float size[2];
 | ||||||
|   Screen::MeasureString(m_text, w, h); |   //Screen::MeasureLayout(m_text, FLT_MAX, size);
 | ||||||
|   SetSize(w,h); |   ResizeRequest(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Label::SetText(const char* text) { | void Label::SetText(const char* text) { | ||||||
| @ -29,24 +31,20 @@ void Label::SetText(std::string& text) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Label::Draw(void) { | void Label::Draw(void) { | ||||||
| #if 0 |  | ||||||
|   float size[2]; GetSize(size); |   float size[2]; GetSize(size); | ||||||
|   glColor3f(1, 0, 0); |   /*glColor3f(1, 0, 0);
 | ||||||
|   glBegin(GL_QUADS); |   glBegin(GL_QUADS); | ||||||
|     glVertex2f(0, size[1]); |     glVertex2f(0, size[1]); | ||||||
|     glVertex2f(size[0]), size[1]); |     glVertex2f(size[0]), size[1]); | ||||||
|     glVertex2f(size[0], 0); |     glVertex2f(size[0], 0); | ||||||
|     glVertex2f(0, 0); |     glVertex2f(0, 0); | ||||||
|   glEnd(); |   glEnd();*/ | ||||||
| #endif /* 0 */ |  | ||||||
|   glColor3fv(m_color); |   glColor3fv(m_color); | ||||||
|   Screen::RenderMarkup(m_text); |   Screen::LayoutString(m_text, size[0]); | ||||||
|   //Screen::LayoutString(m_text, 400);
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Label::GetSizeRequested(float size[2]) { | void Label::GetSizeRequested(float size[2]) { | ||||||
|   RecalcSize(); |   Screen::MeasureLayout(m_text, size[0], size); | ||||||
|   GetSize(size); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void Label::SetColor(float r, float g, float b) { | void Label::SetColor(float r, float g, float b) { | ||||||
|  | |||||||
| @ -17,6 +17,7 @@ namespace Gui { | |||||||
|     void RecalcSize(void); |     void RecalcSize(void); | ||||||
|     std::string m_text; |     std::string m_text; | ||||||
|     float m_color[3]; |     float m_color[3]; | ||||||
|  |     GLuint m_dlist; | ||||||
|   }; |   }; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -140,6 +140,19 @@ void Screen::MeasureString(const std::string& s, float& w, float& h) { | |||||||
|   h *= fontScale; |   h *= fontScale; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Screen::MeasureLayout(const std::string& s, const float width, float outSize[2]) { | ||||||
|  |   font->MeasureLayout(s.c_str(), width, outSize); | ||||||
|  |   outSize[0] *= Screen::fontScale; | ||||||
|  |   outSize[1] *= Screen::fontScale; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void Screen::LayoutString(const std::string& s, const float width) { | ||||||
|  |   glPushMatrix(); | ||||||
|  |   glScalef(Screen::fontScale, Screen::fontScale, 1); | ||||||
|  |   font->LayoutString(s.c_str(), width); | ||||||
|  |   glPopMatrix(); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void Screen::RenderString(const std::string& s) { | void Screen::RenderString(const std::string& s) { | ||||||
|   glPushMatrix(); |   glPushMatrix(); | ||||||
|   glScalef(Screen::fontScale, Screen::fontScale, 1); |   glScalef(Screen::fontScale, Screen::fontScale, 1); | ||||||
|  | |||||||
| @ -14,7 +14,8 @@ namespace Gui { | |||||||
|     static void OnMouseMotion(SDL_MouseMotionEvent* e); |     static void OnMouseMotion(SDL_MouseMotionEvent* e); | ||||||
|     static void OnClick(SDL_MouseButtonEvent* e); |     static void OnClick(SDL_MouseButtonEvent* e); | ||||||
|     static void OnKeyDown(const SDL_keysym* sym); |     static void OnKeyDown(const SDL_keysym* sym); | ||||||
|     static void LayoutString(const std::string& s, float width); |     static void LayoutString(const std::string& s, const float width); | ||||||
|  |     static void MeasureLayout(const std::string& s, const float width, float outSize[2]); | ||||||
|     static void RenderString(const std::string& s); |     static void RenderString(const std::string& s); | ||||||
|     static void MeasureString(const std::string& s, float& w, float& h); |     static void MeasureString(const std::string& s, float& w, float& h); | ||||||
|     static void RenderMarkup(const std::string& s); |     static void RenderMarkup(const std::string& s); | ||||||
|  | |||||||
| @ -61,9 +61,8 @@ void ToolTip::Draw(void) { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void ToolTip::GetSizeRequested(float size[2]) { | void ToolTip::GetSizeRequested(float size[2]) { | ||||||
| #pragma message("Not setting size correctly.") |   Screen::MeasureString(m_text, size[0], size[1]); | ||||||
|   size[0] = 70; |   size[0] += 2 * TOOLTIP_PADDING; | ||||||
|   size[1] = 10; |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -109,6 +109,14 @@ void Widget::Hide(void) { | |||||||
|   } |   } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void Widget::ResizeRequest(void) { | ||||||
|  |   if(m_parent) m_parent->OnChildrenResizeRequest(this); | ||||||
|  |   else { | ||||||
|  |     float size[2] = { FLT_MAX, FLT_MAX }; | ||||||
|  |     GetSizeRequested(size); | ||||||
|  |     SetSize(size[0], size[1]); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
| Widget::~Widget(void) { | Widget::~Widget(void) { | ||||||
|   if(m_tooltipWidget) { |   if(m_tooltipWidget) { | ||||||
|     Screen::RemoveBaseWidget(m_tooltipWidget); |     Screen::RemoveBaseWidget(m_tooltipWidget); | ||||||
|  | |||||||
| @ -9,12 +9,17 @@ namespace Gui { | |||||||
|     Widget(void); |     Widget(void); | ||||||
|     virtual void Draw(void) = 0; |     virtual void Draw(void) = 0; | ||||||
|     virtual ~Widget(void); |     virtual ~Widget(void); | ||||||
|  |     /**
 | ||||||
|  |      * Containers call this on children. input: size[] will contain max permissable size | ||||||
|  |      * output: size[] will contain what space the widget desires. | ||||||
|  |      */ | ||||||
|     virtual void GetSizeRequested(float size[2]) = 0; |     virtual void GetSizeRequested(float size[2]) = 0; | ||||||
|     void GetPosition(float pos[2]) const { pos[0] = m_size.x; pos[1] = m_size.y; } |     void GetPosition(float pos[2]) const { pos[0] = m_size.x; pos[1] = m_size.y; } | ||||||
|     void GetAbsolutePosition(float pos[2]); |     void GetAbsolutePosition(float pos[2]); | ||||||
|     void SetPosition(float x, float y)  { m_size.x = x; m_size.y = y; } |     void SetPosition(float x, float y)  { m_size.x = x; m_size.y = y; } | ||||||
|     void GetSize(float size[2])         { size[0] = m_size.w; size[1] = m_size.h; } |     void GetSize(float size[2])         { size[0] = m_size.w; size[1] = m_size.h; } | ||||||
|     void SetSize(float w, float h)      { m_size.w = w; m_size.h = h; }; |     void SetSize(float w, float h)      { m_size.w = w; m_size.h = h; }; | ||||||
|  |     void ResizeRequest(void); | ||||||
|     void SetShortcut(SDLKey key, SDLMod mod); |     void SetShortcut(SDLKey key, SDLMod mod); | ||||||
|     void SetClipping(float width, float height); |     void SetClipping(float width, float height); | ||||||
|     void EndClipping(void); |     void EndClipping(void); | ||||||
|  | |||||||
| @ -31,6 +31,13 @@ private: | |||||||
| StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(parent) { | StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(parent) { | ||||||
|   SetTransparency(false); |   SetTransparency(false); | ||||||
| 
 | 
 | ||||||
|  |   Gui::Fixed* fbox = new Gui::Fixed(720, 150); | ||||||
|  |   Add(fbox, 40, 100); | ||||||
|  | 
 | ||||||
|  |   Gui::VScrollBar* scroll = new Gui::VScrollBar(); | ||||||
|  |   Gui::VScrollPortal* box = new Gui::VScrollPortal(400, 150); | ||||||
|  |   scroll->SetAdjustment(&box->vscollAdjust); | ||||||
|  | 
 | ||||||
|   Gui::Label* l = new Gui::Label("Hello friend! Thankyou for docking with this space station! " |   Gui::Label* l = new Gui::Label("Hello friend! Thankyou for docking with this space station! " | ||||||
|     "You may have noticed that the docking procedure was not entirely " |     "You may have noticed that the docking procedure was not entirely " | ||||||
|     "physically correct. this is a result of unimplemented physics in this " |     "physically correct. this is a result of unimplemented physics in this " | ||||||
| @ -41,7 +48,12 @@ StationFrontView::StationFrontView(SpaceStationView* parent): StationSubView(par | |||||||
|     "can offer you this promotional message from one of the station's sponsors: \n" |     "can offer you this promotional message from one of the station's sponsors: \n" | ||||||
|     "         ADOPT A CAT: THEY CHEW IMPORTANT CABLES!"); |     "         ADOPT A CAT: THEY CHEW IMPORTANT CABLES!"); | ||||||
| 
 | 
 | ||||||
|   Add(l, 40, 100); | 
 | ||||||
|  |   fbox->Add(box, 0, 0); | ||||||
|  |   fbox->Add(scroll, 405, 0); | ||||||
|  |   box->Add(l); | ||||||
|  |   box->ShowAll(); | ||||||
|  |   fbox->ShowAll(); | ||||||
| 
 | 
 | ||||||
|   Gui::SolidButton* b = new Gui::SolidButton(); |   Gui::SolidButton* b = new Gui::SolidButton(); | ||||||
|   b->onClick.connect(sigc::mem_fun(this, &StationFrontView::OnClickRequestLaunch)); |   b->onClick.connect(sigc::mem_fun(this, &StationFrontView::OnClickRequestLaunch)); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Allanis
						Allanis