From: <geo...@us...> - 2008-11-23 04:28:45
|
Revision: 2685 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2685&view=rev Author: geoffthemedio Date: 2008-11-23 04:28:40 +0000 (Sun, 23 Nov 2008) Log Message: ----------- Minor changes to TechTreeWnd.cpp relating to graphviz later-version compatibility, which might let people with later versions run FreeOrion without segfaults. Mostly suggested by vleon1 in comments on a sourceforge bug report, but I added some additional #ifndef checks... most of this is checking for undefined macros (missing in later versions of graphviz) and defining them as needed. However, one line is commented out that might be important: setting the "ordering" default graph property. This didn't seem to have any consequences in-game for me, though this needs to be verified. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2008-11-23 03:54:28 UTC (rev 2684) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2008-11-23 04:28:40 UTC (rev 2685) @@ -22,7 +22,26 @@ #include <boost/timer.hpp> +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif +#ifndef PI +#define PI M_PI +#endif + +#ifndef POINTS_PER_INCH +#define POINTS_PER_INCH 72 +#endif + +#ifndef POINTS +#define POINTS(f_inch) (ROUND((f_inch)*POINTS_PER_INCH)) +#endif + +#ifndef PS2INCH +#define PS2INCH(ps) ((ps)/(double)POINTS_PER_INCH) +#endif + namespace { // command-line options void AddOptions(OptionsDB& db) @@ -1901,7 +1920,7 @@ // default graph properties agraphattr(graph, "rankdir", "LR"); - agraphattr(graph, "ordering", "in"); + //agraphattr(graph, "ordering", "in"); agraphattr(graph, "ranksep", const_cast<char*>(boost::lexical_cast<std::string>(RANK_SEP).c_str())); agraphattr(graph, "nodesep", const_cast<char*>(boost::lexical_cast<std::string>(NODE_SEP).c_str())); agraphattr(graph, "arrowhead", "none"); |
From: <tz...@us...> - 2009-02-19 03:07:12
|
Revision: 2827 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2827&view=rev Author: tzlaine Date: 2009-02-19 01:40:21 +0000 (Thu, 19 Feb 2009) Log Message: ----------- Small changes to silent gcc warnings. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-02-18 04:03:32 UTC (rev 2826) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-02-19 01:40:21 UTC (rev 2827) @@ -1624,7 +1624,7 @@ m_selected_tech = selected_tech; GVC_t* gvc = gvContext(); - Agraph_t* graph = agopen("FreeOrion Tech Graph", AGDIGRAPHSTRICT); + Agraph_t* graph = agopen(const_cast<char*>("FreeOrion Tech Graph"), AGDIGRAPHSTRICT); const double RANK_SEP = Value(TECH_PANEL_LAYOUT_WIDTH) * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing") * m_scale; const double NODE_SEP = Value(TECH_PANEL_LAYOUT_HEIGHT) * GetOptionsDB().Get<double>("UI.tech-layout-vert-spacing") * m_scale; @@ -1632,21 +1632,21 @@ const double HEIGHT = Value(TECH_PANEL_LAYOUT_HEIGHT) * m_scale; // default graph properties - agraphattr(graph, "rankdir", "LR"); + agraphattr(graph, const_cast<char*>("rankdir"), const_cast<char*>("LR")); //agraphattr(graph, "ordering", "in"); - agraphattr(graph, "ranksep", const_cast<char*>(boost::lexical_cast<std::string>(RANK_SEP).c_str())); - agraphattr(graph, "nodesep", const_cast<char*>(boost::lexical_cast<std::string>(NODE_SEP).c_str())); - agraphattr(graph, "arrowhead", "none"); - agraphattr(graph, "arrowtail", "none"); + agraphattr(graph, const_cast<char*>("ranksep"), const_cast<char*>(boost::lexical_cast<std::string>(RANK_SEP).c_str())); + agraphattr(graph, const_cast<char*>("nodesep"), const_cast<char*>(boost::lexical_cast<std::string>(NODE_SEP).c_str())); + agraphattr(graph, const_cast<char*>("arrowhead"), const_cast<char*>("none")); + agraphattr(graph, const_cast<char*>("arrowtail"), const_cast<char*>("none")); // default node properties - agnodeattr(graph, "shape", "box"); - agnodeattr(graph, "fixedsize", "true"); - agnodeattr(graph, "width", const_cast<char*>(boost::lexical_cast<std::string>(WIDTH).c_str())); - agnodeattr(graph, "height", const_cast<char*>(boost::lexical_cast<std::string>(HEIGHT).c_str())); + agnodeattr(graph, const_cast<char*>("shape"), const_cast<char*>("box")); + agnodeattr(graph, const_cast<char*>("fixedsize"), const_cast<char*>("true")); + agnodeattr(graph, const_cast<char*>("width"), const_cast<char*>(boost::lexical_cast<std::string>(WIDTH).c_str())); + agnodeattr(graph, const_cast<char*>("height"), const_cast<char*>(boost::lexical_cast<std::string>(HEIGHT).c_str())); // default edge properties - agedgeattr(graph, "tailclip", "false"); + agedgeattr(graph, const_cast<char*>("tailclip"), const_cast<char*>("false")); Logger().debugStream() << "Tech Tree Layout Preparing Tech Data"; @@ -1673,7 +1673,7 @@ Logger().debugStream() << "Tech Tree Layout Doing Graph Layout"; - gvLayout(gvc, graph, "dot"); + gvLayout(gvc, graph, const_cast<char*>("dot")); const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); |
From: <geo...@us...> - 2009-11-12 05:42:16
|
Revision: 3264 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3264&view=rev Author: geoffthemedio Date: 2009-11-12 05:42:09 +0000 (Thu, 12 Nov 2009) Log Message: ----------- Added a preprocessor define to TechTreeWnd.cpp to prevent compile errors about ND_coord_i not being defined when using graphviz versions later than 2.20 Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-11-12 05:26:46 UTC (rev 3263) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-11-12 05:42:09 UTC (rev 3264) @@ -38,25 +38,29 @@ #endif #ifndef M_PI -#define M_PI 3.14159265358979323846 +#define M_PI 3.14159265358979323846 #endif #ifndef PI -#define PI M_PI +#define PI M_PI #endif #ifndef POINTS_PER_INCH -#define POINTS_PER_INCH 72 +#define POINTS_PER_INCH 72 #endif #ifndef POINTS -#define POINTS(f_inch) (ROUND((f_inch)*POINTS_PER_INCH)) +#define POINTS(f_inch) (ROUND((f_inch)*POINTS_PER_INCH)) #endif #ifndef PS2INCH -#define PS2INCH(ps) ((ps)/(double)POINTS_PER_INCH) +#define PS2INCH(ps) ((ps)/(double)POINTS_PER_INCH) #endif +#ifndef ND_coord_i +#define ND_coord_i(n) (ND_coord(n)) +#endif + namespace { // command-line options void AddOptions(OptionsDB& db) |
From: <on...@us...> - 2009-12-22 13:09:46
|
Revision: 3287 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3287&view=rev Author: ondrejr Date: 2009-12-22 13:09:37 +0000 (Tue, 22 Dec 2009) Log Message: ----------- fixed bug 2795714 by wrwrwr Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-12-22 12:45:27 UTC (rev 3286) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-12-22 13:09:37 UTC (rev 3287) @@ -868,6 +868,7 @@ virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) {ForwardEventToParent();} void Update(); |
From: <geo...@us...> - 2010-12-08 05:08:52
|
Revision: 3873 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3873&view=rev Author: geoffthemedio Date: 2010-12-08 05:08:46 +0000 (Wed, 08 Dec 2010) Log Message: ----------- Reimplemented semi-working tech dependency lines. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2010-12-07 19:59:41 UTC (rev 3872) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2010-12-08 05:08:46 UTC (rev 3873) @@ -777,11 +777,11 @@ class TechPanel; typedef std::multimap<const Tech*, std::pair<const Tech*, - std::vector<std::vector<std::pair<double, double> > > > > DependencyArcsMap; - typedef std::map<TechStatus, DependencyArcsMap> DependencyArcsMapsByArcType; + std::vector<std::pair<double, + double> > > > DependencyLineSegmentsMap; + typedef std::map<TechStatus, DependencyLineSegmentsMap> DependencyLineSegmentsMapsByArcType; - class LayoutSurface : public GG::Wnd - { + class LayoutSurface : public GG::Wnd { public: LayoutSurface() : Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE | GG::DRAGABLE) {} virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) {DraggedSignal(move);} @@ -792,7 +792,7 @@ void Layout(bool keep_position, double old_scale = -1.0); bool TechVisible(const Tech* tech); - void DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head); + void DrawPolyLine(const std::vector<std::pair<double, double> >& vertices, const GG::Clr& color, bool with_arrow_head); void ScrolledSlot(int, int, int, int); void TechBrowsedSlot(const Tech* tech); void TechClickedSlot(const Tech* tech); @@ -808,8 +808,8 @@ std::set<TechStatus> m_tech_statuses_shown; const Tech* m_selected_tech; - std::map<const Tech*, TechPanel*> m_techs; - DependencyArcsMapsByArcType m_dependency_arcs; + std::map<const Tech*, TechPanel*> m_techs; + DependencyLineSegmentsMapsByArcType m_dependency_polylines; LayoutSurface* m_layout_surface; CUIScroll* m_vscroll; @@ -1196,79 +1196,88 @@ researchable_half_alpha.a = 127; GG::Clr unresearchable_half_alpha = ClientUI::UnresearchableTechTextAndBorderColor(); unresearchable_half_alpha.a = 127; - std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> > selected_arcs; - for (DependencyArcsMapsByArcType::const_iterator it = m_dependency_arcs.begin(); it != m_dependency_arcs.end(); ++it) { - GG::Clr arc_color; - switch (it->first) { - case TS_COMPLETE: arc_color = known_half_alpha; break; - case TS_RESEARCHABLE: arc_color = researchable_half_alpha; break; - default: arc_color = unresearchable_half_alpha; break; + for (DependencyLineSegmentsMapsByArcType::const_iterator it = m_dependency_polylines.begin(); it != m_dependency_polylines.end(); ++it) { + const DependencyLineSegmentsMap& dlsm = it->second; + for (DependencyLineSegmentsMap::const_iterator dlsm_it = dlsm.begin(); dlsm_it != dlsm.end(); ++dlsm_it) { + const Tech* prereq_tech = dlsm_it->first; + const Tech* postreq_tech = dlsm_it->second.first; + const std::vector<std::pair<double, double> >& vertices = dlsm_it->second.second; + DrawPolyLine(vertices, GG::CLR_WHITE, true); } - glColor(arc_color); - for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { - bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; - if (selected_arc) { - selected_arcs[it->first].push_back(it2); - continue; - } - DrawArc(it2, arc_color, false); - } } + //std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> > selected_arcs; + //for (DependencyArcsMapsByArcType::const_iterator it = m_dependency_arcs.begin(); it != m_dependency_arcs.end(); ++it) { + // GG::Clr arc_color; + // switch (it->first) { + // case TS_COMPLETE: arc_color = known_half_alpha; break; + // case TS_RESEARCHABLE: arc_color = researchable_half_alpha; break; + // default: arc_color = unresearchable_half_alpha; break; + // } + // glColor(arc_color); + // for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { + // bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; + // if (selected_arc) { + // selected_arcs[it->first].push_back(it2); + // continue; + // } + // DrawArc(it2, arc_color, false); + // } + //} GG::Clr known_half_alpha_selected = GG::LightColor(known_half_alpha); GG::Clr researchable_half_alpha_selected = GG::LightColor(researchable_half_alpha); GG::Clr unresearchable_half_alpha_selected = GG::LightColor(unresearchable_half_alpha); - for (std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> >::const_iterator it = selected_arcs.begin(); - it != selected_arcs.end(); - ++it) { - GG::Clr arc_color; - switch (it->first) { - case TS_COMPLETE: arc_color = known_half_alpha_selected; break; - case TS_RESEARCHABLE: arc_color = researchable_half_alpha_selected; break; - default: arc_color = unresearchable_half_alpha_selected; break; - } - glColor(arc_color); - for (unsigned int i = 0; i < it->second.size(); ++i) { - DrawArc(it->second[i], arc_color, false); - } - } + //for (std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> >::const_iterator it = selected_arcs.begin(); + // it != selected_arcs.end(); + // ++it) { + // GG::Clr arc_color; + // switch (it->first) { + // case TS_COMPLETE: arc_color = known_half_alpha_selected; break; + // case TS_RESEARCHABLE: arc_color = researchable_half_alpha_selected; break; + // default: arc_color = unresearchable_half_alpha_selected; break; + // } + // glColor(arc_color); + // for (unsigned int i = 0; i < it->second.size(); ++i) { + // DrawArc(it->second[i], arc_color, false); + // } + //} // now retrace the arc with a normal-width, full-alpha line glLineWidth(static_cast<GLfloat>(ARC_THICKNESS * m_scale * 0.5)); glDisable(GL_LINE_SMOOTH); - for (DependencyArcsMapsByArcType::const_iterator it = m_dependency_arcs.begin(); it != m_dependency_arcs.end(); ++it) { - GG::Clr arc_color; - switch (it->first) { - case TS_COMPLETE: arc_color = ClientUI::KnownTechTextAndBorderColor(); break; - case TS_RESEARCHABLE: arc_color = ClientUI::ResearchableTechTextAndBorderColor(); break; - default: arc_color = ClientUI::UnresearchableTechTextAndBorderColor(); break; - } - glColor(arc_color); - for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { - bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; - if (selected_arc) { - selected_arcs[it->first].push_back(it2); - continue; - } - DrawArc(it2, arc_color, true); - } - } + //for (DependencyArcsMapsByArcType::const_iterator it = m_dependency_arcs.begin(); it != m_dependency_arcs.end(); ++it) { + // GG::Clr arc_color; + // switch (it->first) { + // case TS_COMPLETE: arc_color = ClientUI::KnownTechTextAndBorderColor(); break; + // case TS_RESEARCHABLE: arc_color = ClientUI::ResearchableTechTextAndBorderColor(); break; + // default: arc_color = ClientUI::UnresearchableTechTextAndBorderColor(); break; + // } + // glColor(arc_color); + // for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { + // bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; + // if (selected_arc) { + // selected_arcs[it->first].push_back(it2); + // continue; + // } + // DrawArc(it2, arc_color, true); + // } + //} GG::Clr known_selected = GG::LightColor(ClientUI::KnownTechTextAndBorderColor()); GG::Clr researchable_selected = GG::LightColor(ClientUI::ResearchableTechTextAndBorderColor()); GG::Clr unresearchable_selected = GG::LightColor(ClientUI::UnresearchableTechTextAndBorderColor()); - for (std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> >::const_iterator it = selected_arcs.begin(); - it != selected_arcs.end(); - ++it) { - GG::Clr arc_color; - switch (it->first) { - case TS_COMPLETE: arc_color = known_selected; break; - case TS_RESEARCHABLE: arc_color = researchable_selected; break; - default: arc_color = unresearchable_selected; break; - } - glColor(arc_color); - for (unsigned int i = 0; i < it->second.size(); ++i) { - DrawArc(it->second[i], arc_color, true); - } - } + //for (std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> >::const_iterator it = selected_arcs.begin(); + // it != selected_arcs.end(); + // ++it) { + // GG::Clr arc_color; + // switch (it->first) { + // case TS_COMPLETE: arc_color = known_selected; break; + // case TS_RESEARCHABLE: arc_color = researchable_selected; break; + // default: arc_color = unresearchable_selected; break; + // } + // glColor(arc_color); + // for (unsigned int i = 0; i < it->second.size(); ++i) { + // DrawArc(it->second[i], arc_color, true); + // } + //} glPopMatrix(); glEnable(GL_TEXTURE_2D); EndClipping(); @@ -1306,7 +1315,7 @@ delete it->second; m_techs.clear(); - m_dependency_arcs.clear(); + m_dependency_polylines.clear(); m_selected_tech = 0; } @@ -1444,7 +1453,9 @@ const double WIDTH = Value(TECH_PANEL_LAYOUT_WIDTH); const double HEIGHT = Value(TECH_PANEL_LAYOUT_HEIGHT); + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + // graph layout ogdf::Graph G; @@ -1456,8 +1467,10 @@ TechManager& manager = GetTechManager(); + std::map<std::string, ogdf::node> tech_nodes; + std::map<ogdf::node, const Tech*> node_techs; + // add nodes - std::map<std::string, ogdf::node> tech_nodes; for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; if (!TechVisible(tech)) @@ -1466,8 +1479,11 @@ GA.labelNode(new_node) = UserString(tech->Name()).c_str(); GA.width(new_node) = HEIGHT; GA.height(new_node) = WIDTH; + tech_nodes[tech->Name()] = new_node; + node_techs[new_node] = tech; } + // add edges for prerequisites for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; @@ -1516,9 +1532,6 @@ Logger().errorStream() << "Unable to write Tech Graph GML file"; } - - const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - Logger().debugStream() << "Tech Tree Layout Creating Panels"; // create new tech panels @@ -1545,25 +1558,53 @@ } // create dependency lines + for (ogdf::edge e = G.firstEdge(); e != G.lastEdge()->succ(); e = e->succ()) { + ogdf::node source = e->source(); + ogdf::node target = e->target(); + if (!source || !target) + continue; - // for (edges) { - // const Tech* source = GetTech(source_tech_name?) - // const Tech* to = GetTech(target_tech_name?); - // if (!from || !to) - // continue; - // - // std::vector<std::pair<int, int> > points - // for (edge segments) { - // points.push_back(each_bend) ? - // } - // - // TechStatus arc_type = TS_RESEARCHABLE; - // if (empire) - // arc_type = empire->GetTechStatus(to->Name()); - // m_dependency_arcs[arc_type].insert(std::make_pair(from, std::make_pair(to, points))); - // } - //} + const Tech* source_tech(0); + std::map<ogdf::node, const Tech*>::const_iterator it = node_techs.find(source); + if (it != node_techs.end()) + source_tech = it->second; + else + continue; + const TechPanel* source_panel = m_techs[source_tech]; + const GG::X HALF_SOURCE_PANEL_WIDTH = source_panel->Width() / 2; + + const Tech* target_tech(0); + it = node_techs.find(target); + if (it != node_techs.end()) + target_tech = it->second; + else + continue; + + const TechPanel* target_panel = m_techs[target_tech]; + const GG::X HALF_TARGET_PANEL_WIDTH = target_panel->Width() / 2; + + // assemble vertices on dependenc line from graph layout results + std::vector<std::pair<double, double> > dependency_line_vertices; + // start + dependency_line_vertices.push_back(std::make_pair(GA.y(source) * m_scale/* + Value(HALF_SOURCE_PANEL_WIDTH)*/, + GA.x(source) * m_scale)); + // corners (may be none) + const ogdf::DPolyline& bends = GA.bends(e); + for (ogdf::DPolyline::const_iterator it = bends.begin(); it != bends.end(); ++it) { + const ogdf::DPoint& point = *it; + dependency_line_vertices.push_back(std::make_pair(point.m_y * m_scale, point.m_x * m_scale)); + } + // end + dependency_line_vertices.push_back(std::make_pair(GA.y(target) * m_scale/* - Value(HALF_TARGET_PANEL_WIDTH)*/, + GA.x(target) * m_scale)); + + TechStatus arc_type = TS_RESEARCHABLE; + if (empire) + arc_type = empire->GetTechStatus(source_tech->Name()); + m_dependency_polylines[arc_type].insert(std::make_pair(source_tech, std::make_pair(target_tech, dependency_line_vertices))); + } + const ogdf::DRect& bound_box = GA.boundingBox(); GG::X graph_width(bound_box.height() * m_scale); GG::Y graph_height(bound_box.width() * m_scale); @@ -1621,36 +1662,42 @@ return true; } -void TechTreeWnd::LayoutPanel::DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head) +void TechTreeWnd::LayoutPanel::DrawPolyLine(const std::vector<std::pair<double, double> >& vertices, const GG::Clr& color, bool with_arrow_head) { GG::Pt ul = UpperLeft(); + + glColor(color); + glBegin(GL_LINE_STRIP); - for (unsigned int i = 0; i < it->second.second.size(); ++i) { - for (unsigned int j = 0; j < it->second.second[i].size(); ++j) { - glVertex(it->second.second[i][j].first + ul.x, it->second.second[i][j].second + ul.y); - } - } + for (std::vector<std::pair<double, double> >::const_iterator it = vertices.begin(); it != vertices.end(); ++it) + glVertex(it->first + ul.x, it->second + ul.y); glEnd(); - if (with_arrow_head) { - double final_point_x = Value(it->second.second.back().back().first + ul.x); - double final_point_y = Value(it->second.second.back().back().second + ul.y); - double second_to_final_point_x = Value(it->second.second.back()[it->second.second.back().size() - 2].first + ul.x); - double second_to_final_point_y = Value(it->second.second.back()[it->second.second.back().size() - 2].second + ul.y); - const double ARROW_LENGTH = 10 * m_scale; - const double ARROW_WIDTH = 9 * m_scale; - glEnable(GL_TEXTURE_2D); - glPushMatrix(); - glTranslated(final_point_x, final_point_y, 0.0); - glRotated(std::atan2(final_point_y - second_to_final_point_y, final_point_x - second_to_final_point_x) * 180.0 / 3.141594, 0.0, 0.0, 1.0); - glTranslated(-final_point_x, -final_point_y, 0.0); - IsoscelesTriangle(GG::Pt(GG::X(static_cast<int>(final_point_x - ARROW_LENGTH + 0.5)), - GG::Y(static_cast<int>(final_point_y - ARROW_WIDTH / 2.0 + 0.5))), - GG::Pt(GG::X(static_cast<int>(final_point_x + 0.5)), - GG::Y(static_cast<int>(final_point_y + ARROW_WIDTH / 2.0 + 0.5))), - SHAPE_RIGHT, color, false); - glPopMatrix(); - glDisable(GL_TEXTURE_2D); - } + + if (!with_arrow_head || vertices.size() < 2) + return; + + std::vector<std::pair<double, double> >::const_reverse_iterator it = vertices.rbegin(); + double x2 = it->first + Value(ul.x); + double y2 = it->second + Value(ul.y); + ++it; + double x1 = it->first + Value(ul.x); + double y1 = it->second + Value(ul.y); + + const double ARROW_LENGTH = 10 * m_scale; + const double ARROW_WIDTH = 9 * m_scale; + + glEnable(GL_TEXTURE_2D); + glPushMatrix(); + glTranslated(x2, y2, 0.0); + glRotated(std::atan2(y2 - y1, x2 - x1) * 180.0 / 3.141594, 0.0, 0.0, 1.0); + glTranslated(-x2, -y2, 0.0); + IsoscelesTriangle(GG::Pt(GG::X(static_cast<int>(x2 - ARROW_LENGTH + 0.5)), + GG::Y(static_cast<int>(y2 - ARROW_WIDTH / 2.0 + 0.5))), + GG::Pt(GG::X(static_cast<int>(x2 + 0.5)), + GG::Y(static_cast<int>(y2 + ARROW_WIDTH / 2.0 + 0.5))), + SHAPE_RIGHT, color, false); + glPopMatrix(); + glDisable(GL_TEXTURE_2D); } void TechTreeWnd::LayoutPanel::ScrolledSlot(int, int, int, int) |
From: <geo...@us...> - 2010-12-16 22:59:33
|
Revision: 3885 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3885&view=rev Author: geoffthemedio Date: 2010-12-16 22:59:27 +0000 (Thu, 16 Dec 2010) Log Message: ----------- Wrapped creation of tech dependency lines in an if to ensure there is at least one line to create. This prevents a crash that would otherwise occur when there are no techs in techs.txt (or presumably any other case with no dependency lines after doing graph layout). Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2010-12-16 22:57:58 UTC (rev 3884) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2010-12-16 22:59:27 UTC (rev 3885) @@ -1558,51 +1558,53 @@ } // create dependency lines - for (ogdf::edge e = G.firstEdge(); e != G.lastEdge()->succ(); e = e->succ()) { - ogdf::node source = e->source(); - ogdf::node target = e->target(); - if (!source || !target) - continue; + if (G.numberOfEdges() > 0) { + for (ogdf::edge e = G.firstEdge(); e != G.lastEdge()->succ(); e = e->succ()) { + ogdf::node source = e->source(); + ogdf::node target = e->target(); + if (!source || !target) + continue; - const Tech* source_tech(0); - std::map<ogdf::node, const Tech*>::const_iterator it = node_techs.find(source); - if (it != node_techs.end()) - source_tech = it->second; - else - continue; + const Tech* source_tech(0); + std::map<ogdf::node, const Tech*>::const_iterator it = node_techs.find(source); + if (it != node_techs.end()) + source_tech = it->second; + else + continue; - const TechPanel* source_panel = m_techs[source_tech]; - const GG::X HALF_SOURCE_PANEL_WIDTH = source_panel->Width() / 2; + const TechPanel* source_panel = m_techs[source_tech]; + const GG::X HALF_SOURCE_PANEL_WIDTH = source_panel->Width() / 2; - const Tech* target_tech(0); - it = node_techs.find(target); - if (it != node_techs.end()) - target_tech = it->second; - else - continue; + const Tech* target_tech(0); + it = node_techs.find(target); + if (it != node_techs.end()) + target_tech = it->second; + else + continue; - const TechPanel* target_panel = m_techs[target_tech]; - const GG::X HALF_TARGET_PANEL_WIDTH = target_panel->Width() / 2; + const TechPanel* target_panel = m_techs[target_tech]; + const GG::X HALF_TARGET_PANEL_WIDTH = target_panel->Width() / 2; - // assemble vertices on dependenc line from graph layout results - std::vector<std::pair<double, double> > dependency_line_vertices; - // start - dependency_line_vertices.push_back(std::make_pair(GA.y(source) * m_scale/* + Value(HALF_SOURCE_PANEL_WIDTH)*/, - GA.x(source) * m_scale)); - // corners (may be none) - const ogdf::DPolyline& bends = GA.bends(e); - for (ogdf::DPolyline::const_iterator it = bends.begin(); it != bends.end(); ++it) { - const ogdf::DPoint& point = *it; - dependency_line_vertices.push_back(std::make_pair(point.m_y * m_scale, point.m_x * m_scale)); + // assemble vertices on dependenc line from graph layout results + std::vector<std::pair<double, double> > dependency_line_vertices; + // start + dependency_line_vertices.push_back(std::make_pair(GA.y(source) * m_scale/* + Value(HALF_SOURCE_PANEL_WIDTH)*/, + GA.x(source) * m_scale)); + // corners (may be none) + const ogdf::DPolyline& bends = GA.bends(e); + for (ogdf::DPolyline::const_iterator it = bends.begin(); it != bends.end(); ++it) { + const ogdf::DPoint& point = *it; + dependency_line_vertices.push_back(std::make_pair(point.m_y * m_scale, point.m_x * m_scale)); + } + // end + dependency_line_vertices.push_back(std::make_pair(GA.y(target) * m_scale/* - Value(HALF_TARGET_PANEL_WIDTH)*/, + GA.x(target) * m_scale)); + + TechStatus arc_type = TS_RESEARCHABLE; + if (empire) + arc_type = empire->GetTechStatus(source_tech->Name()); + m_dependency_polylines[arc_type].insert(std::make_pair(source_tech, std::make_pair(target_tech, dependency_line_vertices))); } - // end - dependency_line_vertices.push_back(std::make_pair(GA.y(target) * m_scale/* - Value(HALF_TARGET_PANEL_WIDTH)*/, - GA.x(target) * m_scale)); - - TechStatus arc_type = TS_RESEARCHABLE; - if (empire) - arc_type = empire->GetTechStatus(source_tech->Name()); - m_dependency_polylines[arc_type].insert(std::make_pair(source_tech, std::make_pair(target_tech, dependency_line_vertices))); } const ogdf::DRect& bound_box = GA.boundingBox(); |
From: <geo...@us...> - 2011-10-24 00:42:11
|
Revision: 4434 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4434&view=rev Author: geoffthemedio Date: 2011-10-24 00:42:05 +0000 (Mon, 24 Oct 2011) Log Message: ----------- More crash-prevention tweaks in TechTreeWnd, in this case for techs that had been on the queue and received some funding / progress, but which were subsequently removed. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-23 22:49:27 UTC (rev 4433) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-24 00:42:05 UTC (rev 4434) @@ -1013,8 +1013,8 @@ bool researchable_tech = false; const Tech* tech = GetTech(m_tech_name); - int time = tech ? tech->ResearchTime() : 1; - double cost = tech ? tech->ResearchCost() : 1.0; + int time = tech ? tech->ResearchTime() : 999999; // arbitrary large value + double cost = tech ? tech->ResearchCost() : 9999999.9; // arbitrary large value const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (empire) { @@ -1028,12 +1028,18 @@ double rps_spent = empire->ResearchStatus(m_tech_name); if (0.0 <= rps_spent) { m_progress = rps_spent / (time * cost); - assert(0.0 <= m_progress && m_progress <= 1.0); + if (m_progress < 0.0) { + Logger().errorStream() << "TechPanel::Update progress oddly small..."; + m_progress = 0.0; + } else if (m_progress > 1.0) { + Logger().errorStream() << "TechPanel::Update progress oddly large..."; + m_progress = 1.0; + } } researchable_tech = empire->ResearchableTech(m_tech_name); } } else { // (!empire) - researchable_tech = true; + researchable_tech = tech->Researchable(); } |
From: <geo...@us...> - 2011-10-26 11:24:19
|
Revision: 4443 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4443&view=rev Author: geoffthemedio Date: 2011-10-26 11:24:12 +0000 (Wed, 26 Oct 2011) Log Message: ----------- -Fixed the tech tree view resetting whenever a tech was added or removed from the queue. -Grooming Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-26 05:33:46 UTC (rev 4442) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-26 11:24:12 UTC (rev 4443) @@ -1109,8 +1109,7 @@ { SetChildClippingMode(ClipToClient); -// m_scale = 1.0 / ZOOM_STEP_SIZE; // because fully zoomed in is too close - m_scale = 1.0; //(LATHANDA) Initialise Fullzoom an do real zooming using GL TODO CHec best size + m_scale = 1.0; //(LATHANDA) Initialise Fullzoom and do real zooming using GL. TODO: Check best size m_layout_surface = new LayoutSurface(); m_vscroll = new CUIScroll(w - ClientUI::ScrollWidth(), GG::Y0, GG::X(ClientUI::ScrollWidth()), @@ -1459,9 +1458,8 @@ return GG::Pt(GG::X(static_cast<int>(x)), GG::Y(static_cast<int>(y))); } -void TechTreeWnd::LayoutPanel::Layout(bool keep_position) +void TechTreeWnd::LayoutPanel::Layout(bool keep_position) { - //constants const GG::X TECH_PANEL_MARGIN_X(ClientUI::Pts()*16); const GG::Y TECH_PANEL_MARGIN_Y(ClientUI::Pts()*16 + 100); const double RANK_SEP = Value(TECH_PANEL_LAYOUT_WIDTH) * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing"); @@ -1470,36 +1468,37 @@ const double HEIGHT = Value(TECH_PANEL_LAYOUT_HEIGHT); const double X_MARGIN = HORIZONTAL_LINE_LENGTH; - //store data that may be restored - double relativ_scroll_position_x = m_hscroll->PosnRange().first / m_hscroll->ScrollRange().second; - double relativ_scroll_position_y = m_vscroll->PosnRange().first / m_vscroll->ScrollRange().second; + // view state initial data + int initial_hscroll_pos = m_hscroll->PosnRange().first; + int initial_vscroll_pos = m_vscroll->PosnRange().first; + double initial_hscroll_page_size = m_hscroll->PageSize(); + double initial_vscroll_page_size = m_vscroll->PageSize(); const std::string selected_tech = m_selected_tech_name; - //cleanup old data for new layout + // cleanup old data for new layout Clear(); Logger().debugStream() << "Tech Tree Layout Preparing Tech Data"; - //create a node for every tech + // create a node for every tech TechManager& manager = GetTechManager(); for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; + if (!tech) continue; const std::string& tech_name = tech->Name(); - if (!TechVisible(tech_name)) - continue; + if (!TechVisible(tech_name)) continue; m_techs[tech_name] = new TechPanel(tech_name, this); m_graph.AddNode(tech_name, m_techs[tech_name]->Width(), m_techs[tech_name]->Height()); } - //create an edge for every prerequisite + // create an edge for every prerequisite for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; + if (!tech) continue; const std::string& tech_name = tech->Name(); - if (!TechVisible(tech_name)) - continue; + if (!TechVisible(tech_name)) continue; for (std::set<std::string>::const_iterator prereq_it = tech->Prerequisites().begin(); - prereq_it != tech->Prerequisites().end(); - ++prereq_it) + prereq_it != tech->Prerequisites().end(); ++prereq_it) { if (!TechVisible(*prereq_it)) continue; m_graph.AddEdge(*prereq_it, tech_name); @@ -1509,7 +1508,7 @@ Logger().debugStream() << "Tech Tree Layout Doing Graph Layout"; //calculate layout - m_graph.DoLayout((int)(WIDTH + RANK_SEP), (int)(HEIGHT + NODE_SEP), (int)(X_MARGIN)); + m_graph.DoLayout(static_cast<int>(WIDTH + RANK_SEP), static_cast<int>(HEIGHT + NODE_SEP), static_cast<int>(X_MARGIN)); const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); @@ -1518,9 +1517,9 @@ // create new tech panels and new dependency arcs for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; + if (!tech) continue; const std::string& tech_name = tech->Name(); - if (!TechVisible(tech_name)) - continue; + if (!TechVisible(tech_name)) continue; //techpanel const TechTreeLayout::Node* node = m_graph.GetNode(tech_name); //move TechPanel @@ -1546,26 +1545,32 @@ arc_type = empire->GetTechStatus(to); m_dependency_arcs[arc_type].insert(std::make_pair(from, std::make_pair(to, points))); } - } - //format window + // format window GG::Pt client_sz = ClientSize(); GG::Pt layout_size(std::max(client_sz.x, m_graph.GetWidth() + 2 * TECH_PANEL_MARGIN_X + PROGRESS_PANEL_LEFT_EXTRUSION), std::max(client_sz.y, m_graph.GetHeight() + 2 * TECH_PANEL_MARGIN_Y + PROGRESS_PANEL_BOTTOM_EXTRUSION)); m_layout_surface->Resize(layout_size); - //format scrollbar + // format scrollbar m_vscroll->SizeScroll(0, Value(layout_size.y - 1), std::max(50, Value(std::min(layout_size.y / 10, client_sz.y))), Value(client_sz.y)); m_hscroll->SizeScroll(0, Value(layout_size.x - 1), std::max(50, Value(std::min(layout_size.x / 10, client_sz.x))), Value(client_sz.x)); Logger().debugStream() << "Tech Tree Layout Done"; - //restore save data + // restore save data if (keep_position) { m_selected_tech_name = selected_tech; - m_hscroll->ScrollTo((int)(m_hscroll->ScrollRange().second * relativ_scroll_position_x)); - m_vscroll->ScrollTo((int)(m_vscroll->ScrollRange().second * relativ_scroll_position_y)); + // select clicked on tech + if (m_techs.find(m_selected_tech_name) != m_techs.end()) + m_techs[m_selected_tech_name]->Select(true); + double hscroll_page_size_ratio = m_hscroll->PageSize() / initial_hscroll_page_size; + double vscroll_page_size_ratio = m_vscroll->PageSize() / initial_vscroll_page_size; + m_hscroll->ScrollTo(static_cast<int>(initial_hscroll_pos * hscroll_page_size_ratio)); + m_vscroll->ScrollTo(static_cast<int>(initial_vscroll_pos * vscroll_page_size_ratio)); + GG::SignalScroll(*m_hscroll, true); + GG::SignalScroll(*m_vscroll, true); } else { - m_selected_tech_name.clear();; + m_selected_tech_name.clear(); // find a tech to centre view on for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { const Tech* tech = *it; |
From: <geo...@us...> - 2011-10-30 23:40:31
|
Revision: 4463 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4463&view=rev Author: geoffthemedio Date: 2011-10-30 23:40:25 +0000 (Sun, 30 Oct 2011) Log Message: ----------- Fixed bug with placement of Queued or COMPLETED text on tech tree tech panels. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-30 21:56:23 UTC (rev 4462) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-10-30 23:40:25 UTC (rev 4463) @@ -37,8 +37,8 @@ const GG::Y PROGRESS_PANEL_HEIGHT(18); const GG::X PROGRESS_PANEL_LEFT_EXTRUSION(21); const GG::Y PROGRESS_PANEL_BOTTOM_EXTRUSION(9); - const int MAIN_PANEL_CORNER_RADIUS = 5; - const int PROGRESS_PANEL_CORNER_RADIUS = 5; + const int MAIN_PANEL_CORNER_RADIUS = 5; + const int PROGRESS_PANEL_CORNER_RADIUS = 5; const GG::X THEORY_TECH_PANEL_LAYOUT_WIDTH = 250 + PROGRESS_PANEL_LEFT_EXTRUSION; const GG::Y THEORY_TECH_PANEL_LAYOUT_HEIGHT = 50 + PROGRESS_PANEL_BOTTOM_EXTRUSION; @@ -50,7 +50,7 @@ const GG::X TECH_PANEL_LAYOUT_WIDTH = THEORY_TECH_PANEL_LAYOUT_WIDTH; const GG::Y TECH_PANEL_LAYOUT_HEIGHT = THEORY_TECH_PANEL_LAYOUT_HEIGHT - PROGRESS_PANEL_BOTTOM_EXTRUSION; - const int HORIZONTAL_LINE_LENGTH = 12; + const int HORIZONTAL_LINE_LENGTH = 12; const float OUTER_LINE_THICKNESS = 1.5; const float ARC_THICKNESS = 3.0; @@ -925,8 +925,8 @@ // progress text box GG::Rect progress_panel = ProgressPanelRect(UpperLeft(), LowerRight()); - m_progress_text = new GG::TextControl(static_cast<GG::X>(progress_panel.ul.x - PROGRESS_PANEL_LEFT_EXTRUSION), - static_cast<GG::Y>(progress_panel.ul.y - PROGRESS_PANEL_BOTTOM_EXTRUSION), + m_progress_text = new GG::TextControl(static_cast<GG::X>(progress_panel.ul.x), + static_cast<GG::Y>(progress_panel.ul.y), progress_panel.Width(), progress_panel.Height(), "Progress Panel", font, m_text_and_border_color); |
From: <geo...@us...> - 2011-11-06 03:46:05
|
Revision: 4471 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4471&view=rev Author: geoffthemedio Date: 2011-11-06 03:45:59 +0000 (Sun, 06 Nov 2011) Log Message: ----------- Fixed TechTreeWnd::LayoutPanel::CenterOnTech. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-11-05 09:24:13 UTC (rev 4470) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2011-11-06 03:45:59 UTC (rev 4471) @@ -1244,8 +1244,8 @@ GG::Clr researchable_half_alpha_selected = GG::LightColor(researchable_half_alpha); GG::Clr unresearchable_half_alpha_selected = GG::LightColor(unresearchable_half_alpha); for (std::map<TechStatus, std::vector<DependencyArcsMap::const_iterator> >::const_iterator it = selected_arcs.begin(); - it != selected_arcs.end(); - ++it) { + it != selected_arcs.end(); ++it) + { GG::Clr arc_color; switch (it->first) { case TS_COMPLETE: arc_color = known_half_alpha_selected; break; @@ -1253,9 +1253,8 @@ default: arc_color = unresearchable_half_alpha_selected; break; } glColor(arc_color); - for (unsigned int i = 0; i < it->second.size(); ++i) { + for (unsigned int i = 0; i < it->second.size(); ++i) DrawArc(it->second[i], arc_color, false); - } } // now retrace the arc with a normal-width, full-alpha line @@ -1295,7 +1294,7 @@ DrawArc(it->second[i], arc_color, true); } } - + glEnable(GL_TEXTURE_2D); EndClipping(); @@ -1415,24 +1414,25 @@ void TechTreeWnd::LayoutPanel::CenterOnTech(const std::string& tech_name) { std::map<std::string, TechPanel*>::const_iterator it = m_techs.find(tech_name); - if (it != m_techs.end()) { - TechPanel* tech_panel = it->second; - GG::Pt center_point = tech_panel->RelativeUpperLeft() + GG::Pt(tech_panel->Width() / 2, tech_panel->Height() / 2); - GG::Pt client_size = ClientSize(); - m_hscroll->ScrollTo(Value(center_point.x - client_size.x / 2)); - GG::SignalScroll(*m_hscroll, true); - m_vscroll->ScrollTo(Value(center_point.y - client_size.y / 2)); - GG::SignalScroll(*m_vscroll, true); - } else { - Logger().debugStream() << "TechTreeWnd::LayoutPanel::CenterOnTech couldn't centre on " << tech_name << " due to lack of such a tech panel"; + if (it == m_techs.end()) { + Logger().debugStream() << "TechTreeWnd::LayoutPanel::CenterOnTech couldn't centre on " << tech_name + << " due to lack of such a tech panel"; + return; } + + TechPanel* tech_panel = it->second; + GG::Pt center_point = tech_panel->UpperLeft(); + m_hscroll->ScrollTo(Value(center_point.x)); + GG::SignalScroll(*m_hscroll, true); + m_vscroll->ScrollTo(Value(center_point.y)); + GG::SignalScroll(*m_vscroll, true); } void TechTreeWnd::LayoutPanel::DoZoom(const GG::Pt & p) const { glPushMatrix(); //center to panel - glTranslated(Value(Width()/2.0),Value(Height()/2.0),0); + glTranslated(Value(Width()/2.0), Value(Height()/2.0), 0); //zoom glScaled(m_scale, m_scale, 1); //translate to actual scroll position |
From: <geo...@us...> - 2012-06-21 07:22:53
|
Revision: 4912 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4912&view=rev Author: geoffthemedio Date: 2012-06-21 07:22:43 +0000 (Thu, 21 Jun 2012) Log Message: ----------- -Forwarded some button up/down and drag signals from tech panels to parent, so that dragging the tech tree by dragging tech panels works. -grooming Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2012-06-16 17:03:55 UTC (rev 4911) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2012-06-21 07:22:43 UTC (rev 4912) @@ -61,8 +61,7 @@ struct pointf { double x, y; }; - pointf Bezier(pointf* patch, double t) - { + pointf Bezier(pointf* patch, double t) { pointf temp[6][6]; for (int j = 0; j <= 3; j++) { temp[0][j] = patch[j]; @@ -76,8 +75,7 @@ return temp[3][0]; } - std::vector<std::pair<double, double> > Spline(const std::vector<std::pair<int, int> >& control_points) - { + std::vector<std::pair<double, double> > Spline(const std::vector<std::pair<int, int> >& control_points) { std::vector<std::pair<double, double> > retval; pointf patch[4]; patch[3].x = control_points[0].first; @@ -153,31 +151,27 @@ glEnable(GL_TEXTURE_2D); } - struct ToggleCategoryFunctor - { + struct ToggleCategoryFunctor { ToggleCategoryFunctor(TechTreeWnd* tree_wnd, const std::string& category) : m_tree_wnd(tree_wnd), m_category(category) {} void operator()() {m_tree_wnd->ToggleCategory(m_category);} TechTreeWnd* const m_tree_wnd; const std::string m_category; }; - struct ToggleAllCategoriesFunctor - { + struct ToggleAllCategoriesFunctor { ToggleAllCategoriesFunctor(TechTreeWnd* tree_wnd) : m_tree_wnd(tree_wnd) {} void operator()() {m_tree_wnd->ToggleAllCategories();} TechTreeWnd* const m_tree_wnd; }; - struct ToggleTechStatusFunctor - { + struct ToggleTechStatusFunctor { ToggleTechStatusFunctor(TechTreeWnd* tree_wnd, TechStatus status) : m_tree_wnd(tree_wnd), m_status(status) {} void operator()() {m_tree_wnd->ToggleStatus(m_status);} TechTreeWnd* const m_tree_wnd; const TechStatus m_status; }; - struct ToggleTechTypeFunctor - { + struct ToggleTechTypeFunctor { ToggleTechTypeFunctor(TechTreeWnd* tree_wnd, TechType type) : m_tree_wnd(tree_wnd), m_type(type) {} void operator()() {m_tree_wnd->ToggleType(m_type);} TechTreeWnd* const m_tree_wnd; @@ -190,8 +184,7 @@ ////////////////////////////////////////////////// /** A panel of buttons that control how the tech tree is displayed: what categories, statuses and types of techs to show. */ -class TechTreeWnd::TechTreeControls : public CUIWnd -{ +class TechTreeWnd::TechTreeControls : public CUIWnd { public: //! \name Structors //@{ TechTreeControls(GG::X x, GG::Y y, GG::X w); @@ -284,8 +277,7 @@ Resize(GG::Pt(Width(), MinSize().y)); } -void TechTreeWnd::TechTreeControls::DoButtonLayout() -{ +void TechTreeWnd::TechTreeControls::DoButtonLayout() { const GG::X RIGHT_EDGE_PAD(8); const GG::X USABLE_WIDTH = std::max(ClientWidth() - RIGHT_EDGE_PAD, GG::X1); // space in which to do layout const int PTS = ClientUI::Pts(); @@ -379,16 +371,14 @@ SetMinSize(GG::Pt(UPPER_LEFT_PAD + MIN_BUTTON_WIDTH + 3*RIGHT_EDGE_PAD, CUIWnd::BORDER_TOP + CUIWnd::BORDER_BOTTOM + UPPER_LEFT_PAD + (++row)*m_row_offset)); } -void TechTreeWnd::TechTreeControls::SizeMove(const GG::Pt& ul, const GG::Pt& lr) -{ +void TechTreeWnd::TechTreeControls::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { // maybe later do something interesting with docking CUIWnd::SizeMove(ul, lr); // set width and upper left as user-requested DoButtonLayout(); // given set width, position buttons and set appropriate minimum height CUIWnd::SizeMove(ul, GG::Pt(lr.x, ul.y + MinSize().y)); // width and upper left unchanged. set height to minimum height } -void TechTreeWnd::TechTreeControls::Render() -{ +void TechTreeWnd::TechTreeControls::Render() { CUIWnd::Render(); GG::Pt ul = UpperLeft(); @@ -429,8 +419,7 @@ glEnable(GL_TEXTURE_2D); } -void TechTreeWnd::TechTreeControls::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) -{ +void TechTreeWnd::TechTreeControls::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { if (m_drag_offset != GG::Pt(-GG::X1, -GG::Y1)) { // resize-dragging GG::Pt new_lr = pt - m_drag_offset; @@ -471,8 +460,7 @@ /** A window with a single lisbox in it. The listbox represents the techs that * are required for and are unlocked by some tech. Clicking on a prereq or * unlocked tech will bring up that tech. */ -class TechTreeWnd::TechNavigator : public CUIWnd -{ +class TechTreeWnd::TechNavigator : public CUIWnd { public: TechNavigator(GG::X w, GG::Y h); @@ -489,8 +477,7 @@ /** A control with a label \a str on it, and that is rendered partially * onto the next row. The "Requires" and "Unlocks" rows are in of this * class. */ - class SectionHeaderControl : public GG::Control - { + class SectionHeaderControl : public GG::Control { public: SectionHeaderControl(const std::string& str); virtual void Render(); @@ -499,8 +486,7 @@ }; /** The control in a single cell of a row with a tech in it. */ - class TechControl : public GG::Control - { + class TechControl : public GG::Control { public: TechControl(const std::string& tech_name); virtual GG::Pt ClientUpperLeft() const {return UpperLeft() + GG::Pt(GG::X(3), GG::Y(2));} @@ -547,15 +533,13 @@ AttachChild(m_lb); } -GG::ListBox::Row* TechTreeWnd::TechNavigator::NewSectionHeaderRow(const std::string& str) -{ +GG::ListBox::Row* TechTreeWnd::TechNavigator::NewSectionHeaderRow(const std::string& str) { GG::ListBox::Row* retval = new GG::ListBox::Row(m_lb->Width(), GG::Y(3*ClientUI::Pts()/2 + 4), ""); retval->push_back(new SectionHeaderControl(str)); return retval; } -GG::ListBox::Row* TechTreeWnd::TechNavigator::NewTechRow(const std::string& tech_name) -{ +GG::ListBox::Row* TechTreeWnd::TechNavigator::NewTechRow(const std::string& tech_name) { TechControl* control = new TechControl(tech_name); GG::Connect(control->ClickedSignal, &TechTreeWnd::TechNavigator::TechClickedSlot, this); GG::ListBox::Row* retval = new GG::ListBox::Row(m_lb->Width(), GG::Y(3*ClientUI::Pts()/2 + 4), ""); @@ -563,8 +547,7 @@ return retval; } -void TechTreeWnd::TechNavigator::Reset() -{ +void TechTreeWnd::TechNavigator::Reset() { m_lb->Clear(); const Tech* current_tech = GetTech(m_current_tech_name); if (!current_tech) return; @@ -582,15 +565,13 @@ DoLayout(); } -void TechTreeWnd::TechNavigator::SizeMove(const GG::Pt& ul, const GG::Pt& lr) -{ +void TechTreeWnd::TechNavigator::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { // maybe later do something interesting with docking CUIWnd::SizeMove(ul, lr); DoLayout(); } -void TechTreeWnd::TechNavigator::DoLayout() -{ +void TechTreeWnd::TechNavigator::DoLayout() { m_lb->Resize(ClientSize() - GG::Pt(2*LB_MARGIN_X, 2*LB_MARGIN_Y)); for (GG::ListBox::iterator it = m_lb->begin(); it != m_lb->end(); ++it) { @@ -602,8 +583,7 @@ } } -void TechTreeWnd::TechNavigator::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) -{ +void TechTreeWnd::TechNavigator::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { if (m_drag_offset != GG::Pt(-GG::X1, -GG::Y1)) { // resize-dragging GG::Pt new_lr = pt - m_drag_offset; @@ -645,8 +625,7 @@ AttachChild(m_label); } -void TechTreeWnd::TechNavigator::SectionHeaderControl::Render() -{ +void TechTreeWnd::TechNavigator::SectionHeaderControl::Render() { GG::Pt ul = UpperLeft(), lr = LowerRight() + GG::Pt(GG::X0, GG::Y(11)); glDisable(GL_TEXTURE_2D); const int CORNER_RADIUS = 5; @@ -662,8 +641,7 @@ glLineWidth(1.0); } -void TechTreeWnd::TechNavigator::SectionHeaderControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) -{ +void TechTreeWnd::TechNavigator::SectionHeaderControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { GG::Wnd::SizeMove(ul, lr); GG::Pt label_ul(TECH_ROW_INDENTATION, GG::Y0); GG::Pt label_lr(ClientWidth(), ClientHeight()); @@ -695,8 +673,7 @@ AttachChild(m_name_text); } -void TechTreeWnd::TechNavigator::TechControl::Render() -{ +void TechTreeWnd::TechNavigator::TechControl::Render() { GG::Rect rect(UpperLeft(), LowerRight()); rect += GG::Pt(TECH_ROW_INDENTATION, GG::Y0); const Tech* tech = GetTech(m_tech_name); @@ -710,8 +687,7 @@ RenderTechPanel(tech_type, rect, GG::Rect(), color_to_use, border_color_to_use, false, 0.0); } -void TechTreeWnd::TechNavigator::TechControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) -{ +void TechTreeWnd::TechNavigator::TechControl::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { GG::Wnd::SizeMove(ul, lr); GG::Pt text_ul(TECH_ROW_INDENTATION, GG::Y0); GG::Pt text_lr(ClientWidth() - TECH_ROW_INDENTATION, ClientHeight()); @@ -721,8 +697,7 @@ // TechTreeWnd::LayoutPanel // ////////////////////////////////////////////////// /** The window that contains the actual tech panels and dependency arcs. */ -class TechTreeWnd::LayoutPanel : public GG::Wnd -{ +class TechTreeWnd::LayoutPanel : public GG::Wnd { public: /** \name Signal Types */ //@{ typedef boost::signal<void (const std::string& tech_name)> TechBrowsedSignalType; ///< emitted when the mouse rolls over a technology @@ -780,12 +755,18 @@ class LayoutSurface : public GG::Wnd { public: - LayoutSurface() : Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE | GG::DRAGABLE) {} - virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) {DraggedSignal(move);} - virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys){ButtonDownSignal(pt);} - virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) {ButtonUpSignal(pt);} - virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) {ZoomedSignal(move);} - mutable boost::signal<void (int)> ZoomedSignal; + LayoutSurface() : + Wnd(GG::X0, GG::Y0, GG::X1, GG::Y1, GG::INTERACTIVE | GG::DRAGABLE) + {} + virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) + { DraggedSignal(move); } + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) + { ButtonDownSignal(pt); } + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) + { ButtonUpSignal(pt); } + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) + { ZoomedSignal(move); } + mutable boost::signal<void (int)> ZoomedSignal; mutable boost::signal<void (const GG::Pt&)> DraggedSignal; mutable boost::signal<void (const GG::Pt&)> ButtonDownSignal; mutable boost::signal<void (const GG::Pt&)> ButtonUpSignal; @@ -818,9 +799,9 @@ LayoutSurface* m_layout_surface; CUIScroll* m_vscroll; CUIScroll* m_hscroll; - double m_scroll_position_x; //actual scroll position + double m_scroll_position_x; //actual scroll position double m_scroll_position_y; - double m_drag_scroll_position_x; //position when drag started + double m_drag_scroll_position_x;//position when drag started double m_drag_scroll_position_y; CUIButton* m_zoom_in_button; CUIButton* m_zoom_out_button; @@ -830,23 +811,23 @@ // TechTreeWnd::LayoutPanel::TechPanel // ////////////////////////////////////////////////// /** Represents a single tech in the LayoutPanel. */ -class TechTreeWnd::LayoutPanel::TechPanel : public GG::Wnd -{ +class TechTreeWnd::LayoutPanel::TechPanel : public GG::Wnd { public: - /** \name Signal Types */ //@{ - typedef boost::signal<void (const std::string&)> TechBrowsedSignalType; ///< emitted when a technology is single-clicked - typedef boost::signal<void (const std::string&)> TechClickedSignalType; ///< emitted when the mouse rolls over a technology - typedef boost::signal<void (const std::string&)> TechDoubleClickedSignalType; ///< emitted when a technology is double-clicked - //@} - TechPanel(const std::string& tech_name, const LayoutPanel* panel); virtual bool InWindow(const GG::Pt& pt) const; virtual void Render(); + virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) + { ForwardEventToParent(); } + virtual void LButtonDown(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) + { ForwardEventToParent(); } + virtual void LButtonUp(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) + { ForwardEventToParent(); } virtual void LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); - virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) {ForwardEventToParent();} + virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) + { ForwardEventToParent(); } void Update(); @@ -938,8 +919,7 @@ Update(); } -bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const -{ +bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const { GG::Pt lr = LowerRight(); const GG::Pt p = m_panel->Convert(pt); return GG::Wnd::InWindow(p) && @@ -947,8 +927,7 @@ (lr.x - PROGRESS_PANEL_WIDTH <= p.x || p.y <= lr.y - PROGRESS_PANEL_BOTTOM_EXTRUSION); } -void TechTreeWnd::LayoutPanel::TechPanel::Render() -{ +void TechTreeWnd::LayoutPanel::TechPanel::Render() { GG::Pt ul(GG::X(0), GG::Y(0)); GG::Pt lr(Width(), Height()); @@ -980,8 +959,7 @@ m_panel->UndoZoom(); } -void TechTreeWnd::LayoutPanel::TechPanel::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{ +void TechTreeWnd::LayoutPanel::TechPanel::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_panel->m_selected_tech_name != m_tech_name) TechClickedSignal(m_tech_name); } @@ -992,8 +970,7 @@ void TechTreeWnd::LayoutPanel::TechPanel::MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { TechBrowsedSignal(m_tech_name); } -void TechTreeWnd::LayoutPanel::TechPanel::Select(bool select) -{ +void TechTreeWnd::LayoutPanel::TechPanel::Select(bool select) { if (select) { m_tech_name_text->SetTextColor(GG::LightColor(m_text_and_border_color)); m_tech_cost_text->SetTextColor(GG::LightColor(m_text_and_border_color)); @@ -1006,8 +983,7 @@ //m_toggle_button->SetSelected(m_selected); } -void TechTreeWnd::LayoutPanel::TechPanel::Update() -{ +void TechTreeWnd::LayoutPanel::TechPanel::Update() { bool known_tech = false; bool queued_tech = false; bool researchable_tech = false; @@ -1079,8 +1055,7 @@ Select(m_panel->m_selected_tech_name == m_tech_name); } -GG::Rect TechTreeWnd::LayoutPanel::TechPanel::ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr) -{ +GG::Rect TechTreeWnd::LayoutPanel::TechPanel::ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr) { GG::Rect retval; retval.lr = lr + GG::Pt(static_cast<GG::X>(PROGRESS_PANEL_LEFT_EXTRUSION), static_cast<GG::Y>(PROGRESS_PANEL_BOTTOM_EXTRUSION)); @@ -1184,8 +1159,7 @@ std::set<TechStatus> TechTreeWnd::LayoutPanel::GetTechStatusesShown() const { return m_tech_statuses_shown; } -void TechTreeWnd::LayoutPanel::Render() -{ +void TechTreeWnd::LayoutPanel::Render() { GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); @@ -1307,8 +1281,7 @@ void TechTreeWnd::LayoutPanel::Update() { Layout(true); } -void TechTreeWnd::LayoutPanel::Clear() -{ +void TechTreeWnd::LayoutPanel::Clear() { m_vscroll->ScrollTo(0); m_hscroll->ScrollTo(0); m_vscroll->SizeScroll(0, 1, 1, 1); @@ -1327,14 +1300,12 @@ m_selected_tech_name.clear(); } -void TechTreeWnd::LayoutPanel::Reset() -{ +void TechTreeWnd::LayoutPanel::Reset() { // regenerate graph of panels and dependency lines Layout(false); } -void TechTreeWnd::LayoutPanel::SetScale(double scale) -{ +void TechTreeWnd::LayoutPanel::SetScale(double scale) { if (scale < MIN_SCALE) scale = MIN_SCALE; if (MAX_SCALE < scale) @@ -1343,16 +1314,14 @@ m_scale = scale; } -void TechTreeWnd::LayoutPanel::ShowCategory(const std::string& category) -{ +void TechTreeWnd::LayoutPanel::ShowCategory(const std::string& category) { if (m_categories_shown.find(category) == m_categories_shown.end()) { m_categories_shown.insert(category); Layout(true); } } -void TechTreeWnd::LayoutPanel::ShowAllCategories() -{ +void TechTreeWnd::LayoutPanel::ShowAllCategories() { const std::vector<std::string> all_cats = GetTechManager().CategoryNames(); if (all_cats.size() == m_categories_shown.size()) return; @@ -1361,8 +1330,7 @@ Layout(true); } -void TechTreeWnd::LayoutPanel::HideCategory(const std::string& category) -{ +void TechTreeWnd::LayoutPanel::HideCategory(const std::string& category) { std::set<std::string>::iterator it = m_categories_shown.find(category); if (it != m_categories_shown.end()) { m_categories_shown.erase(it); @@ -1370,8 +1338,7 @@ } } -void TechTreeWnd::LayoutPanel::HideAllCategories() -{ +void TechTreeWnd::LayoutPanel::HideAllCategories() { if (m_categories_shown.empty()) return; m_categories_shown.clear(); @@ -1428,8 +1395,7 @@ GG::SignalScroll(*m_vscroll, true); } -void TechTreeWnd::LayoutPanel::DoZoom(const GG::Pt & p) const -{ +void TechTreeWnd::LayoutPanel::DoZoom(const GG::Pt & p) const { glPushMatrix(); //center to panel glTranslated(Value(Width()/2.0), Value(Height()/2.0), 0); @@ -1443,8 +1409,7 @@ void TechTreeWnd::LayoutPanel::UndoZoom() const { glPopMatrix(); } -GG::Pt TechTreeWnd::LayoutPanel::Convert(const GG::Pt & p) const -{ +GG::Pt TechTreeWnd::LayoutPanel::Convert(const GG::Pt & p) const { // Converts screen coordinate into virtual coordiante // doing the inverse transformation as DoZoom in the same order double x = Value(p.x); @@ -1458,8 +1423,7 @@ return GG::Pt(GG::X(static_cast<int>(x)), GG::Y(static_cast<int>(y))); } -void TechTreeWnd::LayoutPanel::Layout(bool keep_position) -{ +void TechTreeWnd::LayoutPanel::Layout(bool keep_position) { const GG::X TECH_PANEL_MARGIN_X(ClientUI::Pts()*16); const GG::Y TECH_PANEL_MARGIN_Y(ClientUI::Pts()*16 + 100); const double RANK_SEP = Value(TECH_PANEL_LAYOUT_WIDTH) * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing"); @@ -1526,9 +1490,9 @@ TechPanel* tech_panel = m_techs[tech_name]; tech_panel->MoveTo(GG::Pt(node->GetX(), node->GetY())); m_layout_surface->AttachChild(tech_panel); - GG::Connect(tech_panel->TechBrowsedSignal, &TechTreeWnd::LayoutPanel::TechBrowsedSlot, this); - GG::Connect(tech_panel->TechClickedSignal, &TechTreeWnd::LayoutPanel::TechClickedSlot, this); - GG::Connect(tech_panel->TechDoubleClickedSignal, &TechTreeWnd::LayoutPanel::TechDoubleClickedSlot, this); + GG::Connect(tech_panel->TechBrowsedSignal, &TechTreeWnd::LayoutPanel::TechBrowsedSlot, this); + GG::Connect(tech_panel->TechClickedSignal, &TechTreeWnd::LayoutPanel::TechClickedSlot, this); + GG::Connect(tech_panel->TechDoubleClickedSignal, &TechTreeWnd::LayoutPanel::TechDoubleClickedSlot, this); const std::vector<TechTreeLayout::Edge*> edges = m_graph.GetOutEdges(tech_name); //prerequisite edge @@ -1587,8 +1551,7 @@ MoveChildUp(m_hscroll); } -bool TechTreeWnd::LayoutPanel::TechVisible(const std::string& tech_name) -{ +bool TechTreeWnd::LayoutPanel::TechVisible(const std::string& tech_name) { const Tech* tech = GetTech(tech_name); if (!tech) return false; @@ -1612,8 +1575,7 @@ return true; } -void TechTreeWnd::LayoutPanel::DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head) -{ +void TechTreeWnd::LayoutPanel::DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head) { GG::Pt ul = UpperLeft(); glBegin(GL_LINE_STRIP); for (unsigned int i = 0; i < it->second.second.size(); ++i) { @@ -1642,8 +1604,7 @@ } } -void TechTreeWnd::LayoutPanel::ScrolledSlot(int, int, int, int) -{ +void TechTreeWnd::LayoutPanel::ScrolledSlot(int, int, int, int) { m_scroll_position_x = m_hscroll->PosnRange().first; m_scroll_position_y = m_vscroll->PosnRange().first; // m_layout_surface->MoveTo(GG::Pt(-scroll_x, -scroll_y)); @@ -1652,8 +1613,7 @@ void TechTreeWnd::LayoutPanel::TechBrowsedSlot(const std::string& tech_name) { TechBrowsedSignal(tech_name); } -void TechTreeWnd::LayoutPanel::TechClickedSlot(const std::string& tech_name) -{ +void TechTreeWnd::LayoutPanel::TechClickedSlot(const std::string& tech_name) { // deselect previously-selected tech panel if (m_techs.find(m_selected_tech_name) != m_techs.end()) m_techs[m_selected_tech_name]->Select(false); @@ -1667,28 +1627,24 @@ void TechTreeWnd::LayoutPanel::TechDoubleClickedSlot(const std::string& tech_name) { TechDoubleClickedSignal(tech_name); } -void TechTreeWnd::LayoutPanel::TreeDraggedSlot(const GG::Pt& move) -{ +void TechTreeWnd::LayoutPanel::TreeDraggedSlot(const GG::Pt& move) { m_hscroll->ScrollTo(m_drag_scroll_position_x - Value(move.x / m_scale)); m_vscroll->ScrollTo(m_drag_scroll_position_y - Value(move.y / m_scale)); m_scroll_position_x = m_hscroll->PosnRange().first; m_scroll_position_y = m_vscroll->PosnRange().first; } -void TechTreeWnd::LayoutPanel::TreeDragBegin(const GG::Pt& pt) -{ +void TechTreeWnd::LayoutPanel::TreeDragBegin(const GG::Pt& pt) { m_drag_scroll_position_x = m_scroll_position_x; m_drag_scroll_position_y = m_scroll_position_y; } -void TechTreeWnd::LayoutPanel::TreeDragEnd(const GG::Pt& pt) -{ +void TechTreeWnd::LayoutPanel::TreeDragEnd(const GG::Pt& pt) { m_drag_scroll_position_x = m_scroll_position_x; m_drag_scroll_position_y = m_scroll_position_y; } -void TechTreeWnd::LayoutPanel::TreeZoomedSlot(int move) -{ +void TechTreeWnd::LayoutPanel::TreeZoomedSlot(int move) { if (0 < move) SetScale(m_scale * ZOOM_STEP_SIZE); else if (move < 0) @@ -1705,8 +1661,7 @@ ////////////////////////////////////////////////// // TechTreeWnd::TechListBox // ////////////////////////////////////////////////// -class TechTreeWnd::TechListBox : public CUIListBox -{ +class TechTreeWnd::TechListBox : public CUIListBox { public: /** \name Structors */ //@{ TechListBox(GG::X x, GG::Y y, GG::X w, GG::Y h); @@ -1759,15 +1714,13 @@ std::vector<TechRow*> m_all_tech_rows; }; -void TechTreeWnd::TechListBox::TechRow::Render() -{ +void TechTreeWnd::TechListBox::TechRow::Render() { GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); GG::FlatRectangle(ul, lr, ClientUI::WndColor(), GG::CLR_WHITE, 1); } -std::vector<GG::X> TechTreeWnd::TechListBox::TechRow::ColWidths(GG::X total_width) -{ +std::vector<GG::X> TechTreeWnd::TechListBox::TechRow::ColWidths(GG::X total_width) { const GG::X GRAPHIC_WIDTH(ClientUI::Pts() * 2); const GG::X NAME_WIDTH(ClientUI::Pts() * 18); const GG::X COST_WIDTH(ClientUI::Pts() * 4); @@ -1894,8 +1847,7 @@ void TechTreeWnd::TechListBox::Reset() { Populate(); } -void TechTreeWnd::TechListBox::Populate() -{ +void TechTreeWnd::TechListBox::Populate() { // abort of not visible to see results if (!Visible()) return; @@ -1942,16 +1894,14 @@ Logger().debugStream() << " Insertion time=" << (insertion_elapsed * 1000) << "ms"; } -void TechTreeWnd::TechListBox::ShowCategory(const std::string& category) -{ +void TechTreeWnd::TechListBox::ShowCategory(const std::string& category) { if (m_categories_shown.find(category) == m_categories_shown.end()) { m_categories_shown.insert(category); Populate(); } } -void TechTreeWnd::TechListBox::ShowAllCategories() -{ +void TechTreeWnd::TechListBox::ShowAllCategories() { const std::vector<std::string> all_cats = GetTechManager().CategoryNames(); if (all_cats.size() == m_categories_shown.size()) return; @@ -1960,8 +1910,7 @@ Populate(); } -void TechTreeWnd::TechListBox::HideCategory(const std::string& category) -{ +void TechTreeWnd::TechListBox::HideCategory(const std::string& category) { std::set<std::string>::iterator it = m_categories_shown.find(category); if (it != m_categories_shown.end()) { m_categories_shown.erase(it); @@ -1969,24 +1918,21 @@ } } -void TechTreeWnd::TechListBox::HideAllCategories() -{ +void TechTreeWnd::TechListBox::HideAllCategories() { if (m_categories_shown.empty()) return; m_categories_shown.clear(); Populate(); } -void TechTreeWnd::TechListBox::ShowType(TechType type) -{ +void TechTreeWnd::TechListBox::ShowType(TechType type) { if (m_tech_types_shown.find(type) == m_tech_types_shown.end()) { m_tech_types_shown.insert(type); Populate(); } } -void TechTreeWnd::TechListBox::HideType(TechType type) -{ +void TechTreeWnd::TechListBox::HideType(TechType type) { std::set<TechType>::iterator it = m_tech_types_shown.find(type); if (it != m_tech_types_shown.end()) { m_tech_types_shown.erase(it); @@ -1994,16 +1940,14 @@ } } -void TechTreeWnd::TechListBox::ShowStatus(TechStatus status) -{ +void TechTreeWnd::TechListBox::ShowStatus(TechStatus status) { if (m_tech_statuses_shown.find(status) == m_tech_statuses_shown.end()) { m_tech_statuses_shown.insert(status); Populate(); } } -void TechTreeWnd::TechListBox::HideStatus(TechStatus status) -{ +void TechTreeWnd::TechListBox::HideStatus(TechStatus status) { std::set<TechStatus>::iterator it = m_tech_statuses_shown.find(status); if (it != m_tech_statuses_shown.end()) { m_tech_statuses_shown.erase(it); @@ -2011,8 +1955,7 @@ } } -bool TechTreeWnd::TechListBox::TechVisible(const std::string& tech_name) -{ +bool TechTreeWnd::TechListBox::TechVisible(const std::string& tech_name) { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) return true; @@ -2034,8 +1977,7 @@ return true; } -void TechTreeWnd::TechListBox::PropagateLeftClickSignal(GG::ListBox::iterator it, const GG::Pt& pt) -{ +void TechTreeWnd::TechListBox::PropagateLeftClickSignal(GG::ListBox::iterator it, const GG::Pt& pt) { // determine type of row that was clicked, and emit appropriate signal TechRow* tech_row = dynamic_cast<TechRow*>(*it); @@ -2043,8 +1985,7 @@ TechClickedSignal(tech_row->GetTech()); } -void TechTreeWnd::TechListBox::PropagateDoubleClickSignal(GG::ListBox::iterator it) -{ +void TechTreeWnd::TechListBox::PropagateDoubleClickSignal(GG::ListBox::iterator it) { // determine type of row that was clicked, and emit appropriate signal TechRow* tech_row = dynamic_cast<TechRow*>(*it); @@ -2117,8 +2058,7 @@ ShowTreeView(); } -TechTreeWnd::~TechTreeWnd() -{ +TechTreeWnd::~TechTreeWnd() { delete m_tech_list; delete m_layout_panel; } @@ -2138,21 +2078,18 @@ void TechTreeWnd::Update() { m_layout_panel->Update(); } -void TechTreeWnd::Clear() -{ +void TechTreeWnd::Clear() { m_tech_navigator->SetTech(""); m_enc_detail_panel->OnUp(); m_layout_panel->Clear(); } -void TechTreeWnd::Reset() -{ +void TechTreeWnd::Reset() { m_layout_panel->Reset(); m_tech_list->Reset(); } -void TechTreeWnd::ShowCategory(const std::string& category) -{ +void TechTreeWnd::ShowCategory(const std::string& category) { m_layout_panel->ShowCategory(category); m_tech_list->ShowCategory(category); @@ -2168,8 +2105,7 @@ } } -void TechTreeWnd::ShowAllCategories() -{ +void TechTreeWnd::ShowAllCategories() { m_layout_panel->ShowAllCategories(); m_tech_list->ShowAllCategories(); @@ -2181,8 +2117,7 @@ } } -void TechTreeWnd::HideCategory(const std::string& category) -{ +void TechTreeWnd::HideCategory(const std::string& category) { m_layout_panel->HideCategory(category); m_tech_list->HideCategory(category); @@ -2197,8 +2132,7 @@ } } -void TechTreeWnd::HideAllCategories() -{ +void TechTreeWnd::HideAllCategories() { m_layout_panel->HideAllCategories(); m_tech_list->HideAllCategories(); @@ -2209,8 +2143,7 @@ } } -void TechTreeWnd::ToggleAllCategories() -{ +void TechTreeWnd::ToggleAllCategories() { std::set<std::string> shown_cats = m_layout_panel->GetCategoriesShown(); const std::vector<std::string> all_cats = GetTechManager().CategoryNames(); @@ -2220,8 +2153,7 @@ ShowAllCategories(); } -void TechTreeWnd::ToggleCategory(const std::string& category) -{ +void TechTreeWnd::ToggleCategory(const std::string& category) { std::set<std::string> shown_cats = m_layout_panel->GetCategoriesShown(); std::set<std::string>::const_iterator it = shown_cats.find(category); @@ -2231,8 +2163,7 @@ HideCategory(category); } -void TechTreeWnd::ShowStatus(TechStatus status) -{ +void TechTreeWnd::ShowStatus(TechStatus status) { m_layout_panel->ShowStatus(status); m_tech_list->ShowStatus(status); @@ -2240,8 +2171,7 @@ button->MarkSelectedGray(); } -void TechTreeWnd::HideStatus(TechStatus status) -{ +void TechTreeWnd::HideStatus(TechStatus status) { m_layout_panel->HideStatus(status); m_tech_list->HideStatus(status); @@ -2249,8 +2179,7 @@ button->MarkNotSelected(); } -void TechTreeWnd::ToggleStatus(TechStatus status) -{ +void TechTreeWnd::ToggleStatus(TechStatus status) { std::set<TechStatus> statuses = m_layout_panel->GetTechStatusesShown(); std::set<TechStatus>::const_iterator it = statuses.find(status); @@ -2260,8 +2189,7 @@ HideStatus(status); } -void TechTreeWnd::ShowType(TechType type) -{ +void TechTreeWnd::ShowType(TechType type) { m_layout_panel->ShowType(type); m_tech_list->ShowType(type); @@ -2269,8 +2197,7 @@ button->MarkSelectedGray(); } -void TechTreeWnd::HideType(TechType type) -{ +void TechTreeWnd::HideType(TechType type) { m_layout_panel->HideType(type); m_tech_list->HideType(type); @@ -2278,8 +2205,7 @@ button->MarkNotSelected(); } -void TechTreeWnd::ToggleType(TechType type) -{ +void TechTreeWnd::ToggleType(TechType type) { std::set<TechType> types = m_layout_panel->GetTechTypesShown(); std::set<TechType>::const_iterator it = types.find(type); @@ -2290,8 +2216,7 @@ } } -void TechTreeWnd::ShowTreeView() -{ +void TechTreeWnd::ShowTreeView() { AttachChild(m_layout_panel); MoveChildDown(m_layout_panel); DetachChild(m_tech_list); @@ -2300,8 +2225,7 @@ MoveChildUp(m_tech_tree_controls); } -void TechTreeWnd::ShowListView() -{ +void TechTreeWnd::ShowListView() { AttachChild(m_tech_list); MoveChildDown(m_tech_list); DetachChild(m_layout_panel); @@ -2313,8 +2237,7 @@ void TechTreeWnd::SetScale(double scale) { m_layout_panel->SetScale(scale); } -void TechTreeWnd::CenterOnTech(const std::string& tech_name) -{ +void TechTreeWnd::CenterOnTech(const std::string& tech_name) { // ensure tech exists and is visible const Tech* tech = ::GetTech(tech_name); if (!tech) return; @@ -2331,8 +2254,7 @@ void TechTreeWnd::SetEncyclopediaTech(const std::string& tech_name) { m_enc_detail_panel->SetTech(tech_name); } -void TechTreeWnd::SelectTech(const std::string& tech_name) -{ +void TechTreeWnd::SelectTech(const std::string& tech_name) { m_tech_navigator->SetTech(tech_name); m_layout_panel->ShowTech(tech_name); } @@ -2340,15 +2262,13 @@ void TechTreeWnd::TechBrowsedSlot(const std::string& tech_name) { TechBrowsedSignal(tech_name); } -void TechTreeWnd::TechClickedSlot(const std::string& tech_name) -{ +void TechTreeWnd::TechClickedSlot(const std::string& tech_name) { m_tech_navigator->SetTech(tech_name); SetEncyclopediaTech(tech_name); TechSelectedSignal(tech_name); } -void TechTreeWnd::TechDoubleClickedSlot(const std::string& tech_name) -{ +void TechTreeWnd::TechDoubleClickedSlot(const std::string& tech_name) { const Tech* tech = GetTech(tech_name); if (!tech) return; const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); |
From: <geo...@us...> - 2012-08-13 00:11:12
|
Revision: 5123 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5123&view=rev Author: geoffthemedio Date: 2012-08-13 00:11:04 +0000 (Mon, 13 Aug 2012) Log Message: ----------- Removed another redundant LDrag override. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2012-08-13 00:03:03 UTC (rev 5122) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2012-08-13 00:11:04 UTC (rev 5123) @@ -471,8 +471,6 @@ mutable boost::signal<void (const std::string&)> TechClickedSignal; virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); - virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys); - private: /** A control with a label \a str on it, and that is rendered partially * onto the next row. The "Requires" and "Unlocks" rows are in of this @@ -583,39 +581,6 @@ } } -void TechTreeWnd::TechNavigator::LDrag(const GG::Pt& pt, const GG::Pt& move, GG::Flags<GG::ModKey> mod_keys) { - if (m_drag_offset != GG::Pt(-GG::X1, -GG::Y1)) { // resize-dragging - GG::Pt new_lr = pt - m_drag_offset; - - // constrain to within parent - if (GG::Wnd* parent = Parent()) { - GG::Pt max_lr = parent->ClientLowerRight(); - new_lr.x = std::min(new_lr.x, max_lr.x); - new_lr.y = std::min(new_lr.y, max_lr.y); - } - - Resize(new_lr - UpperLeft()); - } else { // normal-dragging - GG::Pt final_move = move; - - if (GG::Wnd* parent = Parent()) { - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::Pt new_ul = ul + move, new_lr = lr + move; - - GG::Pt min_ul = parent->ClientUpperLeft() + GG::Pt(GG::X1, GG::Y1); - GG::Pt max_lr = parent->ClientLowerRight(); - GG::Pt max_ul = max_lr - this->Size(); - - new_ul.x = std::max(min_ul.x, std::min(max_ul.x, new_ul.x)); - new_ul.y = std::max(min_ul.y, std::min(max_ul.y, new_ul.y)); - - final_move = new_ul - ul; - } - - GG::Wnd::LDrag(pt, final_move, mod_keys); - } -} - TechTreeWnd::TechNavigator::SectionHeaderControl::SectionHeaderControl(const std::string& str) : GG::Control(GG::X0, GG::Y0, GG::X(10), GG::Y(3*ClientUI::Pts()/2 + 4)) { |
From: <geo...@us...> - 2013-02-06 13:39:34
|
Revision: 5718 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5718&view=rev Author: geoffthemedio Date: 2013-02-06 13:39:28 +0000 (Wed, 06 Feb 2013) Log Message: ----------- Added extra padding on drag range of tech tree. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-02-06 05:38:31 UTC (rev 5717) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-02-06 13:39:28 UTC (rev 5718) @@ -1477,8 +1477,7 @@ } // format window GG::Pt client_sz = ClientSize(); - GG::Pt layout_size(std::max(client_sz.x, m_graph.GetWidth() + 2 * TECH_PANEL_MARGIN_X + PROGRESS_PANEL_LEFT_EXTRUSION), - std::max(client_sz.y, m_graph.GetHeight() + 2 * TECH_PANEL_MARGIN_Y + PROGRESS_PANEL_BOTTOM_EXTRUSION)); + GG::Pt layout_size(client_sz.x + m_graph.GetWidth(), client_sz.y + m_graph.GetHeight()); m_layout_surface->Resize(layout_size); // format scrollbar m_vscroll->SizeScroll(0, Value(layout_size.y - 1), std::max(50, Value(std::min(layout_size.y / 10, client_sz.y))), Value(client_sz.y)); |
From: <geo...@us...> - 2013-02-24 10:22:59
|
Revision: 5798 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5798&view=rev Author: geoffthemedio Date: 2013-02-24 10:22:49 +0000 (Sun, 24 Feb 2013) Log Message: ----------- Fixed (most) tech filtering on tree when client has no empire. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-02-24 10:02:23 UTC (rev 5797) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-02-24 10:22:49 UTC (rev 5798) @@ -181,8 +181,8 @@ ////////////////////////////////////////////////// // TechTreeWnd::TechTreeControls // ////////////////////////////////////////////////// -/** A panel of buttons that control how the tech tree is displayed: what categories, statuses and - types of techs to show. */ +/** A panel of buttons that control how the tech tree is displayed: what + * categories, statuses and types of techs to show. */ class TechTreeWnd::TechTreeControls : public CUIWnd { public: //! \name Structors //@{ @@ -198,13 +198,14 @@ private: void DoButtonLayout(); - /** These values are determined when doing button layout, and stored. They are later - * used when rendering separator lines between the groups of buttons */ - int m_buttons_per_row; // number of buttons that can fit into available horizontal space - GG::X m_col_offset; // horizontal distance between each column of buttons - GG::Y m_row_offset; // vertical distance between each row of buttons - int m_category_button_rows; // number of rows used for category buttons - int m_status_or_type_button_rows; // number of rows used for status buttons and for type buttons (both groups have the same number of buttons (three) so use the same number of rows) + /** These values are determined when doing button layout, and stored. + * They are later used when rendering separator lines between the groups + * of buttons */ + int m_buttons_per_row; // number of buttons that can fit into available horizontal space + GG::X m_col_offset; // horizontal distance between each column of buttons + GG::Y m_row_offset; // vertical distance between each row of buttons + int m_category_button_rows; // number of rows used for category buttons + int m_status_or_type_button_rows; // number of rows used for status buttons and for type buttons (both groups have the same number of buttons (three) so use the same number of rows) /** These values are used for rendering separator lines between groups of buttons */ static const int BUTTON_SEPARATION; // vertical or horizontal sepration between adjacent buttons @@ -296,7 +297,9 @@ // place category buttons: fill each row completely before starting next row int row = 0, col = -1; - for (std::vector<CUIButton*>::iterator it = m_category_buttons.begin(); it != m_category_buttons.end(); ++it) { + for (std::vector<CUIButton*>::iterator it = m_category_buttons.begin(); + it != m_category_buttons.end(); ++it) + { ++col; if (col >= m_buttons_per_row) { ++row; @@ -312,7 +315,9 @@ m_category_button_rows = ++row; // place type buttons: fill each row completely before starting next row - for (std::map<TechType, CUIButton*>::iterator it = m_tech_type_buttons.begin(); it != m_tech_type_buttons.end(); ++it) { + for (std::map<TechType, CUIButton*>::iterator it = m_tech_type_buttons.begin(); + it != m_tech_type_buttons.end(); ++it) + { ++col; if (col >= m_buttons_per_row) { ++row; @@ -330,7 +335,9 @@ } // place status buttons: fill each row completely before starting next row - for (std::map<TechStatus, CUIButton*>::iterator it = m_tech_status_buttons.begin(); it != m_tech_status_buttons.end(); ++it) { + for (std::map<TechStatus, CUIButton*>::iterator it = m_tech_status_buttons.begin(); + it != m_tech_status_buttons.end(); ++it) + { ++col; if (col >= m_buttons_per_row) { ++row; @@ -367,7 +374,8 @@ m_status_or_type_button_rows = 1; // only one row, three buttons per row // prevent window from being shrunk less than one button width, or current number of rows of height - SetMinSize(GG::Pt(UPPER_LEFT_PAD + MIN_BUTTON_WIDTH + 3*RIGHT_EDGE_PAD, CUIWnd::BORDER_TOP + CUIWnd::BORDER_BOTTOM + UPPER_LEFT_PAD + (++row)*m_row_offset)); + SetMinSize(GG::Pt(UPPER_LEFT_PAD + MIN_BUTTON_WIDTH + 3*RIGHT_EDGE_PAD, + CUIWnd::BORDER_TOP + CUIWnd::BORDER_BOTTOM + UPPER_LEFT_PAD + (++row)*m_row_offset)); } void TechTreeWnd::TechTreeControls::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { @@ -1519,9 +1527,6 @@ const Tech* tech = GetTech(tech_name); if (!tech) return false; - const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - if (!empire) - return true; // Unresearchable techs are never to be shown on tree if (!tech->Researchable()) @@ -1532,6 +1537,10 @@ return false; if (m_categories_shown.find(tech->Category()) == m_categories_shown.end()) return false; + + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + if (!empire) + return true; // if no empire, techs have no status, so just return true if (m_tech_statuses_shown.find(empire->GetTechStatus(tech->Name())) == m_tech_statuses_shown.end()) return false; |
From: <geo...@us...> - 2013-03-17 11:28:06
|
Revision: 5875 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5875&view=rev Author: geoffthemedio Date: 2013-03-17 11:27:59 +0000 (Sun, 17 Mar 2013) Log Message: ----------- Tech tree rendering tweaks. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-17 09:53:54 UTC (rev 5874) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-17 11:27:59 UTC (rev 5875) @@ -34,7 +34,7 @@ const int MAIN_PANEL_CORNER_RADIUS = 5; const float ARC_THICKNESS = 3.0; - const GG::X TECH_PANEL_WIDTH(200); + const GG::X TECH_PANEL_WIDTH(300); const GG::Y TECH_PANEL_HEIGHT(80); const double MIN_SCALE = 0.1073741824; // = 1.0/(1.25)^10 @@ -456,6 +456,8 @@ const TechTreeWnd::LayoutPanel* m_layout_panel; GG::StaticGraphic* m_icon; GG::TextControl* m_tech_name_text; + GG::Clr m_colour; + TechStatus m_status; }; TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const std::string& tech_name, const LayoutPanel* panel) : @@ -463,7 +465,9 @@ m_tech_name(tech_name), m_layout_panel(panel), m_icon(0), - m_tech_name_text(0) + m_tech_name_text(0), + m_colour(GG::CLR_GRAY), + m_status(TS_RESEARCHABLE) { const Tech* tech = GetTech(m_tech_name); boost::shared_ptr<GG::Font> font = ClientUI::GetFont(FontSize()); @@ -475,17 +479,22 @@ ClientUI::TechIcon(m_tech_name), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); if (tech) { - GG::Clr icon_colour = ClientUI::CategoryColor(tech->Category()); if (const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) { - TechStatus status = empire->GetTechStatus(tech_name); - if (status == TS_UNRESEARCHABLE) { - icon_colour = GG::CLR_GRAY; - //icon_colour.r = (icon_colour.r/2 + 127); - //icon_colour.g = (icon_colour.g/2 + 127); - //icon_colour.b = (icon_colour.b/2 + 127); - } + m_status = empire->GetTechStatus(m_tech_name); + } + m_colour = ClientUI::CategoryColor(tech->Category()); + GG::Clr icon_colour = m_colour; + + if (m_status == TS_UNRESEARCHABLE) { + icon_colour = GG::CLR_GRAY; + m_colour.a = 64; + } else if (m_status == TS_RESEARCHABLE) { + m_colour.a = 144; + } else { + m_colour.a = 255; } + m_icon->SetColor(icon_colour); } @@ -495,7 +504,7 @@ GG::Y text_top(PAD/2); GG::X text_width(TECH_PANEL_WIDTH - text_left); GG::Y text_height(TECH_PANEL_HEIGHT - PAD); - m_tech_name_text = new GG::TextControl(text_left, text_top, text_width, text_height, + m_tech_name_text = new ShadowedTextControl(text_left, text_top, text_width, text_height, UserString(m_tech_name), font, ClientUI::TextColor(), GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT); } @@ -505,6 +514,7 @@ bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const { const GG::Pt p = m_layout_panel->Convert(pt) - UpperLeft(); + //return GG::Wnd::InWindow(p - UpperLeft()); const int PAD = 8; return m_icon->InWindow(p) || m_tech_name_text->InWindow(p + GG::Pt(GG::X(PAD), GG::Y0)); // shift right so clicking in gap between icon and text doesn't miss the panel } @@ -512,9 +522,35 @@ void TechTreeWnd::LayoutPanel::TechPanel::Render() { m_layout_panel->DoZoom(UpperLeft()); + glDisable(GL_TEXTURE_2D); + glEnable(GL_LINE_SMOOTH); + glLineWidth(2.0); + + GG::Pt ul(m_icon->Width() + 4, GG::Y0); + GG::Pt lr(Size()); + + glColor(GG::CLR_BLACK); + PartlyRoundedRect(ul, lr, 5, true, true, true, true, true); + + glColor(m_colour); + PartlyRoundedRect(ul, lr, 5, true, true, true, true, true); + + if (m_status == TS_RESEARCHABLE) { + GG::Clr clr = m_colour; + clr.a = 255; + glColor(clr); + PartlyRoundedRect(ul, lr, 5, true, true, true, true, false); + } + + glLineWidth(1.0); + glDisable(GL_LINE_SMOOTH); + glEnable(GL_TEXTURE_2D); + m_icon->Render(); - if (FontSize() * m_layout_panel->Scale() > 12) + + if (FontSize() * m_layout_panel->Scale() > 12) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming m_tech_name_text->Render(); + m_layout_panel->UndoZoom(); } @@ -1430,9 +1466,9 @@ GG::Connect(m_tech_list->TechDoubleClickedSignal, &TechTreeWnd::TechDoubleClickedSlot, this); GG::X ENC_WIDTH(480); - GG::Y END_HEIGHT(240); + GG::Y ENC_HEIGHT(240); - m_enc_detail_panel = new EncyclopediaDetailPanel(ENC_WIDTH, END_HEIGHT); + m_enc_detail_panel = new EncyclopediaDetailPanel(ENC_WIDTH, ENC_HEIGHT); AttachChild(m_enc_detail_panel); m_tech_tree_controls = new TechTreeControls(GG::X1, GG::Y1, m_layout_panel->Width() - ClientUI::ScrollWidth()); |
From: <geo...@us...> - 2013-03-18 09:10:07
|
Revision: 5881 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5881&view=rev Author: geoffthemedio Date: 2013-03-18 09:09:59 +0000 (Mon, 18 Mar 2013) Log Message: ----------- More tree zoom tweaks. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 08:16:39 UTC (rev 5880) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 09:09:59 UTC (rev 5881) @@ -34,13 +34,13 @@ const int MAIN_PANEL_CORNER_RADIUS = 5; const float ARC_THICKNESS = 3.0; - const GG::X TECH_PANEL_WIDTH(150); - const GG::Y TECH_PANEL_HEIGHT(40); + const GG::X TECH_PANEL_WIDTH(225); + const GG::Y TECH_PANEL_HEIGHT(60); - const double ZOOM_STEP_SIZE = 1.08; + const double ZOOM_STEP_SIZE = 1.12; const double MIN_SCALE = std::pow(ZOOM_STEP_SIZE, -25.0); const double MAX_SCALE = std::pow(ZOOM_STEP_SIZE, 10.0); - const double INITIAL_SCALE = 1.0; + const double INITIAL_SCALE = std::pow(ZOOM_STEP_SIZE, -5.0); struct ToggleCategoryFunctor { ToggleCategoryFunctor(TechTreeWnd* tree_wnd, const std::string& category) : m_tree_wnd(tree_wnd), m_category(category) {} @@ -511,7 +511,7 @@ } int TechTreeWnd::LayoutPanel::TechPanel::FontSize() const -{ return ClientUI::Pts(); } +{ return ClientUI::Pts() * 3 / 2; } bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const { const GG::Pt p = m_layout_panel->Convert(pt) - UpperLeft(); @@ -549,6 +549,8 @@ m_icon->Render(); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); if (FontSize() * m_layout_panel->Scale() > 8) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming m_tech_name_text->Render(); |
From: <geo...@us...> - 2013-03-18 09:39:32
|
Revision: 5882 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5882&view=rev Author: geoffthemedio Date: 2013-03-18 09:39:20 +0000 (Mon, 18 Mar 2013) Log Message: ----------- Tech panel mouseover and selection indicators. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 09:09:59 UTC (rev 5881) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 09:39:20 UTC (rev 5882) @@ -32,7 +32,7 @@ } bool temp_bool = RegisterOptions(&AddOptions); - const int MAIN_PANEL_CORNER_RADIUS = 5; + const int MAIN_PANEL_CORNER_RADIUS = 8; const float ARC_THICKNESS = 3.0; const GG::X TECH_PANEL_WIDTH(225); const GG::Y TECH_PANEL_HEIGHT(60); @@ -459,6 +459,8 @@ GG::TextControl* m_tech_name_text; GG::Clr m_colour; TechStatus m_status; + bool m_browse_highlight; + bool m_selected; }; TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const std::string& tech_name, const LayoutPanel* panel) : @@ -468,7 +470,9 @@ m_icon(0), m_tech_name_text(0), m_colour(GG::CLR_GRAY), - m_status(TS_RESEARCHABLE) + m_status(TS_RESEARCHABLE), + m_browse_highlight(false), + m_selected(false) { const Tech* tech = GetTech(m_tech_name); boost::shared_ptr<GG::Font> font = ClientUI::GetFont(FontSize()); @@ -521,37 +525,51 @@ } void TechTreeWnd::LayoutPanel::TechPanel::Render() { + const int PAD = 8; + m_layout_panel->DoZoom(UpperLeft()); glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glLineWidth(2.0); - GG::Pt ul(m_icon->Width() + 4, GG::Y0); + GG::Pt ul(m_icon->Width() + PAD/2, GG::Y0); GG::Pt lr(Size()); glColor(GG::CLR_BLACK); - PartlyRoundedRect(ul, lr, 5, true, true, true, true, true); + PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); glColor(m_colour); - PartlyRoundedRect(ul, lr, 5, true, true, true, true, true); + PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); - if (m_status == TS_RESEARCHABLE) { + if (m_browse_highlight) { + // white border + glColor(GG::CLR_WHITE); + PartlyRoundedRect(ul, lr, PAD, true, true, true, true, false); + } else if (m_status == TS_RESEARCHABLE) { + // coloured border GG::Clr clr = m_colour; clr.a = 255; glColor(clr); - PartlyRoundedRect(ul, lr, 5, true, true, true, true, false); + PartlyRoundedRect(ul, lr, PAD, true, true, true, true, false); } + if (m_selected) { + // enclosing larger border / box + glColor(GG::CLR_WHITE); + GG::Pt gap = GG::Pt(GG::X(PAD), GG::Y(PAD)); + GG::Pt enc_ul(-gap); + GG::Pt enc_lr(lr + gap); + PartlyRoundedRect(enc_ul, enc_lr, PAD + 2, true, true, true, true, false); + } + glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); glEnable(GL_TEXTURE_2D); m_icon->Render(); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); - if (FontSize() * m_layout_panel->Scale() > 8) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming + if (FontSize() * m_layout_panel->Scale() > 10) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming m_tech_name_text->Render(); m_layout_panel->UndoZoom(); @@ -566,14 +584,18 @@ void TechTreeWnd::LayoutPanel::TechPanel::LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { TechDoubleClickedSignal(m_tech_name, mod_keys); } -void TechTreeWnd::LayoutPanel::TechPanel::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) -{ TechBrowsedSignal(m_tech_name); } +void TechTreeWnd::LayoutPanel::TechPanel::MouseEnter(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { + TechBrowsedSignal(m_tech_name); + m_browse_highlight = true; +} -void TechTreeWnd::LayoutPanel::TechPanel::MouseLeave() -{ TechBrowsedSignal(""); } +void TechTreeWnd::LayoutPanel::TechPanel::MouseLeave() { + TechBrowsedSignal(""); + m_browse_highlight = false; +} void TechTreeWnd::LayoutPanel::TechPanel::Select(bool select) -{} +{ m_selected = select; } void TechTreeWnd::LayoutPanel::TechPanel::Update() { Select(m_layout_panel->m_selected_tech_name == m_tech_name); } @@ -1105,7 +1127,7 @@ SetScale(m_scale * ZOOM_STEP_SIZE); else if (move < 0) SetScale(m_scale / ZOOM_STEP_SIZE); - std::cout << m_scale << std::endl; + //std::cout << m_scale << std::endl; } void TechTreeWnd::LayoutPanel::TreeZoomInClicked() |
From: <geo...@us...> - 2013-03-18 11:00:43
|
Revision: 5884 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5884&view=rev Author: geoffthemedio Date: 2013-03-18 11:00:35 +0000 (Mon, 18 Mar 2013) Log Message: ----------- -First draft of tech panel browse windows. -Moved some tech panel updating code into Update from the constructor. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 09:57:24 UTC (rev 5883) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-18 11:00:35 UTC (rev 5884) @@ -5,6 +5,7 @@ #include "CUIDrawUtil.h" #include "CUIWnd.h" #include "Sound.h" +#include "InfoPanels.h" #include "EncyclopediaDetailPanel.h" #include "../client/human/HumanClientApp.h" #include "../util/AppInterface.h" @@ -483,26 +484,7 @@ m_icon = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(GRAPHIC_SIZE), GG::Y(GRAPHIC_SIZE), ClientUI::TechIcon(m_tech_name), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); - if (tech) { - if (const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) { - m_status = empire->GetTechStatus(m_tech_name); - } - m_colour = ClientUI::CategoryColor(tech->Category()); - GG::Clr icon_colour = m_colour; - - if (m_status == TS_UNRESEARCHABLE) { - icon_colour = GG::CLR_GRAY; - m_colour.a = 64; - } else if (m_status == TS_RESEARCHABLE) { - m_colour.a = 144; - } else { - m_colour.a = 255; - } - - m_icon->SetColor(icon_colour); - } - // tech name text const int PAD = 8; GG::X text_left(GG::X(GRAPHIC_SIZE) + PAD); @@ -510,8 +492,12 @@ GG::X text_width(TECH_PANEL_WIDTH - text_left); GG::Y text_height(TECH_PANEL_HEIGHT - PAD); m_tech_name_text = new ShadowedTextControl(text_left, text_top, text_width, text_height, - UserString(m_tech_name), font, ClientUI::TextColor(), - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT); + "", font, ClientUI::TextColor(), + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT); + + SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + + Update(); } int TechTreeWnd::LayoutPanel::TechPanel::FontSize() const @@ -578,7 +564,6 @@ void TechTreeWnd::LayoutPanel::TechPanel::LClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { if (m_layout_panel->m_selected_tech_name != m_tech_name) TechClickedSignal(m_tech_name, mod_keys); - //std::cout << "TechPanel::LClick tech name text: " << m_tech_name_text->Text() << std::endl; } void TechTreeWnd::LayoutPanel::TechPanel::LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) @@ -597,10 +582,69 @@ void TechTreeWnd::LayoutPanel::TechPanel::Select(bool select) { m_selected = select; } -void TechTreeWnd::LayoutPanel::TechPanel::Update() -{ Select(m_layout_panel->m_selected_tech_name == m_tech_name); } +namespace { + boost::shared_ptr<GG::BrowseInfoWnd> TechPanelRowBrowseWnd(const std::string& tech_name, + int empire_id) + { + const Empire* empire = Empires().Lookup(empire_id); + const Tech* tech = GetTech(tech_name); + std::string cost_turns_text, main_text; + if (tech) { + int turns = tech->ResearchTime(empire_id); + double cost = tech->ResearchCost(empire_id); + const std::string& cost_units = UserString("ENC_RP"); + cost_turns_text = boost::io::str(FlexibleFormat(UserString("ENC_COST_AND_TURNS_STR")) + % DoubleToString(cost, 3, false) + % cost_units + % turns); + } + + if (empire) { + bool tech_status = empire->GetTechStatus(tech_name); + } + + main_text += cost_turns_text; + + boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd(new IconTextBrowseWnd( + ClientUI::TechIcon(tech_name), UserString(tech_name), main_text)); + return browse_wnd; + } +} + +void TechTreeWnd::LayoutPanel::TechPanel::Update() { + Select(m_layout_panel->m_selected_tech_name == m_tech_name); + + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + + if (const Empire* empire = Empires().Lookup(client_empire_id)) { + m_status = empire->GetTechStatus(m_tech_name); + } + + GG::Clr icon_colour = GG::CLR_WHITE; + if (const Tech* tech = GetTech(m_tech_name)) { + m_colour = ClientUI::CategoryColor(tech->Category()); + icon_colour = m_colour; + + if (m_status == TS_UNRESEARCHABLE) { + icon_colour = GG::CLR_GRAY; + m_colour.a = 64; + } else if (m_status == TS_RESEARCHABLE) { + m_colour.a = 144; + } else { + m_colour.a = 255; + } + } + m_icon->SetColor(icon_colour); + + m_tech_name_text->SetText(UserString(m_tech_name)); + + ClearBrowseInfoWnd(); + SetBrowseInfoWnd(TechPanelRowBrowseWnd(m_tech_name, client_empire_id)); +} + + ////////////////////////////////////////////////// // TechTreeWnd::LayoutPanel // ////////////////////////////////////////////////// |
From: <geo...@us...> - 2013-03-21 10:03:20
|
Revision: 5890 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5890&view=rev Author: geoffthemedio Date: 2013-03-21 10:03:14 +0000 (Thu, 21 Mar 2013) Log Message: ----------- Grey unresearched tech icons on tree to better distinguish from researched techs. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-21 10:01:22 UTC (rev 5889) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-21 10:03:14 UTC (rev 5890) @@ -664,6 +664,7 @@ icon_colour = GG::CLR_GRAY; m_colour.a = 64; } else if (m_status == TS_RESEARCHABLE) { + icon_colour = GG::CLR_GRAY; m_colour.a = 144; } else { m_colour.a = 255; |
From: <geo...@us...> - 2013-03-24 14:00:44
|
Revision: 5902 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5902&view=rev Author: geoffthemedio Date: 2013-03-24 14:00:38 +0000 (Sun, 24 Mar 2013) Log Message: ----------- Made panel-size font-size dependent. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-24 07:23:22 UTC (rev 5901) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-24 14:00:38 UTC (rev 5902) @@ -35,9 +35,13 @@ const int MAIN_PANEL_CORNER_RADIUS = 8; const float ARC_THICKNESS = 3.0; - const GG::X TECH_PANEL_WIDTH(225); - const GG::Y TECH_PANEL_HEIGHT(60); + GG::X TechPanelWidth() + { return GG::X(ClientUI::Pts()*18); } + GG::Y TechPanelHeight() + { return GG::Y(ClientUI::Pts()*5); } + + const double ZOOM_STEP_SIZE = 1.12; const double MIN_SCALE = std::pow(ZOOM_STEP_SIZE, -25.0); const double MAX_SCALE = std::pow(ZOOM_STEP_SIZE, 10.0); @@ -468,7 +472,7 @@ }; TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const std::string& tech_name, const LayoutPanel* panel) : - GG::Wnd(GG::X0, GG::Y0, TECH_PANEL_WIDTH, TECH_PANEL_HEIGHT, GG::INTERACTIVE), + GG::Wnd(GG::X0, GG::Y0, TechPanelWidth(), TechPanelHeight(), GG::INTERACTIVE), m_tech_name(tech_name), m_layout_panel(panel), m_icon(0), @@ -486,7 +490,7 @@ //REMARK: do not use AttachChild but add child->Render() to method render, // as the component is zoomed tech icon - const int GRAPHIC_SIZE = Value(TECH_PANEL_HEIGHT); + const int GRAPHIC_SIZE = Value(TechPanelHeight()); m_icon = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(GRAPHIC_SIZE), GG::Y(GRAPHIC_SIZE), ClientUI::TechIcon(m_tech_name), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); @@ -495,8 +499,8 @@ const int PAD = 8; GG::X text_left(GG::X(GRAPHIC_SIZE) + PAD); GG::Y text_top(0); - GG::X text_width(TECH_PANEL_WIDTH - text_left); - GG::Y text_height(TECH_PANEL_HEIGHT); + GG::X text_width(TechPanelWidth() - text_left); + GG::Y text_height(TechPanelHeight()); m_tech_name_text = new ShadowedTextControl(text_left, text_top, text_width, text_height, "", font, ClientUI::TextColor(), GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT); @@ -1074,10 +1078,10 @@ void TechTreeWnd::LayoutPanel::Layout(bool keep_position) { const GG::X TECH_PANEL_MARGIN_X(ClientUI::Pts()*16); const GG::Y TECH_PANEL_MARGIN_Y(ClientUI::Pts()*16 + 100); - const double RANK_SEP = Value(TECH_PANEL_WIDTH) * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing"); - const double NODE_SEP = Value(TECH_PANEL_HEIGHT) * GetOptionsDB().Get<double>("UI.tech-layout-vert-spacing"); - const double WIDTH = Value(TECH_PANEL_WIDTH); - const double HEIGHT = Value(TECH_PANEL_HEIGHT); + const double RANK_SEP = Value(TechPanelWidth()) * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing"); + const double NODE_SEP = Value(TechPanelHeight()) * GetOptionsDB().Get<double>("UI.tech-layout-vert-spacing"); + const double WIDTH = Value(TechPanelWidth()); + const double HEIGHT = Value(TechPanelHeight()); const double X_MARGIN(12); // view state initial data |
From: <geo...@us...> - 2013-03-25 07:22:05
|
Revision: 5905 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5905&view=rev Author: geoffthemedio Date: 2013-03-25 07:21:56 +0000 (Mon, 25 Mar 2013) Log Message: ----------- Made shift + single click enqueue a tech. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-24 23:04:55 UTC (rev 5904) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-03-25 07:21:56 UTC (rev 5905) @@ -1847,8 +1847,12 @@ void TechTreeWnd::TechClickedSlot(const std::string& tech_name, const GG::Flags<GG::ModKey>& modkeys) { - SetEncyclopediaTech(tech_name); - TechSelectedSignal(tech_name); + if (modkeys & GG::MOD_KEY_SHIFT) { + TechDoubleClickedSlot(tech_name, modkeys); + } else { + SetEncyclopediaTech(tech_name); + TechSelectedSignal(tech_name); + } } void TechTreeWnd::TechDoubleClickedSlot(const std::string& tech_name, |
From: <geo...@us...> - 2013-06-02 14:23:42
|
Revision: 6102 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6102&view=rev Author: geoffthemedio Date: 2013-06-02 14:23:36 +0000 (Sun, 02 Jun 2013) Log Message: ----------- Tweaks to tech panel rendering code. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-02 11:25:35 UTC (rev 6101) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-02 14:23:36 UTC (rev 6102) @@ -36,9 +36,9 @@ const int MAIN_PANEL_CORNER_RADIUS = 8; const float ARC_THICKNESS = 3.0; GG::X TechPanelWidth() - { return GG::X(ClientUI::Pts()*18); } + { return GG::X(ClientUI::Pts()*20); } GG::Y TechPanelHeight() - { return GG::Y(ClientUI::Pts()*5); } + { return GG::Y(ClientUI::Pts()*6); } @@ -357,9 +357,13 @@ void HideStatus(TechStatus status); void ShowTech(const std::string& tech_name); void CenterOnTech(const std::string& tech_name); - void DoZoom(const GG::Pt & p) const; + void DoZoom(const GG::Pt &pt) const; void UndoZoom() const; - GG::Pt Convert(const GG::Pt & p) const; + + // Converts between screen coordinates and virtual coordiantes + // doing the inverse or same transformation as DoZoom does with gl calls + GG::Pt ConvertPtScreenToZoomed(const GG::Pt& pt) const; + GG::Pt ConvertPtZoomedToScreen(const GG::Pt& pt) const; //@} private: @@ -459,10 +463,10 @@ private: const std::string& m_tech_name; + std::string m_name_text; + std::string m_eta_text; const TechTreeWnd::LayoutPanel* m_layout_panel; GG::StaticGraphic* m_icon; - GG::TextControl* m_tech_name_text; - GG::TextControl* m_eta_text; GG::Clr m_colour; TechStatus m_status; bool m_browse_highlight; @@ -474,10 +478,10 @@ TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const std::string& tech_name, const LayoutPanel* panel) : GG::Wnd(GG::X0, GG::Y0, TechPanelWidth(), TechPanelHeight(), GG::INTERACTIVE), m_tech_name(tech_name), + m_name_text(), + m_eta_text(), m_layout_panel(panel), m_icon(0), - m_tech_name_text(0), - m_eta_text(0), m_colour(GG::CLR_GRAY), m_status(TS_RESEARCHABLE), m_browse_highlight(false), @@ -485,34 +489,12 @@ m_eta(-1), m_enqueued(false) { - //const Tech* tech = GetTech(m_tech_name); - boost::shared_ptr<GG::Font> font = ClientUI::GetFont(FontSize()); - - //REMARK: do not use AttachChild but add child->Render() to method render, - // as the component is zoomed tech icon const int GRAPHIC_SIZE = Value(TechPanelHeight()); m_icon = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(GRAPHIC_SIZE), GG::Y(GRAPHIC_SIZE), ClientUI::TechIcon(m_tech_name), GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); + // intentionally not attaching as child; TechPanel::Render calls m_icon->Render() instead. - // tech name text - const int PAD = 8; - GG::X text_left(GG::X(GRAPHIC_SIZE) + PAD); - GG::Y text_top(0); - GG::X text_width(TechPanelWidth() - text_left); - GG::Y text_height(TechPanelHeight()); - m_tech_name_text = new ShadowedTextControl(text_left, text_top, text_width, text_height, - "", font, ClientUI::TextColor(), - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT); - - text_left += text_width*3/4; - text_width = text_width/2; - text_top += text_height*7/8; - text_height = text_height/4; - m_eta_text = new ShadowedTextControl(text_left, text_top, text_width, text_height, - "", font, ClientUI::TextColor(), - GG::FORMAT_VCENTER | GG::FORMAT_CENTER); - SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); Update(); @@ -522,25 +504,28 @@ { return ClientUI::Pts() * 3 / 2; } bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const { - const GG::Pt p = m_layout_panel->Convert(pt) - UpperLeft(); - //return GG::Wnd::InWindow(p - UpperLeft()); - const int PAD = 8; - return m_icon->InWindow(p) || m_tech_name_text->InWindow(p + GG::Pt(GG::X(PAD), GG::Y0)); // shift right so clicking in gap between icon and text doesn't miss the panel + const GG::Pt p = m_layout_panel->ConvertPtScreenToZoomed(pt) - UpperLeft(); + if (m_icon->InWindow(p)) + return true; + return GG::Pt(GG::X0, GG::Y0) <= p && p < GG::Pt(TechPanelWidth(), TechPanelHeight()); } void TechTreeWnd::LayoutPanel::TechPanel::Render() { const int PAD = 8; + GG::X text_left(GG::X(Value(TechPanelHeight())) + PAD); + GG::Y text_top(0); + GG::X text_width(TechPanelWidth() - text_left); + GG::Y text_height(TechPanelHeight()); + GG::Pt ul = GG::Pt(text_left, text_top); + GG::Pt lr = ul + GG::Pt(text_width + PAD, text_height); + m_layout_panel->DoZoom(UpperLeft()); glDisable(GL_TEXTURE_2D); glEnable(GL_LINE_SMOOTH); glLineWidth(2.0); - //GG::Pt ul(m_icon->Width() + PAD/2, GG::Y0); - GG::Pt ul = m_tech_name_text->UpperLeft() - GG::Pt(GG::X(PAD/2), GG::Y0); - GG::Pt lr = m_tech_name_text->LowerRight(); - // black out dependency lines under panel glColor(GG::CLR_BLACK); PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); @@ -550,11 +535,36 @@ PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); // tech name - glEnable(GL_TEXTURE_2D); - if (FontSize() * m_layout_panel->Scale() > 10) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming - m_tech_name_text->Render(); - glDisable(GL_TEXTURE_2D); + int font_pts = static_cast<int>(FontSize() * m_layout_panel->Scale() + 0.5); + if (font_pts > 10) { + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(FontSize()); + GG::Pt text_ul = ul + GG::Pt(GG::X(4), GG::Y0); + GG::Pt text_lr = lr - GG::Pt(GG::X(PAD + 4), GG::Y0); + glEnable(GL_TEXTURE_2D); + + std::vector<GG::Font::LineData> line_data; + font->DetermineLines(m_name_text, GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, + lr.x - ul.x, line_data); + + // render background offset from actual text location + glColor(GG::CLR_BLACK); + font->RenderText(text_ul - GG::Pt(GG::X1, GG::Y0), text_lr - GG::Pt(GG::X1, GG::Y0), m_name_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(text_ul + GG::Pt(GG::X1, GG::Y0), text_lr - GG::Pt(GG::X1, GG::Y0), m_name_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(text_ul + GG::Pt(GG::X1, GG::Y0), text_lr + GG::Pt(GG::X1, GG::Y0), m_name_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(text_ul - GG::Pt(GG::X1, GG::Y0), text_lr + GG::Pt(GG::X1, GG::Y0), m_name_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + // render actual text + glColor(ClientUI::TextColor()); + font->RenderText(text_ul, text_lr, m_name_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + + glDisable(GL_TEXTURE_2D); + } + // panel border GG::Clr border_colour; if (m_browse_highlight) { @@ -577,8 +587,8 @@ // nothing! } - // ETA background - if (m_eta != -1 && FontSize() * m_layout_panel->Scale() > 10) { + // ETA background and text + if (m_eta != -1 && font_pts > 10) { GG::Pt panel_size = lr - ul; GG::Pt eta_ul = ul + GG::Pt(panel_size.x*3/4, panel_size.y*3/4) - GG::Pt(GG::X(2), GG::Y(2)); GG::Pt eta_lr = eta_ul + GG::Pt(panel_size.x/2, panel_size.y/2) + GG::Pt(GG::X(2), GG::Y(2)); @@ -587,6 +597,31 @@ CircleArc(eta_ul, eta_lr, 0, 6.28, true); glColor(border_colour); CircleArc(eta_ul, eta_lr, 0, 6.28, true); + + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(FontSize()); + + glEnable(GL_TEXTURE_2D); + + std::vector<GG::Font::LineData> line_data; + font->DetermineLines(m_eta_text, GG::FORMAT_VCENTER | GG::FORMAT_CENTER, + eta_lr.x - eta_ul.x, line_data); + + // render background offset from actual text location + glColor(GG::CLR_BLACK); + font->RenderText(eta_ul - GG::Pt(GG::X1, GG::Y0), eta_lr - GG::Pt(GG::X1, GG::Y0), m_eta_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(eta_ul + GG::Pt(GG::X1, GG::Y0), eta_lr - GG::Pt(GG::X1, GG::Y0), m_eta_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(eta_ul + GG::Pt(GG::X1, GG::Y0), eta_lr + GG::Pt(GG::X1, GG::Y0), m_eta_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(eta_ul - GG::Pt(GG::X1, GG::Y0), eta_lr + GG::Pt(GG::X1, GG::Y0), m_eta_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + // render actual text + glColor(ClientUI::TextColor()); + font->RenderText(eta_ul, eta_lr, m_eta_text, + GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + + glDisable(GL_TEXTURE_2D); } // box around whole panel to indicate enqueue @@ -604,9 +639,6 @@ m_icon->Render(); - if (m_eta != -1 && FontSize() * m_layout_panel->Scale() > 10) // in my tests, smaller fonts appear garbled / pixilated due to rescaling for zooming - m_eta_text->Render(); - m_layout_panel->UndoZoom(); } @@ -740,13 +772,11 @@ const ResearchQueue& queue = empire->GetResearchQueue(); ResearchQueue::const_iterator queue_it = queue.find(m_tech_name); if (queue_it != queue.end()) { - //double progress = empire->ResearchProgress(tech_name); - //double total_cost = tech->ResearchCost(empire_id); - //double allocation = queue_it->allocated_rp; - //double max_allocation = tech->PerTurnCost(empire_id); m_eta = queue_it->turns_left; if (m_eta != -1) - m_eta_text->SetText(boost::lexical_cast<std::string>(m_eta)); + m_eta_text = boost::lexical_cast<std::string>(m_eta); + else + m_eta_text.clear(); } } @@ -767,7 +797,7 @@ } m_icon->SetColor(icon_colour); - m_tech_name_text->SetText(UserString(m_tech_name)); + m_name_text = UserString(m_tech_name); ClearBrowseInfoWnd(); SetBrowseInfoWnd(TechPanelRowBrowseWnd(m_tech_name, client_empire_id)); @@ -1047,7 +1077,7 @@ GG::SignalScroll(*m_vscroll, true); } -void TechTreeWnd::LayoutPanel::DoZoom(const GG::Pt& p) const { +void TechTreeWnd::LayoutPanel::DoZoom(const GG::Pt& pt) const { glPushMatrix(); //center to panel glTranslated(Value(Width()/2.0), Value(Height()/2.0), 0); @@ -1055,17 +1085,15 @@ glScaled(m_scale, m_scale, 1); //translate to actual scroll position glTranslated(-m_scroll_position_x, -m_scroll_position_y, 0); - glTranslated(Value(p.x), Value(p.y), 0); + glTranslated(Value(pt.x), Value(pt.y), 0); } void TechTreeWnd::LayoutPanel::UndoZoom() const { glPopMatrix(); } -GG::Pt TechTreeWnd::LayoutPanel::Convert(const GG::Pt & p) const { - // Converts screen coordinate into virtual coordiante - // doing the inverse transformation as DoZoom in the same order - double x = Value(p.x); - double y = Value(p.y); +GG::Pt TechTreeWnd::LayoutPanel::ConvertPtScreenToZoomed(const GG::Pt& pt) const { + double x = Value(pt.x); + double y = Value(pt.y); x -= Value(Width()/2.0); y -= Value(Height()/2.0); x /= m_scale; @@ -1075,6 +1103,18 @@ return GG::Pt(GG::X(static_cast<int>(x)), GG::Y(static_cast<int>(y))); } +GG::Pt TechTreeWnd::LayoutPanel::ConvertPtZoomedToScreen(const GG::Pt& pt) const { + double x = Value(pt.x); + double y = Value(pt.y); + x -= m_scroll_position_x; + y -= m_scroll_position_y; + x *= m_scale; + y *= m_scale; + x += Value(Width()/2.0); + y += Value(Height()/2.0); + return GG::Pt(GG::X(static_cast<int>(x)), GG::Y(static_cast<int>(y))); +} + void TechTreeWnd::LayoutPanel::Layout(bool keep_position) { const GG::X TECH_PANEL_MARGIN_X(ClientUI::Pts()*16); const GG::Y TECH_PANEL_MARGIN_Y(ClientUI::Pts()*16 + 100); |
From: <dil...@us...> - 2013-06-03 15:54:50
|
Revision: 6103 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6103&view=rev Author: dilvish-fo Date: 2013-06-03 15:54:40 +0000 (Mon, 03 Jun 2013) Log Message: ----------- patch by adrian for TechTreeWnd don-t-hand-over-flags-anonymously-for-ref-params resolves compile problems in Linux, hopefully also for MacOS Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-02 14:23:36 UTC (rev 6102) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-03 15:54:40 UTC (rev 6103) @@ -544,23 +544,22 @@ glEnable(GL_TEXTURE_2D); std::vector<GG::Font::LineData> line_data; - font->DetermineLines(m_name_text, GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, - lr.x - ul.x, line_data); + GG::Flags<GG::TextFormat> line_format = GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT; + font->DetermineLines(m_name_text, line_format, lr.x - ul.x, line_data); // render background offset from actual text location glColor(GG::CLR_BLACK); font->RenderText(text_ul - GG::Pt(GG::X1, GG::Y0), text_lr - GG::Pt(GG::X1, GG::Y0), m_name_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(text_ul + GG::Pt(GG::X1, GG::Y0), text_lr - GG::Pt(GG::X1, GG::Y0), m_name_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(text_ul + GG::Pt(GG::X1, GG::Y0), text_lr + GG::Pt(GG::X1, GG::Y0), m_name_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(text_ul - GG::Pt(GG::X1, GG::Y0), text_lr + GG::Pt(GG::X1, GG::Y0), m_name_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); // render actual text glColor(ClientUI::TextColor()); - font->RenderText(text_ul, text_lr, m_name_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(text_ul, text_lr, m_name_text, line_format, &line_data); glDisable(GL_TEXTURE_2D); } @@ -603,23 +602,23 @@ glEnable(GL_TEXTURE_2D); std::vector<GG::Font::LineData> line_data; - font->DetermineLines(m_eta_text, GG::FORMAT_VCENTER | GG::FORMAT_CENTER, - eta_lr.x - eta_ul.x, line_data); + GG::Flags<GG::TextFormat> line_format = GG::FORMAT_VCENTER | GG::FORMAT_VCENTER; + font->DetermineLines(m_eta_text, line_format, eta_lr.x - eta_ul.x, line_data); + line_format = GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT; // render background offset from actual text location glColor(GG::CLR_BLACK); font->RenderText(eta_ul - GG::Pt(GG::X1, GG::Y0), eta_lr - GG::Pt(GG::X1, GG::Y0), m_eta_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(eta_ul + GG::Pt(GG::X1, GG::Y0), eta_lr - GG::Pt(GG::X1, GG::Y0), m_eta_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(eta_ul + GG::Pt(GG::X1, GG::Y0), eta_lr + GG::Pt(GG::X1, GG::Y0), m_eta_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); font->RenderText(eta_ul - GG::Pt(GG::X1, GG::Y0), eta_lr + GG::Pt(GG::X1, GG::Y0), m_eta_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + line_format, &line_data); // render actual text glColor(ClientUI::TextColor()); - font->RenderText(eta_ul, eta_lr, m_eta_text, - GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT, &line_data); + font->RenderText(eta_ul, eta_lr, m_eta_text, line_format, &line_data); glDisable(GL_TEXTURE_2D); } |
From: <dil...@us...> - 2013-06-11 14:49:56
|
Revision: 6141 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6141&view=rev Author: dilvish-fo Date: 2013-06-11 14:49:49 +0000 (Tue, 11 Jun 2013) Log Message: ----------- undoes some changes to TechTreeWnd that accidentally slipped in with r6140 Revision Links: -------------- http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6140&view=rev Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-11 07:59:03 UTC (rev 6140) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-11 14:49:49 UTC (rev 6141) @@ -144,8 +144,7 @@ it->second->MarkNotSelected(); // create buttons to switch between tree and list views - //m_list_view_button = new CUIButton(GG::X0, GG::Y0, GG::X(80), UserString("TECH_WND_LIST_VIEW")); - m_list_view_button = new CUIButton(GG::X0, GG::Y0, GG::X(80), "LoadMyTechs"); + m_list_view_button = new CUIButton(GG::X0, GG::Y0, GG::X(80), UserString("TECH_WND_LIST_VIEW")); m_list_view_button->MarkNotSelected(); AttachChild(m_list_view_button); m_tree_view_button = new CUIButton(GG::X0, GG::Y(30), GG::X(80), UserString("TECH_WND_TREE_VIEW")); @@ -1703,8 +1702,7 @@ // connect view type selectors GG::Connect(m_tech_tree_controls->m_tree_view_button->LeftClickedSignal, &TechTreeWnd::ShowTreeView, this); - //GG::Connect(m_tech_tree_controls->m_list_view_button->LeftClickedSignal, &TechTreeWnd::ShowListView, this); - GG::Connect(m_tech_tree_controls->m_list_view_button->LeftClickedSignal, &TechTreeWnd::AddMyTechs, this); + GG::Connect(m_tech_tree_controls->m_list_view_button->LeftClickedSignal, &TechTreeWnd::ShowListView, this); ShowAllCategories(); ShowStatus(TS_RESEARCHABLE); @@ -1928,235 +1926,3 @@ tech_vec.push_back(tech_name); AddTechsToQueueSignal(tech_vec, queue_pos); } - -void TechTreeWnd::AddMyTechs() { - const int firstline=1898; - const int lastline= 2006; - const int numTechs= lastline-firstline+1; - const char* techs[] = { - "SHP_WEAPON_1_2", - "GRO_PLANET_ECOL", - "SHP_DOMESTIC_MONSTER", - "SHP_ORG_HULL", - "SHP_WEAPON_1_3", - "GRO_SUBTER_HAB", - "LRN_ALGO_ELEGANCE", - "SHP_WEAPON_1_4", - "PRO_ROBOTIC_PROD", - "LRN_ARTIF_MINDS", - "CON_ENV_ENCAPSUL", - "DEF_DEFENSE_NET_1", - "PRO_FUSION_GEN", - "PRO_INDUSTRY_CENTER_I", - "DEF_GARRISON_1", - "LRN_FORCE_FIELD", - "CON_ORBITAL_CON", - "PRO_ORBITAL_GEN", - "SHP_ZORTRIUM_PLATE", - "GRO_SYMBIOTIC_BIO", - "SHP_WEAPON_2_1", - "SHP_WEAPON_2_2", - "SHP_DEFLECTOR_SHIELD", - "SHP_WEAPON_2_3", - "DEF_DEFENSE_NET_2", - "DEF_DEFENSE_NET_REGEN_1", - "SPY_DETECT_2", - "SHP_WEAPON_2_4", - "PRO_INDUSTRY_CENTER_II", - "PRO_MICROGRAV_MAN", - "PRO_SOL_ORB_GEN", - "SHP_BASIC_DAM_CONT", - "GRO_GENETIC_ENG", - "DEF_GARRISON_2", - "GRO_XENO_GENETICS", - "SPY_DETECT_3", - "CON_METRO_INFRA", - "SHP_WEAPON_3_1", - "SHP_DIAMOND_PLATE", - "GRO_LIFECYCLE_MAN", - "SHP_MULTICELL_CAST", - "SHP_ENDOCRINE_SYSTEMS", - "DEF_PLAN_BARRIER_SHLD_1", - "SHP_WEAPON_3_2", - "CON_FRC_ENRG_STRC", - "SHP_ADV_DAM_CONT", - "LRN_QUANT_NET", - "SHP_WEAPON_3_3", - "DEF_PLAN_BARRIER_SHLD_2", - "LRN_GRAVITONICS", - "SHP_REINFORCED_HULL", - "CON_CONTGRAV_ARCH", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", - "PRO_SENTIENT_AUTOMATION", - "PRO_EXOBOTS", - "LRN_XENOARCH", - "SHP_WEAPON_3_4", - "DEF_DEFENSE_NET_3", - "DEF_SYST_DEF_MINE_1", - "DEF_PLAN_BARRIER_SHLD_3", - "CON_ORBITAL_HAB", - "DEF_GARRISON_3", - "SHP_CONT_SYMB", - "SHP_MONOCELL_EXP", - "SHP_BIOADAPTIVE_SPEC", - "PRO_SINGULAR_GEN", - "SHP_PLASMA_SHIELD", - "GRO_XENO_HYBRIDS", - "SHP_CONT_BIOADAPT", - "SHP_SENT_HULL", - "LRN_TIME_MECH", - "LRN_STELLAR_TOMOGRAPHY", - "SHP_XENTRONIUM_PLATE", - "SPY_DETECT_4", - "GRO_CYBORG", - "GRO_ENERGY_META", - "LRN_ENCLAVE_VOID", - "CON_NDIM_STRC", - "SHP_WEAPON_4_1", - "SHP_WEAPON_4_2", - "LRN_PSY_DOM", - "LRN_ART_BLACK_HOLE", - "LRN_DISTRIB_THOUGHT", - "PRO_NEUTRONIUM_EXTRACTION", - "SHP_ASTEROID_HULLS", - "GRO_TERRAFORM", - "GRO_GENETIC_MED", - "SHP_INTSTEL_LOG", - "SPY_STEALTH_1", - "CON_CONC_CAMP", - "PRO_INDUSTRY_CENTER_III", - "SPY_STEALTH_2", - "DEF_SYST_DEF_MINE_2", - "SHP_WEAPON_4_3", - "DEF_SYST_DEF_MINE_3", - "SPY_STEALTH_3", - "SPY_DETECT_5", - "SHP_WEAPON_4_4", - "SHP_BLACKSHIELD", - "DEF_GARRISON_4", - "DEF_DEFENSE_NET_REGEN_2", - "SPY_STEALTH_4", - "SHP_ENRG_BOUND_MAN", - "DEF_PLAN_BARRIER_SHLD_4", - "DEF_PLAN_BARRIER_SHLD_5", - "GRO_GAIA_TRANS", - "CON_ART_PLANET", - "SHP_SOLAR_CONT", - }; - const char* oldtechs[] = { - "SHP_WEAPON_2", - "GRO_PLANET_ECOL", - "SHP_WEAPON_3", - "SHP_DOMESTIC_MONSTER", - "SHP_ORG_HULL", - "GRO_SUBTER_HAB", - "SHP_WEAPON_5", - "LRN_ALGO_ELEGANCE", - "LRN_ARTIF_MINDS", - "PRO_ROBOTIC_PROD", - "SHP_WEAPON_6", - "DEF_DEFENSE_NET_1", - "PRO_FUSION_GEN", - "CON_ENV_ENCAPSUL", - "LRN_FORCE_FIELD", - "CON_ORBITAL_CON", - "PRO_ORBITAL_GEN", - "GRO_SYMBIOTIC_BIO", - "DEF_GARRISON_1", - "GRO_GENETIC_ENG", - "GRO_XENO_GENETICS", - "SPY_DETECT_2", - "SHP_WEAPON_7", - "PRO_INDUSTRY_CENTER_I", - "DEF_DEFENSE_NET_2", - "PRO_SOL_ORB_GEN", - "SHP_BASIC_DAM_CONT", - "SHP_WEAPON_9", - "DEF_GARRISON_2", - "CON_METRO_INFRA", - "GRO_LIFECYCLE_MAN", - "SHP_MULTICELL_CAST", - "SHP_ENDOCRINE_SYSTEMS", - "SHP_ADV_DAM_CONT", - "LRN_QUANT_NET", - "DEF_DEFENSE_NET_REGEN_1", - "DEF_PLAN_BARRIER_SHLD_1", - "SHP_WEAPON_10", - "PRO_INDUSTRY_CENTER_II", - "SPY_DETECT_3", - "SHP_WEAPON_11", - "DEF_PLAN_BARRIER_SHLD_2", - "LRN_GRAVITONICS", - "SHP_REINFORCED_HULL", - "CON_CONTGRAV_ARCH", - "LRN_PHYS_BRAIN", - "LRN_TRANSLING_THT", - "PRO_SENTIENT_AUTOMATION", - "PRO_EXOBOTS", - "DEF_DEFENSE_NET_3", - "DEF_SYST_DEF_MINE_1", - "DEF_PLAN_BARRIER_SHLD_3", - "CON_ORBITAL_HAB", - "DEF_GARRISON_3", - "SHP_CONT_SYMB", - "SHP_MONOCELL_EXP", - "SHP_ENDOSYMB_HULL", - "PRO_SINGULAR_GEN", - "LRN_XENOARCH", - "PRO_MICROGRAV_MAN", - "SHP_LEAD_PLATE", - "GRO_XENO_HYBRIDS", - "SHP_ZORTRIUM_PLATE", - "SHP_WEAPON_13", - "CON_CONC_CAMP", - "LRN_TIME_MECH", - "LRN_STELLAR_TOMOGRAPHY", - "SHP_WEAPON_14", - "SPY_DETECT_4", - "PRO_NEUTRONIUM_EXTRACTION", - "LRN_ENCLAVE_VOID", - "LRN_PSY_DOM", - "LRN_ART_BLACK_HOLE", - "SHP_ASTEROID_HULLS", - "GRO_TERRAFORM", - "GRO_GENETIC_MED", - "SHP_BIOADAPTIVE_SPEC", - "SHP_INTSTEL_LOG", - "SHP_CONT_BIOADAPT", - "SHP_SENT_HULL", - "DEF_SYST_DEF_MINE_2", - "GRO_CYBORG", - "PRO_INDUSTRY_CENTER_III", - "SHP_WEAPON_15", - "DEF_GARRISON_4", - "SPY_STEALTH_1", - "DEF_DEFENSE_NET_REGEN_2", - "SHP_ENRG_BOUND_MAN", - "GRO_GAIA_TRANS", - "GRO_ENERGY_META", - "CON_ART_PLANET", - "LRN_DISTRIB_THOUGHT", - "GRO_ENERGY_META", - "DEF_SYST_DEF_MINE_3", - "DEF_PLAN_BARRIER_SHLD_4", - "DEF_PLAN_BARRIER_SHLD_5", - "SHP_SOLAR_CONT", - "SPY_DETECT_5", - "SHP_WEAPON_16", - "SHP_WEAPON_17", - //"CON_FRC_ENRG_STRC", - //"CON_NDIM_STRC", - //"CON_FRC_ENRG_CAMO", - }; - std::vector<std::string> techVec(techs,techs+numTechs); - if (techVec[numTechs-4] != "GRO_ENERGY_META") - Logger().errorStream() << "Error: LoadMyTechs seems to have an incorrect length for my Techs array..."; - TechManager& manager = GetTechManager(); - int empireID = HumanClientApp::GetApp()->EmpireID(); - for (std::vector<std::string>::iterator techIt = techVec.begin(); techIt != techVec.end(); ++techIt) { - std::vector<std::string> tech_vec = manager.RecursivePrereqs(*techIt, empireID); - tech_vec.push_back(*techIt); - AddTechsToQueueSignal(tech_vec, -1); - }; -} |
From: <geo...@us...> - 2013-06-16 03:12:17
|
Revision: 6157 http://sourceforge.net/p/freeorion/code/6157 Author: geoffthemedio Date: 2013-06-16 03:12:14 +0000 (Sun, 16 Jun 2013) Log Message: ----------- -Fixed tech ETA text misplacement. -Made tech panels render a bit wider to avoid text overflowing their borders. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-15 00:52:51 UTC (rev 6156) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2013-06-16 03:12:14 UTC (rev 6157) @@ -528,11 +528,11 @@ // black out dependency lines under panel glColor(GG::CLR_BLACK); - PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); + PartlyRoundedRect(ul, lr + GG::Pt(GG::X(4), GG::Y0), PAD, true, true, true, true, true); // background of panel glColor(m_colour); - PartlyRoundedRect(ul, lr, PAD, true, true, true, true, true); + PartlyRoundedRect(ul, lr + GG::Pt(GG::X(4), GG::Y0), PAD, true, true, true, true, true); // tech name int font_pts = static_cast<int>(FontSize() * m_layout_panel->Scale() + 0.5); @@ -569,12 +569,12 @@ if (m_browse_highlight) { border_colour = GG::CLR_WHITE; glColor(border_colour); - PartlyRoundedRect(ul, lr, PAD, true, true, true, true, false); + PartlyRoundedRect(ul, lr + GG::Pt(GG::X(4), GG::Y0), PAD, true, true, true, true, false); } else if (m_status == TS_COMPLETE || m_status == TS_RESEARCHABLE) { border_colour = m_colour; border_colour.a = 255; glColor(border_colour); - PartlyRoundedRect(ul, lr, PAD, true, true, true, true, false); + PartlyRoundedRect(ul, lr + GG::Pt(GG::X(4), GG::Y0), PAD, true, true, true, true, false); } else { border_colour = m_colour; border_colour.a = 127; @@ -602,10 +602,9 @@ glEnable(GL_TEXTURE_2D); std::vector<GG::Font::LineData> line_data; - GG::Flags<GG::TextFormat> line_format = GG::FORMAT_VCENTER | GG::FORMAT_VCENTER; + GG::Flags<GG::TextFormat> line_format = GG::FORMAT_VCENTER | GG::FORMAT_CENTER; font->DetermineLines(m_eta_text, line_format, eta_lr.x - eta_ul.x, line_data); - line_format = GG::FORMAT_WORDBREAK | GG::FORMAT_VCENTER | GG::FORMAT_LEFT; // render background offset from actual text location glColor(GG::CLR_BLACK); font->RenderText(eta_ul - GG::Pt(GG::X1, GG::Y0), eta_lr - GG::Pt(GG::X1, GG::Y0), m_eta_text, |