From fc4809e41bc5694231046eb2fd4c324c4daba13f Mon Sep 17 00:00:00 2001 From: Stijn Buys Date: Sat, 18 Sep 2010 13:25:37 +0000 Subject: cosmetic updates in engine list functions, trade menu updates --- src/client/inventorylistview.cc | 6 +++ src/client/playerview.cc | 22 +++++--- src/client/trademenu.cc | 113 +++++++++++++++++++++++----------------- src/client/trademenu.h | 22 +++++--- src/core/cvar.cc | 5 +- src/core/entity.cc | 46 ++++++++-------- src/core/func.cc | 7 ++- src/core/info.cc | 8 +-- src/core/zone.cc | 16 ++++-- src/game/base/shipmodel.cc | 8 +-- src/model/model.cc | 5 +- src/model/vertexarray.cc | 3 +- src/ui/console.cc | 1 + src/ui/label.cc | 5 ++ src/ui/label.h | 3 ++ src/ui/scrollpane.cc | 62 ++++++++++++++++------ src/ui/scrollpane.h | 24 ++++++--- 17 files changed, 228 insertions(+), 128 deletions(-) diff --git a/src/client/inventorylistview.cc b/src/client/inventorylistview.cc index 656adfb..1b46fd0 100644 --- a/src/client/inventorylistview.cc +++ b/src/client/inventorylistview.cc @@ -14,6 +14,9 @@ InventoryListView::InventoryListView(ui::Widget *parent) : ui::ListView (parent) set_inventory(0, 0); } +InventoryListView::~InventoryListView() { +} + void InventoryListView::set_inventory(core::Inventory *inventory, core::InfoType *info_type) { remove_children(); @@ -22,6 +25,9 @@ void InventoryListView::set_inventory(core::Inventory *inventory, core::InfoType return; } + // TODO scan the inventories and request updated infos + // update when necessary + for (core::Inventory::Items::const_iterator it = inventory->items().begin(); it != inventory->items().end(); it++) { core::Item *item = (*it); diff --git a/src/client/playerview.cc b/src/client/playerview.cc index 4be64d2..2c2ecaa 100644 --- a/src/client/playerview.cc +++ b/src/client/playerview.cc @@ -133,15 +133,25 @@ void PlayerView::show_menu(const std::string & args) // show buy menu view_buymenu->show(); } else { - con_print << "usage: view buy [infoid] show the buy menu for this kind of item" << std::endl; + con_print << "usage: view buy [info id] show the buy menu for this kind of item" << std::endl; } } else if (label.compare("trade") == 0) { - // hide other menus - view_buymenu->hide(); - view_entitymenu->hide(); - // show trade menu - view_trademenu->show(); + // invetory based trade + std::string typestr; + + if(argstr >> typestr) { + aux::to_label(typestr); + + // hide other menus + view_buymenu->hide(); + view_entitymenu->hide(); + // show trade menu + view_trademenu->show(); + view_trademenu->set_item_type(core::InfoType::find(typestr)); + } else { + con_print << "usage: view trade [string] show the trade menu for this type of items" << std::endl; + } } else if (label.compare("hide") == 0) { // hide all menus diff --git a/src/client/trademenu.cc b/src/client/trademenu.cc index 7e9be4f..e96f1a6 100644 --- a/src/client/trademenu.cc +++ b/src/client/trademenu.cc @@ -4,6 +4,9 @@ the terms of the GNU General Public License version 2 */ +#include "core/application.h" +#include "core/info.h" +#include "core/inventory.h" #include "ui/button.h" #include "ui/paint.h" #include "ui/ui.h" @@ -34,13 +37,22 @@ TradeMenu::TradeMenu(ui::Widget *parent, const char * label) : ui::Window(parent menu_namelabel->set_alignment(ui::AlignCenter); menu_namelabel->show(); - menu_inventorylistview = new ui::ListView(menu_tradewindow); + menu_inventorylistview = new InventoryListView(menu_tradewindow); menu_inventorylistview->set_label("inventorylistview"); menu_inventorylistview->set_background(false); menu_inventorylistview->set_border(true); + menu_modelview = new ui::ModelView(menu_tradewindow); + menu_modelview->set_label("modelview"); + menu_modelview->set_background(false); + menu_modelview->set_border(false); + + menu_scrollpane = new ui::ScrollPane(menu_tradewindow, menu_infotext); + menu_scrollpane->set_background(false); + menu_scrollpane->set_border(false); + menu_scrollpane->set_alignment(ui::AlignTop); - menu_traderlistview = new ui::ListView(menu_tradewindow); + menu_traderlistview = new InventoryListView(menu_tradewindow); menu_traderlistview->set_label("traderlistview"); menu_traderlistview->set_background(false); menu_traderlistview->set_border(true); @@ -48,7 +60,7 @@ TradeMenu::TradeMenu(ui::Widget *parent, const char * label) : ui::Window(parent menu_closebutton = new ui::Button(menu_tradewindow, "Return", "view hide"); std::string test("test"); - set_item_type(test); + set_item_type(0); hide(); } @@ -58,54 +70,55 @@ TradeMenu::~TradeMenu() } -void TradeMenu::set_item_type(std::string const & itemtype) +void TradeMenu::set_item_type(core::InfoType *item_type) { - ui::ListItem *item_label = 0; - + // reset menu_namelabel->set_text(0); + menu_infotext.clear(); - // update inventorylistview - menu_inventorylistview->remove_children(); - - //core::Inventory *inventory = 0; - - - item_label = new ui::ListItem(menu_inventorylistview, "Inventory item 1"); - item_label->set_height(item_label->font()->height() * 2.0f); - - item_label = new ui::ListItem(menu_inventorylistview, "Inventory item 2"); - item_label->set_height(item_label->font()->height() * 2.0f); + core::Inventory *inventory_player = 0; + core::Inventory *inventory_view = 0; - item_label = new ui::ListItem(menu_inventorylistview, "Inventory item 3"); - item_label->set_height(item_label->font()->height() * 2.0f); + if (core::localcontrol()) + inventory_player = core::localcontrol()->inventory(); - item_label = new ui::ListItem(menu_inventorylistview, "Inventory item 4"); - item_label->set_height(item_label->font()->height() * 2.0f); + if(core::localplayer()->view()) + inventory_view = core::localplayer()->view()->inventory(); - item_label = new ui::ListItem(menu_inventorylistview, "Inventory item 5"); - item_label->set_height(item_label->font()->height() * 2.0f); + menu_inventorylistview->set_inventory(inventory_player, item_type); + menu_traderlistview->set_inventory(inventory_view, item_type); - menu_inventorylistview->event_resize(); - - // update traderlistview - menu_traderlistview->remove_children(); - - item_label = new ui::ListItem(menu_traderlistview, "Shop item 1"); - item_label->set_height(item_label->font()->height() * 2.0f); - - item_label = new ui::ListItem(menu_traderlistview, "Shop item 2"); - item_label->set_height(item_label->font()->height() * 2.0f); - - item_label = new ui::ListItem(menu_traderlistview, "Shop item 3"); - item_label->set_height(item_label->font()->height() * 2.0f); - - item_label = new ui::ListItem(menu_traderlistview, "Shop item 4"); - item_label->set_height(item_label->font()->height() * 2.0f); + set_item(0); +} + +void TradeMenu::set_item(ui::ListItem *item) +{ + menu_namelabel->clear(); - item_label = new ui::ListItem(menu_traderlistview, "Shop item 5"); - item_label->set_height(item_label->font()->height() * 2.0f); + if (!item || !item->info()) { + menu_scrollpane->hide(); + menu_modelview->hide(); + return; + } - menu_traderlistview->event_resize(); + if (item->parent() == menu_inventorylistview) { + // item in ship inventory selected (SELL) + menu_namelabel->set_text("Sell " + item->text()); + + } else if (item->parent() == menu_traderlistview) { + // item in trader inventory selected (BUY) + menu_namelabel->set_text("Buy " + item->text()); + } + + if (item->info()) { + for (core::Info::Text::const_iterator it = item->info()->text().begin(); it != item->info()->text().end(); it++) { + menu_infotext.push_back((*it)); + } + menu_scrollpane->show(); + + menu_modelview->set_modelname(item->info()->modelname()); + menu_modelview->show(); + } } void TradeMenu::resize() @@ -128,6 +141,14 @@ void TradeMenu::resize() menu_inventorylistview->set_size(ui::UI::elementsize.width(), menu_tradewindow->height() - smallmargin * 2.0f - fontmargin * 3.0f); menu_inventorylistview->set_location(fontmargin, fontmargin * 3.0f); + // resize modelview + menu_modelview->set_size(menu_tradewindow->width() - 2.0f * ui::UI::elementsize.width() - fontmargin * 4.0f, ui::UI::elementsize.width()); + menu_modelview->set_location(fontmargin * 2.0f + ui::UI::elementsize.width(), fontmargin * 3.0f); + + // resize scrollpane + menu_scrollpane->set_size(menu_tradewindow->width() - 2.0f * ui::UI::elementsize.width() - fontmargin * 4.0f, menu_inventorylistview->height() - fontmargin - ui::UI::elementsize.width()); + menu_scrollpane->set_location(fontmargin * 2.0f + ui::UI::elementsize.width(), fontmargin * 4.0f + ui::UI::elementsize.width()); + // resize trader listview menu_traderlistview->set_size(ui::UI::elementsize.width(), menu_tradewindow->height() - smallmargin * 2.0f - fontmargin * 3.0f); menu_traderlistview->set_location(menu_tradewindow->width() - menu_traderlistview->width() - fontmargin, fontmargin * 3.0f); @@ -140,13 +161,7 @@ void TradeMenu::resize() bool TradeMenu::on_emit(Widget *sender, const Event event, void *data) { if (event == ui::Widget::EventListItemClicked) { - if (sender->parent() == menu_inventorylistview) { - // item from inventory selected - menu_namelabel->set_text("SELL " + static_cast(sender)->text()); - } else if (sender->parent() == menu_traderlistview) { - // item from trader selected - menu_namelabel->set_text("BUY " + static_cast(sender)->text()); - } + set_item(static_cast(sender)); return true; } diff --git a/src/client/trademenu.h b/src/client/trademenu.h index 37823b1..b95ee57 100644 --- a/src/client/trademenu.h +++ b/src/client/trademenu.h @@ -10,8 +10,11 @@ #include "core/info.h" #include "ui/container.h" #include "ui/label.h" -#include "ui/listview.h" +#include "ui/listitem.h" +#include "ui/scrollpane.h" +#include "ui/modelview.h" #include "ui/widget.h" +#include "client/inventorylistview.h" namespace client { @@ -25,7 +28,7 @@ public: ~TradeMenu(); /// set the item type to trade - void set_item_type(std::string const & itemtype); + void set_item_type(core::InfoType *item_type); protected: /// resize event handler @@ -33,15 +36,20 @@ protected: /// emit event handler virtual bool on_emit(Widget *sender, const Event event, void *data); - + private: + void set_item(ui::ListItem *item); + ui::Window *menu_tradewindow; - ui::ListView *menu_inventorylistview; - ui::ListView *menu_traderlistview; ui::Button *menu_closebutton; - ui::Label *menu_namelabel; - + ui::ModelView *menu_modelview; + ui::ScrollPane *menu_scrollpane; + + InventoryListView *menu_inventorylistview; + InventoryListView *menu_traderlistview; + + ui::Text menu_infotext; }; } diff --git a/src/core/cvar.cc b/src/core/cvar.cc index f043028..a47b72e 100644 --- a/src/core/cvar.cc +++ b/src/core/cvar.cc @@ -167,8 +167,6 @@ Cvar *Cvar::find(const char* name) void Cvar::list() { - con_print << "Flags: A=Archive G=Game R=ReadOnly" << std::endl; - Registry::iterator it; for (it = cvar_registry.begin(); it != cvar_registry.end(); it++) { std::string typeindicator; @@ -190,7 +188,8 @@ void Cvar::list() con_print << " " << typeindicator << " " << (*it).first << " " << (*it).second->str() << " ^N" << (*it).second->info() << std::endl; } - con_print << cvar_registry.size() << " registered variables" << std::endl; + con_print << " Flags: A=Archive G=Game R=ReadOnly" << std::endl; + con_print << "^B " << cvar_registry.size() << " registered variables" << std::endl; } } diff --git a/src/core/entity.cc b/src/core/entity.cc index 538aecb..0b3a402 100644 --- a/src/core/entity.cc +++ b/src/core/entity.cc @@ -81,6 +81,26 @@ void Entity::clear() entity_nextid = 0; } +void Entity::list_inventory() const +{ + con_print << " entity id ^B" << id() << " ^Nlabel ^B" << label() << " ^Nname ^B" << name() << std::endl; + if (!entity_inventory) { + con_print << "no inventory availble" << std::endl; + return; + } + + con_print << " ^Nid type label amount" << std::endl; + for (Inventory::Items::const_iterator it = entity_inventory->items().begin(); it != entity_inventory->items().end(); it++) { + Item *item = (*it); + con_print << " " + << " ^B" << std::setw(4) << item->info()->id() + << " ^N" << aux::pad_right((item->info()->type() ? item->info()->type()->label() : "NULL"), 8) + << " ^N" << aux::pad_right(item->info()->label(), 24) + << std::setw(5) << item->amount() << std::endl; + } + con_print << "^B " << entity_inventory->items().size() << " inventory items" << std::endl; +} + void Entity::list_header() { con_print << " " @@ -94,8 +114,8 @@ void Entity::list(const Entity *entity) { con_print << " " << "^B" << std::setw(4) << entity->id() << " " - << "^B" << std::setfill('0') << std::setw(4) << entity->type() << ":" << std::setw(4) << entity->moduletype() << std::setfill(' ') << " " - << "^B" << aux::pad_right(entity->label(), 24) << " " + << "^N" << std::setfill('0') << std::setw(4) << entity->type() << ":" << std::setw(4) << entity->moduletype() << std::setfill(' ') << " " + << "^N" << aux::pad_right(entity->label(), 24) << " " << "^N" << entity->name() << std::endl; } @@ -107,7 +127,7 @@ void Entity::list() Entity *entity = (*it).second; list(entity); } - con_print << entity_registry.size() << " entities" << std::endl; + con_print << "^B " << entity_registry.size() << " entities" << std::endl; } /* ---- class Entity ----------------------------------------------- */ @@ -401,26 +421,6 @@ void Entity::remove_menu(std::string const &label) } } -void Entity::list_inventory() const -{ - con_print << " ^B" << name() << "^N "; - if (!entity_inventory) { - con_print << "no inventory availble" << std::endl; - return; - } - con_print << "inventory" << std::endl; - - for (Inventory::Items::const_iterator it = entity_inventory->items().begin(); it != entity_inventory->items().end(); it++) { - Item *item = (*it); - con_print << " " - << " ^B" << std::setw(4) << item->info()->id() - << " ^N" << (item->info()->type() ? item->info()->type()->label() : "NULL") - << " ^N" << item->info()->label() - << " amount " << item->amount() << std::endl; - } - -} - /* ---- class EntityDynamic ---------------------------------------- */ EntityDynamic::EntityDynamic() : Entity() diff --git a/src/core/func.cc b/src/core/func.cc index 4072f39..aa49f17 100644 --- a/src/core/func.cc +++ b/src/core/func.cc @@ -108,8 +108,7 @@ Func *Func::find(const std::string &name) void Func::list() { Registry::iterator it; - con_print << "Flags: G=Game S=Shared" << std::endl; - + for (it = func_registry.begin(); it != func_registry.end(); it++) { std::string typeindicator; if (((*it).second->flags() & Game) == Game) @@ -122,8 +121,8 @@ void Func::list() typeindicator += ' '; con_print << " " << typeindicator << " " << (*it).second->name() << " " << (*it).second->info() << std::endl; } - - con_print << func_registry.size() << " registered functions" << std::endl; + con_print << "Flags: G=Game S=Shared" << std::endl; + con_print << "^B " << func_registry.size() << " registered functions" << std::endl; } /* ---- Func ------------------------------------------------------ */ diff --git a/src/core/info.cc b/src/core/info.cc index 1a4f68f..c331d91 100644 --- a/src/core/info.cc +++ b/src/core/info.cc @@ -365,8 +365,8 @@ void Info::list(const Info *info) { con_print << " " << "^B" << std::setw(4) << info->id() << " " - << "^B" << (info->type() ? aux::pad_right(info->type()->label(), 8) : "NULL ") << " " - << "^B" << aux::pad_right(info->label(), 12) << " " + << "^N" << (info->type() ? aux::pad_right(info->type()->label(), 8) : "NULL ") << " " + << "^N" << aux::pad_right(info->label(), 12) << " " << "^N" << info->name() << std::endl; } @@ -377,7 +377,7 @@ void Info::list() Info *info = (*it); list(info); } - con_print << info_registry.size() << " info " << aux::plural("record", info_registry.size()) << std::endl; + con_print << "^B " << info_registry.size() << " info " << aux::plural("record", info_registry.size()) << std::endl; } void Info::list(const InfoType *type) @@ -391,7 +391,7 @@ void Info::list(const InfoType *type) list(info); } } - con_print << count << " " << type->label() << " info " << aux::plural("record", count) << std::endl; + con_print << "^B " << count << " " << type->label() << " info " << aux::plural("record", count) << std::endl; } } diff --git a/src/core/zone.cc b/src/core/zone.cc index ab38b1b..7fc3f4d 100644 --- a/src/core/zone.cc +++ b/src/core/zone.cc @@ -91,11 +91,19 @@ Zone *Zone::search(std::string const & searchname) void Zone::list() { + con_print << " " + << " id " + << "label " + << "name" << std::endl; + for (Registry::iterator it = zone_registry.begin(); it != zone_registry.end(); it++) { Zone *zone = (*it).second; - con_print << " id " << std::setw(4) << zone->id() << " " << zone->label() << std::endl; + con_print << " " + << "^B" << std::setw(4) << zone->id() << " " + << "^N" << aux::pad_right(zone->label(), 24) << " " + << "^N" << zone->name() << std::endl; } - con_print << zone_registry.size() << " registered zones" << std::endl; + con_print << "^B " << zone_registry.size() << " zones" << std::endl; } void Zone ::clear() @@ -135,13 +143,13 @@ Zone::~Zone() void Zone::print() { - con_print << "id ^B" << id() << " ^Nlabel ^B" << label() << " ^Nname ^B" << name() << std::endl; + con_print << " zone id ^B" << id() << " ^Nlabel ^B" << label() << " ^Nname ^B" << name() << std::endl; Entity::list_header(); for (Content::iterator it = zone_content.begin(); it != zone_content.end(); it++) { Entity *entity = (*it); Entity::list(entity); } - con_print << zone_content.size() << " registered zone entities" << std::endl; + con_print << " ^B" << zone_content.size() << " zone entities" << std::endl; } void Zone::add(Entity *entity) diff --git a/src/game/base/shipmodel.cc b/src/game/base/shipmodel.cc index ee2e647..1dc8ba1 100644 --- a/src/game/base/shipmodel.cc +++ b/src/game/base/shipmodel.cc @@ -36,7 +36,9 @@ void ShipModel::generate_info() { //clear_text(); - add_text(""); + if (text().size()) + add_text(""); + add_text("^BSpecifications:^N"); std::stringstream str; str << "price: ^B" << price() << " ^Ncredits"; @@ -60,11 +62,11 @@ void ShipModel::generate_info() str.str(""); if (jumpdrive()) { - add_text("hyperspace jump drive capable"); + add_text("^Bhyperspace jump drive"); } if (dock()) { - add_text("docking capable"); + add_text("^Bdockable"); } } diff --git a/src/model/model.cc b/src/model/model.cc index 5ba4deb..7552b07 100644 --- a/src/model/model.cc +++ b/src/model/model.cc @@ -172,11 +172,12 @@ void Model::list() list_model((*mit).second); } - con_print << model_registry.size() << " registered models" << std::endl; - + if (VertexArray::instance()) { VertexArray::instance()->info(); } + + con_print << "^B " << model_registry.size() << " registered models" << std::endl; } } diff --git a/src/model/vertexarray.cc b/src/model/vertexarray.cc index 861090c..67a13aa 100644 --- a/src/model/vertexarray.cc +++ b/src/model/vertexarray.cc @@ -163,8 +163,7 @@ void VertexArray::info() { con_print << " vertex array " << vertex_index / mbfl << "/" << vertex_size / mbfl << "Mib " << vertex_index / 8 << "/" << vertex_size / 8 << " verts " - << vertex_index * 100 / vertex_size << "% used" - << std::endl; + << "^B" << vertex_index * 100 / vertex_size << "%^N used" << std::endl; } } diff --git a/src/ui/console.cc b/src/ui/console.cc index c486c65..6ce3593 100644 --- a/src/ui/console.cc +++ b/src/ui/console.cc @@ -78,6 +78,7 @@ void Console::show() SDL_ShowCursor(SDL_ENABLE); console_scrollpane->set_scroll(0); + console_scrollpane->set_offset(3); history_pos = history.rbegin(); (*history_pos).clear(); diff --git a/src/ui/label.cc b/src/ui/label.cc index 3284d0e..b6f72c7 100644 --- a/src/ui/label.cc +++ b/src/ui/label.cc @@ -30,6 +30,11 @@ void Label::print(const size_t indent) const con_print << aux::pad_left(marker, indent*2) << label() << " \"" << text() << "\"" << std::endl; } +void Label::clear() +{ + label_text.clear(); +} + void Label::set_text(const char *text) { if (text) diff --git a/src/ui/label.h b/src/ui/label.h index 9188dc5..2a38273 100644 --- a/src/ui/label.h +++ b/src/ui/label.h @@ -28,6 +28,9 @@ public: /// set the text alignment void set_alignment(const unsigned int alignment); + + /// clear the label text + void clear(); /// return the text displayed by the label inline const std::string &text() const { diff --git a/src/ui/scrollpane.cc b/src/ui/scrollpane.cc index 38260e0..48391c5 100644 --- a/src/ui/scrollpane.cc +++ b/src/ui/scrollpane.cc @@ -18,6 +18,7 @@ ScrollPane::ScrollPane(Widget *parent, ui::Text &text) : Widget(parent), scrollp set_label("scrollpane"); set_alignment(AlignBottom); scrollpane_scroll = 0; + scrollpane_offset = 1; } ScrollPane::~ScrollPane() @@ -29,7 +30,7 @@ void ScrollPane::set_alignment(const unsigned int alignment) scrollpane_alignment = alignment; } -void ScrollPane::set_scroll(int scroll) +void ScrollPane::set_scroll(const int scroll) { scrollpane_scroll = scroll; @@ -39,22 +40,52 @@ void ScrollPane::set_scroll(int scroll) scrollpane_scroll = 0; } -void ScrollPane::inc_scroll(int scroll) +void ScrollPane::inc_scroll(const int scroll) { scrollpane_scroll += scroll; if (scrollpane_scroll > (int) scrollpane_text.size()) scrollpane_scroll = (int) scrollpane_text.size(); + else if (scrollpane_scroll < 0) + scrollpane_scroll = 0; } -void ScrollPane::dec_scroll(int scroll) +void ScrollPane::dec_scroll(const int scroll) { scrollpane_scroll -= scroll; - if (scrollpane_scroll < 0) + if (scrollpane_scroll > (int) scrollpane_text.size()) + scrollpane_scroll = (int) scrollpane_text.size(); + else if (scrollpane_scroll < 0) scrollpane_scroll = 0; } +void ScrollPane::set_offset(const int offset) +{ + scrollpane_offset = offset; +} + +bool ScrollPane::on_keypress(const int key, const unsigned int modifier) +{ + // number of lines to scroll + int alignmentmodifier =( (alignment() & AlignTop) == AlignTop) ? -1 : 1; + + switch (key) { + + case 512 + SDL_BUTTON_WHEELUP: + inc_scroll(alignmentmodifier * scrollpane_offset); + return true; + break; + + case 512 + SDL_BUTTON_WHEELDOWN: + dec_scroll(alignmentmodifier * scrollpane_offset); + return true; + break; + } + + return false; +} + void ScrollPane::draw() { render::Text::setfont(font()->name().c_str(), font()->width(), font()->height()); @@ -69,12 +100,17 @@ void ScrollPane::draw() scrollpane_scroll = (int) scrollpane_text.size(); else if (scrollpane_scroll < 0) scrollpane_scroll = 0; - - int bottom = (int) scrollpane_text.size() - scrollpane_scroll; + + int bottom = 0; int current_line = 0; - + + if ((alignment() & AlignTop) == AlignTop) { + bottom = text_height + (int) scrollpane_scroll; + } else { + bottom = (int) scrollpane_text.size() - scrollpane_scroll; + } + ui::Text lines; - for (ui::Text::const_iterator it = scrollpane_text.begin(); it != scrollpane_text.end() && current_line < bottom; it++) { if (current_line >= bottom - text_height) { std::string linedata(*it); @@ -169,13 +205,9 @@ void ScrollPane::draw() float y = 0; if ((alignment() & AlignTop) == AlignTop) { - int i = (int) lines.size(); - for (ui::Text::iterator it = lines.begin(); it != lines.end(); it++) { - if (i <= text_height) { - render::Text::draw(gl.x(), gl.y() + y, (*it)); - y += font()->height(); - } - i--; + for (ui::Text::iterator it = lines.begin(); (y + font()->height() < height()) && (it != lines.end()); it++) { + render::Text::draw(gl.x(), gl.y() + y, (*it)); + y += font()->height(); } } else { y = height() - font()->height(); diff --git a/src/ui/scrollpane.h b/src/ui/scrollpane.h index 82c74c9..8fe8395 100644 --- a/src/ui/scrollpane.h +++ b/src/ui/scrollpane.h @@ -26,33 +26,45 @@ public: inline int scroll() const { return scrollpane_scroll; } + + /// current scroll offset + inline int offset() const { + return scrollpane_offset; + } /// text alignment inline unsigned int alignment() const { return scrollpane_alignment; } - /// set text alignment - void set_alignment(const unsigned int alignment); - /* -- mutators --------------------------------------------- */ /// set scroll - void set_scroll(int scroll); + void set_scroll(const int scroll); + + /// set scroll offset + void set_offset(const int offset); /// increase scroll - void inc_scroll(int scroll); + void inc_scroll(const int scroll); /// decrease scroll - void dec_scroll(int scroll); + void dec_scroll(const int scroll); + + /// set text alignment + void set_alignment(const unsigned int alignment); protected: /// draw the scroll pane virtual void draw(); + + /// key event handler provides mouse scrolling + virtual bool on_keypress(const int key, const unsigned int modifier); private: ui::Text &scrollpane_text; int scrollpane_scroll; + int scrollpane_offset; unsigned int scrollpane_alignment; }; -- cgit v1.2.3