📄 lod.cc
字号:
GtkWidget *hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(vbox),5); LoDSelectEntry=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox),LoDSelectEntry,FALSE,FALSE,0); gtk_box_set_spacing(GTK_BOX(hbox),5); GtkWidget *ok_button=gtk_button_new_with_label(_("Ok")); GtkWidget *cancel_button=gtk_button_new_with_label(_("Cancel")); GTK_WIDGET_SET_FLAGS(ok_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(cancel_button,GTK_CAN_DEFAULT); gtk_box_pack_start(GTK_BOX(hbox),ok_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(hbox),cancel_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0); g_signal_connect(G_OBJECT(ok_button),"clicked", G_CALLBACK(_select_ok_),this); g_signal_connect(G_OBJECT(cancel_button),"clicked", G_CALLBACK(_select_cancel_),NULL); g_signal_connect(G_OBJECT(LoDSelectWindow),"delete_event", G_CALLBACK(_select_delete_),NULL); g_signal_connect(G_OBJECT(LoDSelectEntry), "activate", G_CALLBACK(_select_ok_), this); d4x_eschandler_init(LoDSelectWindow,this); GtkWidget *frame=(GtkWidget*)NULL; if (type) frame=gtk_frame_new(_("Unselect")); else frame=gtk_frame_new(_("Select")); gtk_container_add(GTK_CONTAINER(frame),vbox); gtk_container_add(GTK_CONTAINER(LoDSelectWindow),frame); gtk_widget_show_all(LoDSelectWindow); gtk_window_set_default(GTK_WINDOW(LoDSelectWindow),ok_button); gtk_widget_grab_focus(LoDSelectEntry); gtk_window_set_modal (GTK_WINDOW(LoDSelectWindow),TRUE); gtk_window_set_transient_for (GTK_WINDOW (LoDSelectWindow), GTK_WINDOW (MainWindow));};int list_event_callback(GtkTreeView *view,GdkEvent *event,d4xQueueView *qv) { GtkTreeSelection *sel=gtk_tree_view_get_selection(view); GdkEventButton *bevent=(GdkEventButton *)event; if (event->type == GDK_BUTTON_PRESS) { if (bevent->button==3) { GtkTreePath *path=NULL; if (gtk_tree_view_get_path_at_pos(view,int(bevent->x),int(bevent->y),&path,NULL,NULL,NULL)){ GtkTreeIter iter; GtkTreeModel *model=gtk_tree_view_get_model(view); gtk_tree_model_get_iter(model,&iter,path); if (!gtk_tree_selection_iter_is_selected(sel,&iter)) gtk_tree_selection_unselect_all(sel); gtk_tree_selection_select_iter(sel,&iter); gtk_tree_path_free(path); } else { gtk_tree_selection_unselect_all(sel); }; gint x,y; GdkModifierType modmask; gdk_window_get_pointer((GdkWindow *)NULL,&x,&y, &modmask); list_menu_prepare(); gtk_menu_popup(GTK_MENU(ListMenu),(GtkWidget *)NULL,(GtkWidget *)NULL,(GtkMenuPositionFunc)NULL,(gpointer)NULL,bevent->button,bevent->time); return TRUE; }; }; if (event->type==GDK_2BUTTON_PRESS && bevent->button==1){ GtkTreePath *path=NULL; if (gtk_tree_view_get_path_at_pos(view,int(bevent->x),int(bevent->y),&path,NULL,NULL,NULL)){ gtk_tree_selection_unselect_all(sel); gtk_tree_selection_select_path(sel,path); qv->open_logs(); gtk_tree_path_free(path); }; }; if (event->type == GDK_KEY_PRESS) { GdkEventKey *kevent=(GdkEventKey *)event; switch(kevent->keyval) { case GDK_Delete: case GDK_KP_Delete:{ ask_delete_download(); return TRUE; }; case GDK_KP_Enter: case GDK_Return:{ qv->open_logs(); return TRUE; }; case GDK_KP_Add:{ qv->init_select_window(); return TRUE; }; case GDK_KP_Subtract:{ qv->init_select_window(1); return TRUE; }; }; if (kevent->state & GDK_SHIFT_MASK) { switch (kevent->keyval) { case GDK_KP_Up: case GDK_Up:{ qv->move_up(); return TRUE; }; case GDK_KP_Down: case GDK_Down:{ qv->move_down(); return TRUE; }; case GDK_KP_Page_Up: case GDK_Page_Up:{ qv->move_selected_home(); return TRUE; }; case GDK_KP_Page_Down: case GDK_Page_Down:{ qv->move_selected_end(); return TRUE; }; default: break; }; }; }; return FALSE;};/*void d4xQueueView::rebuild_wait(){ if (D4X_QUEUE->count(DL_WAIT)==0) return; int i=0; tDList *dlist=new tDList(DL_WAIT); dlist->init_pixmap(PIX_WAIT); dlist->init(0); tDownload *tmp=(tDownload *)gtk_clist_get_row_data(GTK_CLIST(ListOfDownloads),i); while(tmp){ if (tmp->owner()==DL_WAIT){ D4X_QUEUE->del(tmp); dlist->insert(tmp); if (D4X_QUEUE->count(DL_WAIT)==0) break; }; i+=1; tmp=(tDownload *)gtk_clist_get_row_data(GTK_CLIST(ListOfDownloads),i); }; D4X_QUEUE->replace_list(dlist,DL_WAIT); if (CFG.WITHOUT_FACE==0) D4X_QVT->update(D4X_QUEUE);};static int _cmp_bypercent(tDownload *a,tDownload *b){ return( b->Percent>a->Percent?1:-1);};static int _cmp_bysize(tDownload *a,tDownload *b){ return( b->finfo.size - a->finfo.size );};static int _cmp_bydsize(tDownload *a,tDownload *b){ return( b->Size.curent - a->Size.curent );};static int _cmp_byremain(tDownload *a,tDownload *b){ return( b->Remain.curent - a->Remain.curent );};static int _cmp_byspeed(tDownload *a,tDownload *b){ return( b->Speed.curent - a->Speed.curent);};static int _cmp_byfile(tDownload *a,tDownload *b){ if (a->info->file.get() && b->info->file.get()) return(strcmp(a->info->file.get(), b->info->file.get())); if (a->info->file.get()) return(1); if (b->info->file.get()) return(0); return(-1);};static int _cmp_whole_size_(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2){ GtkCListRow *row1=(GtkCListRow *)ptr1; GtkCListRow *row2=(GtkCListRow *)ptr2; if (row1->data && row2->data){ return(_cmp_bysize((tDownload *)(row1->data), (tDownload *)(row2->data))); }; if (row1->data) return(1); if (row2->data) return(0); return(-1);};#define CLIST_CMP_I(arg) static int arg##i_(GtkCList *clist, \ gconstpointer ptr1, \ gconstpointer ptr2){ \ return (arg(clist,ptr2,ptr1)); \}CLIST_CMP_I(_cmp_whole_size_);static int _cmp_whole_percent_(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2){ GtkCListRow *row1=(GtkCListRow *)ptr1; GtkCListRow *row2=(GtkCListRow *)ptr2; if (row1->data && row2->data){ return(_cmp_bypercent((tDownload *)(row1->data), (tDownload *)(row2->data))); }; if (row1->data) return(1); if (row2->data) return(0); return(-1);};CLIST_CMP_I(_cmp_whole_percent_);static int _cmp_whole_status_(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2){ GtkCListRow *row1=(GtkCListRow *)ptr1; GtkCListRow *row2=(GtkCListRow *)ptr2; if (row1->data && row2->data){ int smap[]={0,10,6,8,9,11,7,0}; tDownload *d1=(tDownload *)(row1->data); tDownload *d2=(tDownload *)(row2->data); return(smap[d2->owner()]-smap[d1->owner()]); }; if (row1->data) return(1); if (row2->data) return(0); return(-1);};CLIST_CMP_I(_cmp_whole_status_);static int _cmp_whole_file_(GtkCList *clist, gconstpointer ptr1, gconstpointer ptr2){ GtkCListRow *row1=(GtkCListRow *)ptr1; GtkCListRow *row2=(GtkCListRow *)ptr2; if (row1->data && row2->data){ return(_cmp_byfile((tDownload *)(row1->data), (tDownload *)(row2->data))); }; if (row1->data) return(1); if (row2->data) return(0); return(-1);};CLIST_CMP_I(_cmp_whole_file_);void d4xQueueView::sort(int how){ int count=D4X_QUEUE->count(DL_RUN); int (*cmp_func)(tDownload *,tDownload *)=(int)NULL; GdkModifierType mask; gint x,y; gdk_window_get_pointer(MainWindow->window,&x,&y,&mask); int whole_list=mask & GDK_SHIFT_MASK; switch(how){ case FILE_COL:{ if (whole_list){ gtk_clist_set_compare_func(GTK_CLIST(ListOfDownloads), LoDSortFlag==FILE_COL?_cmp_whole_file_:_cmp_whole_file_i_); gtk_clist_sort(GTK_CLIST(ListOfDownloads)); rebuild_wait(); LoDSortFlag=LoDSortFlag==FILE_COL?-FILE_COL:FILE_COL; return; }; cmp_func=_cmp_byfile; }; case STATUS_COL: if (whole_list){ gtk_clist_set_compare_func(GTK_CLIST(ListOfDownloads), LoDSortFlag==PERCENT_COL?_cmp_whole_status_:_cmp_whole_status_i_); gtk_clist_sort(GTK_CLIST(ListOfDownloads)); rebuild_wait(); LoDSortFlag=LoDSortFlag==PERCENT_COL?-PERCENT_COL:PERCENT_COL; return; }; cmp_func=NULL; break; case PERCENT_COL: if (whole_list){ gtk_clist_set_compare_func(GTK_CLIST(ListOfDownloads), LoDSortFlag==PERCENT_COL?_cmp_whole_percent_:_cmp_whole_percent_i_); gtk_clist_sort(GTK_CLIST(ListOfDownloads)); rebuild_wait(); LoDSortFlag=LoDSortFlag==PERCENT_COL?-PERCENT_COL:PERCENT_COL; return; }; cmp_func=_cmp_bypercent; break; case FULL_SIZE_COL:{ if (whole_list){ gtk_clist_set_compare_func(GTK_CLIST(ListOfDownloads), LoDSortFlag==FULL_SIZE_COL?_cmp_whole_size_:_cmp_whole_size_i_); gtk_clist_sort(GTK_CLIST(ListOfDownloads)); rebuild_wait(); LoDSortFlag=LoDSortFlag==FULL_SIZE_COL?-FULL_SIZE_COL:FULL_SIZE_COL; return; }; cmp_func=_cmp_bysize; break; }; case DOWNLOADED_SIZE_COL: cmp_func=_cmp_bydsize; break; case REMAIN_SIZE_COL: cmp_func=_cmp_byremain; break; case SPEED_COL: cmp_func=_cmp_byspeed; break; }; if (count<2) return; //nothing todo if (cmp_func==NULL) return; freeze(); tDownload *tmp=D4X_QUEUE->last(DL_RUN); tDownload *cur=(tDownload*)(tmp->next); int changed; do{ changed=0; gint row1=get_row(tmp); while (cur){ gint row=get_row(cur); if ((row<row1 && cmp_func(cur,tmp)<0) || (row>row1 && cmp_func(cur,tmp)>0)){ swap(tmp,cur); row1=row; changed=1; }; cur=(tDownload*)(cur->next); }; if (changed==0){ tmp=(tDownload*)(tmp->next); changed=1; }; cur=(tDownload*)(tmp->next); }while(changed && cur); unfreeze(); LoDSortFlag=NOTHING_COL;};static void list_of_downloads_sort(GtkWidget *widget,d4xQueueView *qv){ int how=GPOINTER_TO_INT(gtk_object_get_user_data(GTK_OBJECT(widget))); qv->sort(how);};void d4xQueueView::set_column_justification (int col, GtkJustification justify){ if (prefs.cols[col].enum_index<prefs.cols[NOTHING_COL].enum_index) gtk_clist_set_column_justification (GTK_CLIST(ListOfDownloads), prefs.cols[col].enum_index, justify);};GtkWidget *d4xQueueView::get_column_widget(int col){ if (prefs.cols[col].enum_index<prefs.cols[NOTHING_COL].enum_index) return (GTK_CLIST(ListOfDownloads)->column[prefs.cols[col].enum_index].button); return((GtkWidget *)NULL);};void d4xQueueView::init_sort_buttons(){ GtkWidget *button=(GtkWidget *)NULL; int a[]={PERCENT_COL, FILE_COL, STATUS_COL, DOWNLOADED_SIZE_COL, SPEED_COL, REMAIN_SIZE_COL, FULL_SIZE_COL }; for (unsigned int i=0;i<sizeof(a)/sizeof(int);i++){ button=get_column_widget(a[i]); if (button){ gtk_object_set_user_data(GTK_OBJECT(button), GINT_TO_POINTER(a[i])); gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(list_of_downloads_sort), this); }; }; };*/static GtkTargetEntry ltarget_table[] = { { "d4x/dpointer", 0, 0 }};static guint ln_targets = sizeof(ltarget_table) / sizeof(ltarget_table[0]);static void source_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, guint info, guint time, gpointer data){ if (info == 0) gtk_selection_data_set (selection_data, selection_data->target, 8, (guchar*)(&widget) ,sizeof(GtkWidget*)); else gtk_drag_finish (context, TRUE, FALSE, time);}/*static void source_drag_begin(GtkWidget *widget, GdkDragContext *context){ if (GTK_CLIST(widget)->selection==NULL){ gdk_drag_status (context, context->suggested_action, time(NULL)); // gtk_drag_finish (context, FALSE, FALSE, time(NULL)); };};*/void d4xQueueView::toggle_column_visibility(int b){ GList *tmp=gtk_tree_view_get_columns(GTK_TREE_VIEW(ListOfDownloads)); GList *a=tmp; int i=0; while (a){ GtkTreeViewColumn *col=GTK_TREE_VIEW_COLUMN(a->data); gpointer p=g_object_get_data (G_OBJECT (col), "d4x_col_num"); if (b==GPOINTER_TO_INT(p)){ if (gtk_tree_view_column_get_visible(col)) gtk_tree_view_column_set_visible(col,FALSE); else gtk_tree_view_column_set_visible(col,TRUE); break; }; a=a->next; };};static void _tmp_activate_(GtkWidget *widget,d4xQueueView *qv){ gint a=GPOINTER_TO_INT(g_object_get_data(G_OBJECT(widget),"d4x_col_num")); if (a>=0){ qv->toggle_column_visibility(a); };
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -