Author: mordante
Date: Sat Apr 25 20:57:24 2009
New Revision: 35209
URL: http://svn.gna.org/viewcvs/wesnoth?rev=35209&view=rev
Log:
Add a new scrollbar mode.
This way the user can select whether or not to show the scrollbar if the
contents fit at the first run. The code will only be used for the new
layout algorithm and does nothing at the moment.
Modified:
trunk/src/gui/widgets/canvas.cpp
trunk/src/gui/widgets/scrollbar_container.cpp
trunk/src/gui/widgets/scrollbar_container.hpp
trunk/src/gui/widgets/widget.hpp
trunk/src/gui/widgets/window.cpp
trunk/src/gui/widgets/window_builder.cpp
Modified: trunk/src/gui/widgets/canvas.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/canvas.cpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/canvas.cpp (original)
+++ trunk/src/gui/widgets/canvas.cpp Sat Apr 25 20:57:24 2009
@@ -251,15 +251,26 @@
*
* scrollbar_mode How to show the scrollbar of a widget.
* Possible values:
- * @* always The scrollbar is always shown,
- * regardless whether it's required or not.
- * @* never The scrollbar is never shown,
- * even not when needed. (Note when setting
- * this mode dialogs might not properly fit
- * anymore).
- * @* auto Shows the scrollbar when
+ * @* always The scrollbar is always
+ * shown, regardless whether it's required
+ * or not.
+ * @* never The scrollbar is never
+ * shown, even not when needed. (Note when
+ * setting this mode dialogs might
+ * not properly fit anymore).
+ * @* auto Shows the scrollbar when
* needed. The widget will reserve space
for
* the scrollbar, but only show when
needed.
+ * @* initial_auto Like auto, but when the
+ * scrollbar is not needed the space is not
+ * reserved.
+ * @-Use auto when the list can be changed
+ * dynamically eg the game list in the
+ * lobby. For optimization you can also
+ * use auto when you really expect a
+ * scrollbar, but don't want it to be shown
+ * when not needed eg the language list
+ * will need a scrollbar on most screens.
* @end_table
*
* == Section types ==
Modified: trunk/src/gui/widgets/scrollbar_container.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/scrollbar_container.cpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/scrollbar_container.cpp (original)
+++ trunk/src/gui/widgets/scrollbar_container.cpp Sat Apr 25 20:57:24 2009
@@ -84,10 +84,10 @@
tscrollbar_container::tscrollbar_container(const unsigned canvas_count)
: tcontainer_(canvas_count)
, state_(ENABLED)
- , vertical_scrollbar_mode_(SHOW_WHEN_NEEDED)
- , horizontal_scrollbar_mode_(SHOW_WHEN_NEEDED)
- , initial_vertical_scrollbar_mode_(SHOW_WHEN_NEEDED)
- , initial_horizontal_scrollbar_mode_(SHOW_WHEN_NEEDED)
+ , vertical_scrollbar_mode_(auto_visible)
+ , horizontal_scrollbar_mode_(auto_visible)
+ , initial_vertical_scrollbar_mode_(auto_visible)
+ , initial_horizontal_scrollbar_mode_(auto_visible)
, vertical_scrollbar_grid_(NULL)
, horizontal_scrollbar_grid_(NULL)
, vertical_scrollbar_(NULL)
@@ -123,15 +123,15 @@
* When the scrollbars should be shown when needed, assume
they're not
* needed and unhide them when needed.
*/
- if(initial_vertical_scrollbar_mode_ == SHOW_WHEN_NEEDED) {
- vertical_scrollbar_mode_ = HIDE;
+ if(initial_vertical_scrollbar_mode_ == auto_visible) {
+ vertical_scrollbar_mode_ = always_invisible;
} else {
vertical_scrollbar_mode_ =
initial_vertical_scrollbar_mode_;
}
show_vertical_scrollbar();
- if(initial_vertical_scrollbar_mode_ == SHOW_WHEN_NEEDED) {
- horizontal_scrollbar_mode_ = HIDE;
+ if(initial_vertical_scrollbar_mode_ == auto_visible) {
+ horizontal_scrollbar_mode_ = always_invisible;
} else {
horizontal_scrollbar_mode_ =
initial_horizontal_scrollbar_mode_;
}
@@ -150,17 +150,21 @@
if(full_initialization) {
- if(initial_vertical_scrollbar_mode_ == HIDE) {
- vertical_scrollbar_mode_ = HIDE;
+
+ if(initial_vertical_scrollbar_mode_ == always_visible
+ || initial_vertical_scrollbar_mode_ ==
auto_visible) {
+
+ vertical_scrollbar_mode_ = always_visible;
} else {
- vertical_scrollbar_mode_ = SHOW;
+ vertical_scrollbar_mode_ = always_invisible;
}
show_vertical_scrollbar();
- if(initial_vertical_scrollbar_mode_ == HIDE) {
- horizontal_scrollbar_mode_ = HIDE;
+ if(initial_vertical_scrollbar_mode_ == always_visible
+ || initial_vertical_scrollbar_mode_ ==
auto_visible) {
+ horizontal_scrollbar_mode_ = always_visible;
} else {
- horizontal_scrollbar_mode_ = SHOW;
+ horizontal_scrollbar_mode_ = always_invisible;
}
show_horizontal_scrollbar();
}
@@ -172,7 +176,7 @@
void tscrollbar_container::NEW_request_reduce_height(
const unsigned maximum_height)
{
- if(initial_horizontal_scrollbar_mode_ == HIDE) {
+ if(initial_horizontal_scrollbar_mode_ == always_invisible) {
return;
}
@@ -181,6 +185,15 @@
tpoint size = get_best_size();
if(static_cast<unsigned>(size.y) < maximum_height) {
return;
+ }
+
+ const bool unhide =
+ initial_horizontal_scrollbar_mode_ == auto_visible_first_run
+ && vertical_scrollbar_mode_ == always_invisible;
+
+ if(unhide) {
+ horizontal_scrollbar_mode_ = always_visible;
+ show_horizontal_scrollbar();
}
const tpoint scrollbar_size = vertical_scrollbar_grid_->get_best_size();
@@ -193,6 +206,10 @@
// FIXME adjust for the step size of the scrollbar
set_layout_size(size);
+
+ if(unhide) {
+ /** @todo Throw a width change exception. */
+ }
}
void tscrollbar_container::layout_wrap(const unsigned maximum_width)
@@ -201,7 +218,7 @@
twidget::layout_wrap(maximum_width);
assert(content_grid_ && vertical_scrollbar_grid_);
- const unsigned offset = vertical_scrollbar_mode_ == HIDE
+ const unsigned offset = vertical_scrollbar_mode_ == always_invisible
? 0
: vertical_scrollbar_grid_->get_best_size().x;
@@ -214,12 +231,12 @@
* @todo look at cleaning the has_X_scrollbar and can_wrap to do the
* visibility test in a more generic way, preferably in the grid.
*/
- return is_visible() && vertical_scrollbar_mode_ != HIDE;
+ return is_visible() && vertical_scrollbar_mode_ != always_invisible;
}
bool tscrollbar_container::has_horizontal_scrollbar() const
{
- return is_visible() && horizontal_scrollbar_mode_ != HIDE;
+ return is_visible() && horizontal_scrollbar_mode_ != always_invisible;
}
void tscrollbar_container::
@@ -313,13 +330,13 @@
/***** get vertical scrollbar size *****/
const tpoint vertical_scrollbar =
- vertical_scrollbar_mode_ == HIDE
+ vertical_scrollbar_mode_ == always_invisible
? tpoint(0, 0)
: vertical_scrollbar_grid_->get_best_size();
/***** get horizontal scrollbar size *****/
const tpoint horizontal_scrollbar =
- horizontal_scrollbar_mode_ == HIDE
+ horizontal_scrollbar_mode_ == always_invisible
? tpoint(0, 0)
: horizontal_scrollbar_grid_->get_best_size();
@@ -349,7 +366,7 @@
{
assert(scrollbar_grid && scrollbar);
- if(scrollbar_mode != tscrollbar_container::HIDE) {
+ if(scrollbar_mode != tscrollbar_container::always_invisible) {
scrollbar->set_item_count(items);
scrollbar->set_visible_items(visible_items);
@@ -360,9 +377,9 @@
if(!scrollbar_needed) {
// Hide the scrollbar
- if(scrollbar_mode ==
tscrollbar_container::SHOW_WHEN_NEEDED) {
+ if(scrollbar_mode ==
tscrollbar_container::auto_visible) {
if(true) { // extra setting
- scrollbar_mode =
tscrollbar_container::HIDE;
+ scrollbar_mode =
tscrollbar_container::always_invisible;
} else {
scrollbar_grid->set_visible(twidget::HIDDEN);
}
@@ -370,7 +387,7 @@
}
}
- if(scrollbar_mode == tscrollbar_container::HIDE) {
+ if(scrollbar_mode == tscrollbar_container::always_invisible) {
scrollbar_grid->set_visible(twidget::INVISIBLE);
}
}
@@ -683,7 +700,7 @@
return;
}
- if(vertical_scrollbar_mode_ == HIDE) {
+ if(vertical_scrollbar_mode_ == always_invisible) {
vertical_scrollbar_grid_->set_visible(twidget::INVISIBLE);
} else {
vertical_scrollbar_grid_->set_visible(twidget::VISIBLE);
@@ -696,7 +713,7 @@
return;
}
- if(horizontal_scrollbar_mode_ == HIDE) {
+ if(horizontal_scrollbar_mode_ == always_invisible) {
horizontal_scrollbar_grid_->set_visible(twidget::INVISIBLE);
} else {
horizontal_scrollbar_grid_->set_visible(twidget::VISIBLE);
@@ -951,12 +968,12 @@
assert(vertical_scrollbar_ && horizontal_scrollbar_);
/*** Update the content location. ***/
- const int x_offset = horizontal_scrollbar_mode_ == HIDE
+ const int x_offset = horizontal_scrollbar_mode_ == always_invisible
? 0
: horizontal_scrollbar_->get_item_position() *
horizontal_scrollbar_->get_step_size();
- const int y_offset = vertical_scrollbar_mode_ == HIDE
+ const int y_offset = vertical_scrollbar_mode_ == always_invisible
? 0
: vertical_scrollbar_->get_item_position() *
vertical_scrollbar_->get_step_size();
Modified: trunk/src/gui/widgets/scrollbar_container.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/scrollbar_container.hpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/scrollbar_container.hpp (original)
+++ trunk/src/gui/widgets/scrollbar_container.hpp Sat Apr 25 20:57:24 2009
@@ -46,22 +46,29 @@
/** The way to handle the showing or hiding of the scrollbar. */
enum tscrollbar_mode {
- SHOW, /**<
- * The
scrollbar is always shown, whether
- * needed or
not.
- */
- HIDE, /**<
- * The
scrollbar is never shown even not when
- * needed.
There's also no space reserved for
- * the
scrollbar.
- */
- SHOW_WHEN_NEEDED /**<
- * The
scrollbar is shown when the number of
- * items is
larger as the visible items. The
- * space for
the scrollbar is always
- * reserved,
just in case it's needed after
- * the
initial sizing (due to adding items).
- */
+ always_visible, /**<
+ * The scrollbar is always shown,
whether
+ * needed or not.
+ */
+ always_invisible, /**<
+ * The scrollbar is never shown even
not
+ * when needed. There's also no space
+ * reserved for the scrollbar.
+ */
+ auto_visible, /**<
+ * The scrollbar is shown when the
number of
+ * items is larger as the visible
items. The
+ * space for the scrollbar is always
+ * reserved, just in case it's needed
after
+ * the initial sizing (due to adding
items).
+ */
+ auto_visible_first_run /**<
+ * Like auto_visible, but when not
needed
+ * upon the initial layout phase, the
bars
+ * are not shown and no space is
reserved
+ * for them. (The algorithm hides
them by
+ * default.
+ */
};
/***** ***** ***** ***** layout functions ***** ***** ***** *****/
Modified: trunk/src/gui/widgets/widget.hpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/widget.hpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/widget.hpp (original)
+++ trunk/src/gui/widgets/widget.hpp Sat Apr 25 20:57:24 2009
@@ -173,8 +173,9 @@
* @see @ref layout_algorihm for more information.
*
* @param full_initialization For widgets with scrollbars it hides them
- * unless the mode is tscrollbar_mode::SHOW.
- * For other widgets this flag is a NOP.
+ * unless the mode is
+ * tscrollbar_mode::always_visible. For other
+ * widgets this flag is a NOP.
*/
virtual void NEW_layout_init(const bool full_initialization);
Modified: trunk/src/gui/widgets/window.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/window.cpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/window.cpp (original)
+++ trunk/src/gui/widgets/window.cpp Sat Apr 25 20:57:24 2009
@@ -1060,7 +1060,7 @@
* - Clear the internal best size cache for all widgets.
* - For widgets with scrollbars hide them unless the
* @ref gui2::tscrollbar_container::tscrollbar_mode "scrollbar_mode" is
- * SHOW.
+ * always_visible or auto_visible.
* - Handle shared sizes:
* - Height and width:
* - Get the best size for all widgets that share height and width.
Modified: trunk/src/gui/widgets/window_builder.cpp
URL:
http://svn.gna.org/viewcvs/wesnoth/trunk/src/gui/widgets/window_builder.cpp?rev=35209&r1=35208&r2=35209&view=diff
==============================================================================
--- trunk/src/gui/widgets/window_builder.cpp (original)
+++ trunk/src/gui/widgets/window_builder.cpp Sat Apr 25 20:57:24 2009
@@ -144,15 +144,17 @@
get_scrollbar_mode(const std::string& scrollbar_mode)
{
if(scrollbar_mode == "always") {
- return tscrollbar_container::SHOW;
+ return tscrollbar_container::always_visible;
} else if(scrollbar_mode == "never") {
- return tscrollbar_container::HIDE;
+ return tscrollbar_container::always_invisible;
+ } else if(scrollbar_mode == "initial_auto") {
+ return tscrollbar_container::auto_visible_first_run;
} else {
if(!scrollbar_mode.empty() && scrollbar_mode != "auto") {
ERR_GUI_E << "Invalid scrollbar mode '"
<< scrollbar_mode << "' falling back to
'auto'.\n";
}
- return tscrollbar_container::SHOW_WHEN_NEEDED;
+ return tscrollbar_container::auto_visible;
}
}
_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits