Удаление всех выбранных строк в wxListCtrl

March 24th, 2010 Begemot

На первый взгляд это кажется банальной процедурой, но у меня заработало только с третье или четвертой попытки, ибо есть особенности. Так что – code snippet :

void ClassName::OnDeleteClick(wxCommandEvent& event)
{
    long item = -1;
    while(true)
    {
        item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
        if (item == wxNOT_FOUND) break;
        m_list->DeleteItem(item--);
    }
}

Updated: более лаконичная версия по мотивам комментариев

    long item = -1;
    while((item = m_list->GetNextItem(item, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED)) != wxNOT_FOUND)
        m_list->DeleteItem(item--);

wxListCtrl selection under MAC OS

August 14th, 2009 Begemot

Наткнулся на разное поведение wxListCtrl’a под виндой и маком. Надо при смене выделения в другом контроле устанавливать правильное выделение в wxListCtrl. Под виндой все просто

        int t = нужная строка;
    list->SetItemState(t, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
    list->EnsureVisible(t);

Под маком надо обязательно сбрасывать старое выделение и только потом ставить новое.

    int cursel = list->GetNextItem(-1, wxLIST_NEXT_ALL, wxLIST_STATE_SELECTED);
    if (cursel != wxNOT_FOUND)
               list->SetItemState(cursel, !wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
 ......
      int t = нужная строка;
      list->SetItemState(t, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED);
      list->EnsureVisible(t);

wxListCtrl и джедайские приемы

June 19th, 2009 Begemot

Знаете как создать wxListCtrl с одной колонкой, ширина которой равна ширине контрола? не уже – что бы выделение было красивым и удобным для пользователя, не шире что бы не появлялась линейка прокрутки вообщем сделать так как должно быть в нормально продукте. Я думал просто, я был удивлен, нормального пути нет или я его не нашел.

Поскольку контрол в сайзере ширина его точно не известна, я смог сделать только так :
[sourcecode language=”cpp”]
m_TransitionList = new wxListCtrl(….
m_TransitionList->Connect(wxEVT_SIZE, wxSizeEventHandler(MovieMaker::OnTransitionListSize)); // for correct resizing width of column
[/sourcecode]

Ну и сам обработчик : 

[sourcecode language=”cpp”]
void MovieMaker::OnTransitionListSize(wxSizeEvent& event)
{
if (wxListCtrl * list = ((MovieMaker*)GetParent()->GetParent())->m_TransitionList)
list->SetColumnWidth(0, list->GetSize().GetWidth() – wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) – 6);
}
[/sourcecode]

Учтите что обработчик принадлежит класу создающему wxListCtrl, а не класу контрола, поэтому this у него не “правильный”,  берем родителя (в моем случае дедушку), кастим к нужному класу  и устанавливаем ширину. Почему то пришлось вычитать еще 6 пикселов (?!), число 6 подобранно эксперементально.

Вот теперь у нас нормальный лист контрол который не стыдно отдать юзверю, а вы как решаете эту проблему?

Update: Новая более правильная версия, спасибо Алексею за облагораживание кода:

[sourcecode language=”cpp”]
void MovieMaker::OnTransitionListSize(wxSizeEvent& event)
{
if (wxListCtrl * list = dynamic_cast<wxListCtrl*>(event.GetEventObject()))
list->SetColumnWidth(0, list->GetSize().GetWidth() – wxSystemSettings::GetMetric(wxSYS_VSCROLL_X) – 6);
}
[/sourcecode]