X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2FguiTable.cpp;h=e915770a412da09dec79233c745cfde581b1ad45;hb=b2160bcecdecb00bb59e6ad8ece6518255dab4ad;hp=c8930410a3b18ab74d03be2b4b87310b091db758;hpb=a578f34db551bdd3c822ec03b1e1a7d542026709;p=minetest.git diff --git a/src/guiTable.cpp b/src/guiTable.cpp index c8930410a..e915770a4 100644 --- a/src/guiTable.cpp +++ b/src/guiTable.cpp @@ -28,11 +28,14 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include "debug.h" #include "log.h" -#include "tile.h" +#include "client/tile.h" #include "gettime.h" #include "util/string.h" #include "util/numeric.h" -#include "guiFormSpecMenu.h" // for parseColor() +#include "util/string.h" // for parseColorString() +#include "settings.h" // for settings +#include "porting.h" // for dpi +#include "guiscalingfilter.h" /* GUITable @@ -89,6 +92,14 @@ GUITable::GUITable(gui::IGUIEnvironment *env, setTabStop(true); setTabOrder(-1); updateAbsolutePosition(); + + core::rect relative_rect = m_scrollbar->getRelativePosition(); + s32 width = (relative_rect.getWidth()/(2.0/3.0)) * porting::getDisplayDensity() * + g_settings->getFloat("gui_scaling"); + m_scrollbar->setRelativePosition(core::rect( + relative_rect.LowerRightCorner.X-width,relative_rect.UpperLeftCorner.Y, + relative_rect.LowerRightCorner.X,relative_rect.LowerRightCorner.Y + )); } GUITable::~GUITable() @@ -153,7 +164,7 @@ void GUITable::setTextList(const std::vector &content, cell->content_index = allocString(s.substr(2)); } else if (s[0] == '#' && s.size() >= 7 && - GUIFormSpecMenu::parseColor( + parseColorString( s.substr(0,7), cell->color, false)) { // single # for color cell->color_defined = true; @@ -183,6 +194,16 @@ void GUITable::setTable(const TableOptions &options, // j is always a column index, 0-based // k is another index, for example an option index + // Handle a stupid error case... (issue #1187) + if (columns.empty()) { + TableColumn text_column; + text_column.type = "text"; + TableColumns new_columns; + new_columns.push_back(text_column); + setTable(options, new_columns, content); + return; + } + // Handle table options video::SColor default_color(255, 255, 255, 255); s32 opendepth = 0; @@ -190,15 +211,15 @@ void GUITable::setTable(const TableOptions &options, const std::string &name = options[k].name; const std::string &value = options[k].value; if (name == "color") - GUIFormSpecMenu::parseColor(value, m_color, false); + parseColorString(value, m_color, false); else if (name == "background") - GUIFormSpecMenu::parseColor(value, m_background, false); + parseColorString(value, m_background, false); else if (name == "border") m_border = is_yes(value); else if (name == "highlight") - GUIFormSpecMenu::parseColor(value, m_highlight, false); + parseColorString(value, m_highlight, false); else if (name == "highlight_text") - GUIFormSpecMenu::parseColor(value, m_highlight_text, false); + parseColorString(value, m_highlight_text, false); else if (name == "opendepth") opendepth = stoi(value); else @@ -395,7 +416,7 @@ void GUITable::setTable(const TableOptions &options, else if (columntype == COLUMN_TYPE_COLOR) { for (s32 i = 0; i < rowcount; ++i) { video::SColor cellcolor(255, 255, 255, 255); - if (GUIFormSpecMenu::parseColor(content[i * colcount + j], cellcolor, true)) + if (parseColorString(content[i * colcount + j], cellcolor, true)) rows[i].colors.push_back(std::make_pair(cellcolor, j+span)); } } @@ -617,10 +638,11 @@ void GUITable::draw() client_clip.UpperLeftCorner.Y += 1; client_clip.UpperLeftCorner.X += 1; client_clip.LowerRightCorner.Y -= 1; - client_clip.LowerRightCorner.X -= - m_scrollbar->isVisible() ? - skin->getSize(gui::EGDS_SCROLLBAR_SIZE) : - 1; + client_clip.LowerRightCorner.X -= 1; + if (m_scrollbar->isVisible()) { + client_clip.LowerRightCorner.X = + m_scrollbar->getAbsolutePosition().UpperLeftCorner.X; + } client_clip.clipAgainst(AbsoluteClippingRect); // draw visible rows @@ -823,7 +845,7 @@ bool GUITable::OnEvent(const SEvent &event) if (event.MouseInput.Event == EMIE_MOUSE_WHEEL) { m_scrollbar->setPos(m_scrollbar->getPos() + - (event.MouseInput.Wheel < 0 ? -1 : 1) * + (event.MouseInput.Wheel < 0 ? -3 : 3) * - (s32) m_rowheight / 2); return true; } @@ -841,6 +863,14 @@ bool GUITable::OnEvent(const SEvent &event) // Update tooltip setToolTipText(cell ? m_strings[cell->tooltip_index].c_str() : L""); + // Fix for #1567/#1806: + // IGUIScrollBar passes double click events to its parent, + // which we don't want. Detect this case and discard the event + if (event.MouseInput.Event != EMIE_MOUSE_MOVED && + m_scrollbar->isVisible() && + m_scrollbar->isPointInside(p)) + return true; + if (event.MouseInput.isLeftPressed() && (isPointInside(p) || event.MouseInput.Event == EMIE_MOUSE_MOVED)) {