QVariant CollectionItem::data(int role) const { switch(role) { case Qt::DisplayRole: return name(); case NameRole: return name(); case PathRole: return path(); case HashRole: return hash(); case SizeRole: return size(); case SizeTextRole: return sizeText(); case SubdirRole: return subdir(); case SubdirTextRole: return subdirText(); default: return QStandardItem::data(role); } }
//this could probably be optimized //draws text and ensures it's never longer than xLen void Font::drawWrappedText(std::string text, const Eigen::Vector2f& offset, float xLen, unsigned int color) { float y = offset.y(); std::string line, word, temp; Eigen::Vector2f textSize; size_t space, newline; while(text.length() > 0 || !line.empty()) //while there's text or we still have text to render { space = text.find(' ', 0); if(space == std::string::npos) space = text.length() - 1; word = text.substr(0, space + 1); //check if the next word contains a newline newline = word.find('\n', 0); if(newline != std::string::npos) { word = word.substr(0, newline); text.erase(0, newline + 1); }else{ text.erase(0, space + 1); } temp = line + word; textSize = sizeText(temp); //if we're on the last word and it'll fit on the line, just add it to the line if((textSize.x() <= xLen && text.length() == 0) || newline != std::string::npos) { line = temp; word = ""; } //if the next line will be too long or we're on the last of the text, render it if(textSize.x() > xLen || text.length() == 0 || newline != std::string::npos) { //render line now if(textSize.x() > 0) //make sure it's not blank drawText(line, Eigen::Vector2f(offset.x(), y), color); //increment y by height and some extra padding for the next line y += textSize.y() + 4; //move the word we skipped to the next line line = word; }else{ //there's still space, continue building the line line = temp; } } }
void Font::drawCenteredText(std::string text, float xOffset, float y, unsigned int color) { Eigen::Vector2f pos = sizeText(text); pos[0] = (Renderer::getScreenWidth() - pos.x()); pos[0] = (pos.x() / 2) + (xOffset / 2); pos[1] = y; drawText(text, pos, color); }
bool wxTextCtrl::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator, const wxString& name) { if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT ) style |= wxBORDER_SIMPLE; SetWindowStyle(style); WXDWORD exStyle = 0; WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ; wxSize sizeText(size), sizeBtn(size); sizeBtn.x = GetBestSpinnerSize(IsVertical(style)).x / 2; if ( sizeText.x == wxDefaultCoord ) { // DEFAULT_ITEM_WIDTH is the default width for the text control sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x; } sizeText.x -= sizeBtn.x + MARGIN_BETWEEN; if ( sizeText.x <= 0 ) { wxLogDebug(_T("not enough space for wxSpinCtrl!")); } wxPoint posBtn(pos); posBtn.x += sizeText.x + MARGIN_BETWEEN; // we need to turn '\n's into "\r\n"s for the multiline controls wxString valueWin; if ( m_windowStyle & wxTE_MULTILINE ) { valueWin = wxTextFile::Translate(value, wxTextFileType_Dos); } else // single line { valueWin = value; } // we must create the list control before the spin button for the purpose // of the dialog navigation: if there is a static text just before the spin // control, activating it by Alt-letter should give focus to the text // control, not the spin and the dialog navigation code will give focus to // the next control (at Windows level), not the one after it // create the text window m_hwndBuddy = (WXHWND)::CreateWindowEx ( exStyle, // sunken border _T("EDIT"), // window class valueWin, // no window title msStyle, // style (will be shown later) pos.x, pos.y, // position 0, 0, // size (will be set later) GetHwndOf(parent), // parent (HMENU)-1, // control id wxGetInstance(), // app instance NULL // unused client data ); if ( !m_hwndBuddy ) { wxLogLastError(wxT("CreateWindow(buddy text window)")); return false; } // initialize wxControl if ( !CreateControl(parent, id, posBtn, sizeBtn, style, validator, name) ) return false; // now create the real HWND WXDWORD spiner_style = WS_VISIBLE | UDS_ALIGNRIGHT | UDS_EXPANDABLE | UDS_NOSCROLL; if ( !IsVertical(style) ) spiner_style |= UDS_HORZ; if ( style & wxSP_WRAP ) spiner_style |= UDS_WRAP; if ( !MSWCreateControl(UPDOWN_CLASS, spiner_style, posBtn, sizeBtn, _T(""), 0) ) return false; // subclass the text ctrl to be able to intercept some events wxSetWindowUserData(GetBuddyHwnd(), this); m_wndProcBuddy = (WXFARPROC)wxSetWindowProc(GetBuddyHwnd(), wxBuddyTextCtrlWndProc); // set up fonts and colours (This is nomally done in MSWCreateControl) InheritAttributes(); if (!m_hasFont) SetFont(GetDefaultAttributes().font); // set the size of the text window - can do it only now, because we // couldn't call DoGetBestSize() before as font wasn't set if ( sizeText.y <= 0 ) { int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); sizeText.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); } SetInitialSize(size); (void)::ShowWindow(GetBuddyHwnd(), SW_SHOW); // associate the list window with the spin button (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)GetBuddyHwnd(), 0); // do it after finishing with m_hwndBuddy creation to avoid generating // initial wxEVT_COMMAND_TEXT_UPDATED message ms_allTextSpins.Add(this); return true; }
void Engine::drawTextGW(const char* text, const char* font, int x, int y, float scale, oRGBA color) { // NOTE (nfries88): keeps all rendering in the game area. //x = std::min(std::max(1, x), (m_width - 176) - (int)sizeText(text, font)); //y = std::max(1, y); YATCFont *f = (YATCFont*)(glictFindFont(font)->GetFontParam()); if (f) { if (color.r == color.g && color.g == color.b && color.b == 1.) { f->resetColor(); } else { f->addColor(color.r/255, color.g/255, color.b/255); } } std::string temp_text = text; std::string new_line_text, old_line_text; new_line_text = old_line_text = temp_text; int linecount = 1; size_t iter_pos, temp_x, temp_y; // NOTE (Kilouco): Here we centralize all the message and handle positions so it will never go offscreen. while (1) { iter_pos = old_line_text.find_first_of("\n"); temp_x = x; temp_y = y; if(iter_pos == std::string::npos || iter_pos <= 0) { int text_size = sizeText(old_line_text.c_str(), font); volatile float centralizationoffset = text_size / 2; if (temp_x + centralizationoffset > (480 * scale) + 2) temp_x = (480 * scale - 2) - text_size; else if (x - centralizationoffset < 2) temp_x = 2; else temp_x -= centralizationoffset; if (temp_y < 2) temp_y = 2; glictFontRender(old_line_text.c_str(), font, temp_x, temp_y + (12 * (linecount - 1))); break; } else { new_line_text = old_line_text.substr(iter_pos+1); old_line_text.resize(iter_pos); int text_size = sizeText(old_line_text.c_str(), font); volatile float centralizationoffset = text_size / 2; if (temp_x + centralizationoffset > (480 * scale) + 2) temp_x = (480 * scale - 2) - text_size; else if (x - centralizationoffset < 2) temp_x = 2; else temp_x -= centralizationoffset; if (temp_y < 2) temp_y = 2; glictFontRender(old_line_text.c_str(), font, temp_x, temp_y + (12 * (linecount - 1))); old_line_text = new_line_text; linecount++; } } }
void Engine::drawTextGW(const char* text, const char* font, int x, int y, float scale, uint8_t color) { // NOTE (nfries88): keeps all rendering in the game area. //x = std::min(std::max(1, x), (m_width - 176) - (int)sizeText(text, font)); // NOTE (Kilouco): Doesn't works this way anymore. //y = std::max(1, y); YATCFont *f = (YATCFont*)(glictFindFont(font)->GetFontParam()); if (f) { float r = (color / 36) / 5.; float g = ((color / 6) % 6) / 5.; float b = (color % 6) / 5.; if (color == 255) // we'll just use otherwise useless 255 for drawing with 0.75, 0.75, 0.75 if needed f->addColor(0.75, 0.75, 0.75); else if (color!=215) f->addColor(r,g,b); else f->resetColor(); } std::string temp_text = text; std::string new_line_text, old_line_text; new_line_text = old_line_text = temp_text; int linecount = 1; size_t iter_pos, temp_x, temp_y; // NOTE (Kilouco): Here we centralize all the message and handle positions so it will never go offscreen. while (1) { iter_pos = old_line_text.find_first_of("\n"); temp_x = x; temp_y = y; if(iter_pos == std::string::npos || iter_pos <= 0) { int text_size = sizeText(old_line_text.c_str(), font); volatile float centralizationoffset = text_size / 2; if (temp_x + centralizationoffset > (480 * scale) + 2) temp_x = (480 * scale - 2) - text_size; else if (x - centralizationoffset < 2) temp_x = 2; else temp_x -= centralizationoffset; if (temp_y < 2) temp_y = 2; glictFontRender(old_line_text.c_str(), font, temp_x, temp_y + (12 * (linecount - 1))); break; } else { new_line_text = old_line_text.substr(iter_pos+1); old_line_text.resize(iter_pos); int text_size = sizeText(old_line_text.c_str(), font); volatile float centralizationoffset = text_size / 2; if (temp_x + centralizationoffset > (480 * scale) + 2) temp_x = (480 * scale - 2) - text_size; else if (x - centralizationoffset < 2) temp_x = 2; else temp_x -= centralizationoffset; if (temp_y < 2) temp_y = 2; glictFontRender(old_line_text.c_str(), font, temp_x, temp_y + (12 * (linecount - 1))); old_line_text = new_line_text; linecount++; } } }
bool wxSpinCtrl::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, int min, int max, int initial, const wxString& name) { // this should be in ctor/init function but I don't want to add one to 2.8 // to avoid problems with default ctor which can be inlined in the user // code and so might not get this fix without recompilation m_oldValue = INT_MIN; // before using DoGetBestSize(), have to set style to let the base class // know whether this is a horizontal or vertical control (we're always // vertical) style |= wxSP_VERTICAL; if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT ) #ifdef __WXWINCE__ style |= wxBORDER_SIMPLE; #else style |= wxBORDER_SUNKEN; #endif SetWindowStyle(style); WXDWORD exStyle = 0; WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ; // calculate the sizes: the size given is the toal size for both controls // and we need to fit them both in the given width (height is the same) wxSize sizeText(size), sizeBtn(size); sizeBtn.x = wxSpinButton::DoGetBestSize().x; if ( sizeText.x <= 0 ) { // DEFAULT_ITEM_WIDTH is the default width for the text control sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x; } sizeText.x -= sizeBtn.x + MARGIN_BETWEEN; if ( sizeText.x <= 0 ) { wxLogDebug(_T("not enough space for wxSpinCtrl!")); } wxPoint posBtn(pos); posBtn.x += sizeText.x + MARGIN_BETWEEN; // we must create the text control before the spin button for the purpose // of the dialog navigation: if there is a static text just before the spin // control, activating it by Alt-letter should give focus to the text // control, not the spin and the dialog navigation code will give focus to // the next control (at Windows level), not the one after it // create the text window m_hwndBuddy = (WXHWND)::CreateWindowEx ( exStyle, // sunken border _T("EDIT"), // window class NULL, // no window title msStyle, // style (will be shown later) pos.x, pos.y, // position 0, 0, // size (will be set later) GetHwndOf(parent), // parent (HMENU)-1, // control id wxGetInstance(), // app instance NULL // unused client data ); if ( !m_hwndBuddy ) { wxLogLastError(wxT("CreateWindow(buddy text window)")); return false; } // create the spin button if ( !wxSpinButton::Create(parent, id, posBtn, sizeBtn, style, name) ) { return false; } wxSpinButtonBase::SetRange(min, max); // subclass the text ctrl to be able to intercept some events wxSetWindowUserData(GetBuddyHwnd(), this); m_wndProcBuddy = (WXFARPROC)wxSetWindowProc(GetBuddyHwnd(), wxBuddyTextWndProc); // set up fonts and colours (This is nomally done in MSWCreateControl) InheritAttributes(); if (!m_hasFont) SetFont(GetDefaultAttributes().font); // set the size of the text window - can do it only now, because we // couldn't call DoGetBestSize() before as font wasn't set if ( sizeText.y <= 0 ) { int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); sizeText.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); } SetInitialSize(size); (void)::ShowWindow(GetBuddyHwnd(), SW_SHOW); // associate the text window with the spin button (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); SetValue(initial); // Set the range in the native control SetRange(min, max); if ( !value.empty() ) { SetValue(value); m_oldValue = (int) wxAtol(value); } else { SetValue(wxString::Format(wxT("%d"), initial)); m_oldValue = initial; } // do it after finishing with m_hwndBuddy creation to avoid generating // initial wxEVT_COMMAND_TEXT_UPDATED message ms_allSpins.Add(this); return true; }
bool wxSpinCtrl::Create(wxWindow *parent, wxWindowID id, const wxString& value, const wxPoint& pos, const wxSize& size, long style, int min, int max, int initial, const wxString& name) { // before using DoGetBestSize(), have to set style to let the base class // know whether this is a horizontal or vertical control (we're always // vertical) style |= wxSP_VERTICAL; if ( (style & wxBORDER_MASK) == wxBORDER_DEFAULT ) #ifdef __WXWINCE__ style |= wxBORDER_SIMPLE; #else style |= wxBORDER_SUNKEN; #endif SetWindowStyle(style); WXDWORD exStyle = 0; WXDWORD msStyle = MSWGetStyle(GetWindowStyle(), & exStyle) ; // Scroll text automatically if there is not enough space to show all of // it, this is better than not allowing to enter more digits at all. msStyle |= ES_AUTOHSCROLL; // propagate text alignment style to text ctrl if ( style & wxALIGN_RIGHT ) msStyle |= ES_RIGHT; else if ( style & wxALIGN_CENTER ) msStyle |= ES_CENTER; // calculate the sizes: the size given is the total size for both controls // and we need to fit them both in the given width (height is the same) wxSize sizeText(size), sizeBtn(size); sizeBtn.x = wxSpinButton::DoGetBestSize().x; if ( sizeText.x <= 0 ) { // DEFAULT_ITEM_WIDTH is the default width for the text control sizeText.x = DEFAULT_ITEM_WIDTH + MARGIN_BETWEEN + sizeBtn.x; } sizeText.x -= sizeBtn.x + MARGIN_BETWEEN; if ( sizeText.x <= 0 ) { wxLogDebug(wxT("not enough space for wxSpinCtrl!")); } wxPoint posBtn(pos); posBtn.x += sizeText.x + MARGIN_BETWEEN; // we must create the text control before the spin button for the purpose // of the dialog navigation: if there is a static text just before the spin // control, activating it by Alt-letter should give focus to the text // control, not the spin and the dialog navigation code will give focus to // the next control (at Windows level), not the one after it // create the text window m_hwndBuddy = (WXHWND)::CreateWindowEx ( exStyle, // sunken border wxT("EDIT"), // window class NULL, // no window title msStyle, // style (will be shown later) pos.x, pos.y, // position 0, 0, // size (will be set later) GetHwndOf(parent), // parent (HMENU)-1, // control id wxGetInstance(), // app instance NULL // unused client data ); if ( !m_hwndBuddy ) { wxLogLastError(wxT("CreateWindow(buddy text window)")); return false; } // create the spin button if ( !wxSpinButton::Create(parent, id, posBtn, sizeBtn, style, name) ) { return false; } wxSpinButtonBase::SetRange(min, max); // subclass the text ctrl to be able to intercept some events gs_spinForTextCtrl[GetBuddyHwnd()] = this; m_wndProcBuddy = (WXFARPROC)wxSetWindowProc(GetBuddyHwnd(), wxBuddyTextWndProc); // set up fonts and colours (This is nomally done in MSWCreateControl) InheritAttributes(); if (!m_hasFont) SetFont(GetDefaultAttributes().font); // set the size of the text window - can do it only now, because we // couldn't call DoGetBestSize() before as font wasn't set if ( sizeText.y <= 0 ) { int cx, cy; wxGetCharSize(GetHWND(), &cx, &cy, GetFont()); sizeText.y = EDIT_HEIGHT_FROM_CHAR_HEIGHT(cy); } SetInitialSize(size); (void)::ShowWindow(GetBuddyHwnd(), SW_SHOW); // associate the text window with the spin button (void)::SendMessage(GetHwnd(), UDM_SETBUDDY, (WPARAM)m_hwndBuddy, 0); // If the initial text value is actually a number, it overrides the // "initial" argument specified later. long initialFromText; if ( value.ToLong(&initialFromText) ) initial = initialFromText; SetValue(initial); m_oldValue = initial; // Set the range in the native control SetRange(min, max); // Also set the text part of the control if it was specified independently // but don't generate an event for this, it would be unexpected. m_blockEvent = true; if ( !value.empty() ) SetValue(value); m_blockEvent = false; return true; }
Eigen::Vector2f Font::sizeWrappedText(std::string text, float xLen) const { Eigen::Vector2f out(0, 0); float y = 0; std::string line, word, temp; Eigen::Vector2f textSize; size_t space, newline; while(text.length() > 0 || !line.empty()) //while there's text or we still have text to render { space = text.find(' ', 0); if(space == std::string::npos) space = text.length() - 1; word = text.substr(0, space + 1); //check if the next word contains a newline newline = word.find('\n', 0); if(newline != std::string::npos) { word = word.substr(0, newline); text.erase(0, newline + 1); }else{ text.erase(0, space + 1); } temp = line + word; textSize = sizeText(temp); //if we're on the last word and it'll fit on the line, just add it to the line if((textSize.x() <= xLen && text.length() == 0) || newline != std::string::npos) { line = temp; word = ""; } //if the next line will be too long or we're on the last of the text, render it if(textSize.x() > xLen || text.length() == 0 || newline != std::string::npos) { //increment y by height and some extra padding for the next line y += textSize.y() + 4; //move the word we skipped to the next line line = word; //update our maximum known line width if(textSize.x() > out.x()) out[0] = textSize.x(); }else{ //there's still space, continue building the line line = temp; } } out[1] = y; return out; }