wxSize ListCtrlFixed::DoGetBestClientSize() const { if (!InReportView()) return wxControl::DoGetBestClientSize(); int totalWidth; wxClientDC dc(const_cast<ListCtrlFixed*>(this)); const int columns = GetColumnCount(); if (HasFlag(wxLC_NO_HEADER) || !columns) { totalWidth = 50*dc.GetCharWidth(); } else { totalWidth = 0; for ( int col = 0; col < columns; col++ ) totalWidth += GetColumnWidth(col); } /* * This is what we're fixing. Some.. very foolish person decided, * "Oh, let's give this an 'arbitrary' height! How about, let's see, * I don't know! LET'S USE 10 * FONT HEIGHT!" ..Unfortunately, this * person basically makes it impossible to use smaller sized list * views in report mode. It will always become tremendously large in * size, despite what constraints you originally have set with sizers. * brilliant job, whoever you are. 10 * character height.. just.. * unbeleivably wow. I am ASTOUNDED. */ return wxSize(totalWidth, 3*dc.GetCharHeight()); }
bool wxListCtrl::SetItem(wxListItem& info) { const long id = info.GetId(); QTreeWidgetItem *qitem = QtGetItem(id); if ( qitem != NULL ) { if ((info.m_mask & wxLIST_MASK_TEXT) && !info.GetText().IsNull() ) qitem->setText(info.GetColumn(), wxQtConvertString(info.GetText())); qitem->setTextAlignment(info.GetColumn(), wxQtConvertTextAlign(info.GetAlign())); if ( info.m_mask & wxLIST_MASK_DATA ) { QVariant variant = qVariantFromValue(info.GetData()); qitem->setData(0, Qt::UserRole, variant); } if (info.m_mask & wxLIST_MASK_STATE) { if ((info.m_stateMask & wxLIST_STATE_FOCUSED) && (info.m_state & wxLIST_STATE_FOCUSED)) m_qtTreeWidget->setCurrentItem(qitem, 0); if (info.m_stateMask & wxLIST_STATE_SELECTED) qitem->setSelected(info.m_state & wxLIST_STATE_SELECTED); } if (info.m_mask & wxLIST_MASK_IMAGE) { if (info.m_image >= 0) { wxImageList *imglst = GetImageList(InReportView() ? wxIMAGE_LIST_SMALL : wxIMAGE_LIST_NORMAL); wxCHECK_MSG(imglst, false, "invalid listctrl imagelist"); const wxBitmap* bitmap = imglst->GetBitmapPtr(info.m_image); if (bitmap != NULL) { // set the new image: qitem->setIcon( info.GetColumn(), QIcon( *bitmap->GetHandle() )); } } else { // remove the image using and empty qt icon: qitem->setIcon( info.GetColumn(), QIcon() ); } } for (int col=0; col<GetColumnCount(); col++) { if ( info.GetFont().IsOk() ) qitem->setFont(col, info.GetFont().GetHandle() ); if ( info.GetTextColour().IsOk() ) qitem->setTextColor(col, info.GetTextColour().GetHandle()); if ( info.GetBackgroundColour().IsOk() ) qitem->setBackgroundColor(col, info.GetBackgroundColour().GetHandle()); } return true; } else return false; }
void wxFileListCtrl::OnSize( wxSizeEvent &event ) { event.Skip(); if ( InReportView() ) { // In report mode, set name column to use remaining width. int newNameWidth = GetClientSize().GetWidth(); for ( int i = 1; i < GetColumnCount(); i++ ) { newNameWidth -= GetColumnWidth(i); if ( newNameWidth <= 0 ) return; } SetColumnWidth(0, newNameWidth); } }
wxSize wxListCtrlBase::DoGetBestClientSize() const { // There is no obvious way to determine the best size in icon and list // modes so just don't do it for now. if ( !InReportView() ) return wxControl::DoGetBestClientSize(); int totalWidth; wxClientDC dc(const_cast<wxListCtrlBase*>(this)); // In report mode, we use only the column headers, not items, to determine // the best width. The reason for this is that it's easier (we can't just // iterate over all items, especially not in a virtual control, so we'd // have to do something relatively complicated such as checking the size of // some items in the beginning and the end only) and also because the // columns are usually static while the list contents is dynamic so it // usually doesn't make much sense to adjust the control size to it anyhow. // And finally, scrollbars can always be used with the items while the // headers are just truncated if there is not enough place for them. const int columns = GetColumnCount(); if ( HasFlag(wxLC_NO_HEADER) || !columns ) { // Use some arbitrary width. totalWidth = 50*dc.GetCharWidth(); } else // We do have columns, use them to determine the best width. { totalWidth = 0; for ( int col = 0; col < columns; col++ ) { totalWidth += GetColumnWidth(col); } } // Use some arbitrary height, there is no good way to determine it. return wxSize(totalWidth, 10*dc.GetCharHeight()); }
void MyListCtrl::OnListKeyDown(wxListEvent& event) { long item; switch ( event.GetKeyCode() ) { case 'C': // colorize { wxListItem info; info.m_itemId = event.GetIndex(); if ( info.m_itemId == -1 ) { // no item break; } GetItem(info); wxListItemAttr *attr = info.GetAttributes(); if ( !attr || !attr->HasTextColour() ) { info.SetTextColour(*wxCYAN); SetItem(info); RefreshItem(info.m_itemId); } } break; case 'N': // next item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_FOCUSED); if ( item++ == GetItemCount() - 1 ) { item = 0; } wxLogMessage(_T("Focusing item %ld"), item); SetItemState(item, wxLIST_STATE_FOCUSED, wxLIST_STATE_FOCUSED); EnsureVisible(item); break; case 'R': // show bounding rectangle { item = event.GetIndex(); wxRect r; if ( !GetItemRect(item, r) ) { wxLogError(_T("Failed to retrieve rect of item %ld"), item); break; } wxLogMessage(_T("Bounding rect of item %ld is (%d, %d)-(%d, %d)"), item, r.x, r.y, r.x + r.width, r.y + r.height); } break; case '1': // show sub item bounding rectangle case '2': case '3': case '4': // this column is invalid but we want to test it too if ( InReportView() ) { int subItem = event.GetKeyCode() - '1'; item = event.GetIndex(); wxRect r; if ( !GetSubItemRect(item, subItem, r) ) { wxLogError(_T("Failed to retrieve rect of item %ld column %d"), item, subItem + 1); break; } wxLogMessage(_T("Bounding rect of item %ld column %d is (%d, %d)-(%d, %d)"), item, subItem + 1, r.x, r.y, r.x + r.width, r.y + r.height); } break; case 'U': // update if ( !IsVirtual() ) break; if ( m_updated != -1 ) RefreshItem(m_updated); m_updated = event.GetIndex(); if ( m_updated != -1 ) { // we won't see changes to this item as it's selected, update // the next one (or the first one if we're on the last item) if ( ++m_updated == GetItemCount() ) m_updated = 0; wxLogMessage("Updating colour of the item %ld", m_updated); RefreshItem(m_updated); } break; case 'D': // delete item = GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); while ( item != -1 ) { DeleteItem(item); wxLogMessage(_T("Item %ld deleted"), item); // -1 because the indices were shifted by DeleteItem() item = GetNextItem(item - 1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED); } break; case 'I': // insert if ( GetWindowStyle() & wxLC_REPORT ) { if ( GetWindowStyle() & wxLC_VIRTUAL ) { SetItemCount(GetItemCount() + 1); } else // !virtual { InsertItemInReportView(event.GetIndex()); } } //else: fall through default: LogEvent(event, _T("OnListKeyDown")); event.Skip(); } }