Слияние кода завершено, страница обновится автоматически
#include "listview.hpp"
void TableItem::Draw(Renderer* render,ListState state,SDL_Rect& rect){}
TableItem::~TableItem(){
for(auto& n:children)delete n;
}
void TableView::Clear(bool freed){
if(freed){
for(auto item=items.begin(),end=items.end();item!=end;item++){
delete *item;
}
}
items.clear();
selectx=-1;
select=-1;
on=-1;
onx=-1;
}
void TableView::TableListenMouse(void* list){
auto &r=((TableView*)list)->_area;
int x,y;
SDL_GetMouseState(&x,&y);
if(x<r.x||x>r.x+r.w||y<r.y||y>r.y+r.h){
((TableView*)list)->on=-1;
((TableView*)list)->onx=-1;
((TableView*)list)->_in=false;
((TableView*)list)->_belong->RemoveTask(((TableView*)list)->_task);
((TableView*)list)->scroll_color=((TableView*)list)->normal_scroll_color;
((TableView*)list)->_task=NULL;
SDL_SetCursor(arrow_cursor);
return;
}
auto &g=((TableView*)list)->scroll;
if(x<g.x){
//项
((TableView*)list)->scroll_color=((TableView*)list)->normal_scroll_color;
((TableView*)list)->on=((TableView*)list)->cur_item+
(y-r.y-((TableView*)list)->space)/(((TableView*)list)->item_height+((TableView*)list)->space);
((TableView*)list)->onx=(x-r.x)/(((TableView*)list)->item_w+((TableView*)list)->spacex);
if(((TableView*)list)->on>=((TableView*)list)->items.size()){
((TableView*)list)->on=-1;
((TableView*)list)->onx=-1;
SDL_SetCursor(arrow_cursor);
return;
}
auto& a=((TableItem*)((TableView*)list)->GetItem(((TableView*)list)->on))->children;
if(((TableView*)list)->onx>=a.size()){
((TableView*)list)->onx=-1;
SDL_SetCursor(arrow_cursor);
return;
}
a[((TableView*)list)->onx]->_on((TableView*)list,x,y);
SDL_SetCursor(button_cursor);
return;
}
((TableView*)list)->on=-1;
((TableView*)list)->onx=-1;
if(g.x<=x&&x<=g.x+r.w&&g.y<=y&&y<=g.y+g.h){
((TableView*)list)->scroll_color=((TableView*)list)->on_scroll_color;
return;
}
((TableView*)list)->scroll_color=((TableView*)list)->normal_scroll_color;
}
TableView::TableView(Window* window,SDL_Rect& rect,int spacex,int spacey,int item_w,int item_h,
SDL_Color background,SDL_Color select_color,SDL_Color on_color,
SDL_Color normal_scroll_color,SDL_Color on_scroll_color):
ListView(window,rect,spacey,item_h,background,select_color,on_color,normal_scroll_color,on_scroll_color),
item_w(item_w),spacex(spacex){
selectx=-1;
onx=-1;
}
void TableView::_release(int x,int y,int clicks,unsigned char key){
if(!_enabled){
return;
}
auto t=y-_area.y;
if(t<space||t>_area.h-space){
return;
}
if(x-_area.x>_area.w-10){
//滚动条
return;
}
if(on==-1||onx==-1){
return;
}
select=on;
selectx=onx;
if(clicks==1){
((TableItem*)items.operator[](select))->children.operator[](selectx)->_click(this,x,y,key);
return;
}
((TableItem*)items.operator[](select))->children.operator[](selectx)->_double_click(this,x,y,key);
}
void TableView::_mouse_move(int x,int y){
if(!_task&&_enabled){
_in=true;
_task=_belong->AddTask(TableListenMouse,this,1,false,true);
}
}
void TableView::_draw(){
auto r=_belong->renderer;
r->SetColor(background);
r->FillRect(_area);
auto h=item_height;
SDL_Rect rect{_area.x,_area.y,_area.w,h},_r;
_r.w=item_w,_r.h=h,_r.y=0;
auto t=_t;
ListState state;
for(auto item=items.begin()+cur_item,end=items.end(),stop=item+max_item,
selected=items.begin()+select,on_item=items.begin()+on;item!=end;item++){
r->SetTarget(t);
r->Clear();
auto& a=((TableItem*)*item)->children;
_r.x=0;
for(size_t i=0,max=a.size();i!=max;i++){
if(item==selected&&i==selectx){
state=ListState::Select;
r->SetColor(select_color);
}
else if(item==on_item&&i==onx){
state=ListState::On;
r->SetColor(on_color);
}
else{
state=ListState::Normal;
r->SetColor(background);
}
r->FillRect(_r);
a[i]->Draw(r,state,_r);
if(_r.x>_r.w)break;
_r.x+=item_w+spacex;
}
r->SetTarget();
if(item==stop){
rect.h=_area.h-rect.y;
SDL_Rect src{0,0,rect.w,rect.h};
r->DrawTexture(&src,&rect,t);
break;
}
else{
r->DrawTexture(0,&rect,t);
}
rect.y+=h+space;
}
if(!_in){
return;
}
//绘制滚动条
r->SetColor(scroll_color);
r->FillRect(scroll);
}
TableView::~TableView(){}
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )