/* WebDownloader for X-Window * Copyright (C) 1999-2002 Koshelev Maxim * This Program is free but not GPL!!! You can't modify it * without agreement with author. You can't distribute modified * program but you can distribute unmodified program. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ #include "qtree.h" #include "list.h" #include "misc.h" #include "colors.h" #include "../ntlocale.h" #include "../main.h" #include "../var.h" #include "mywidget.h" #include "buttons.h" enum { QROW_NAME, QROW_SPEED, QROW_TOTAL, QROW_WAIT, QROW_RUN, QROW_QUEUE, QROW_LAST }; static gint _event_queue_(GtkWidget *widget,GdkEventButton *event,d4xQsTree *q){ if (event->type==GDK_BUTTON_PRESS && event->button==3) { GtkTreeSelection *sel=gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)); GtkTreePath *path=NULL; if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(widget), gint(event->x), gint(event->y), &path, NULL,NULL,NULL)){ gtk_tree_selection_select_path(sel,path); gtk_tree_path_free(path); q->popup_menu((GdkEvent*)event,1); }else{ q->popup_menu((GdkEvent*)event,0); gtk_tree_selection_unselect_all(sel); }; return TRUE; }; return FALSE; }; static void _menu_event_nq_(GtkAction *action,d4xQsTree *qt){ qt->create_init(); }; static void _menu_event_nsq_(GtkAction *action,d4xQsTree *qt){ qt->create_init(1); }; static void _menu_event_remove_(GtkAction *action,d4xQsTree *qt){ qt->delete_queue(); }; static void _menu_event_props_(GtkAction *action,d4xQsTree *qt){ qt->prefs_init(); }; static void _create_cancel_(GtkButton *button,d4xQsTree *qt){ qt->create_cancel(); }; static void _create_ok_(GtkWidget *widget,d4xQsTree *qt){ qt->create_ok(); }; static void _create_delete_(GtkWidget *window,GdkEvent *event,d4xQsTree *qt){ qt->create_cancel(); }; static void _create_changed_(GtkWidget *entry,GtkWidget *ok_button){ if (strlen(text_from_combo(entry))) gtk_widget_set_sensitive(ok_button,TRUE); else gtk_widget_set_sensitive(ok_button,FALSE); }; void d4xQsTree::create_ok(){ d4xDownloadQueue *papa=NULL; if (create_mode) papa=selected(); char *name=text_from_combo(dialog_entry); create_new_queue(name,papa); create_cancel(); }; void d4xQsTree::create_cancel(){ gtk_widget_destroy(dialog); dialog=NULL; }; void d4xQsTree::create_init(int mode){ if (dialog){ gdk_window_show(dialog->window); return; }; create_mode=mode; dialog = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_wmclass(GTK_WINDOW(dialog), "D4X_CreateQueueDialog","D4X"); gtk_window_set_title(GTK_WINDOW (dialog), _("Create new queue")); gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(dialog),5); GtkWidget *vbox=gtk_vbox_new(FALSE,5); GtkWidget *hbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbox),5); dialog_entry=gtk_entry_new(); gtk_box_pack_start(GTK_BOX(vbox),dialog_entry,FALSE,FALSE,0); GtkWidget *ok_button=gtk_button_new_from_stock(GTK_STOCK_OK); GtkWidget *cancel_button=gtk_button_new_from_stock(GTK_STOCK_CANCEL); GTK_WIDGET_SET_FLAGS(ok_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(cancel_button,GTK_CAN_DEFAULT); gtk_widget_set_sensitive(ok_button,FALSE); 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 (dialog_entry),"changed", (GtkSignalFunc)_create_changed_, ok_button); g_signal_connect(G_OBJECT(ok_button),"clicked", G_CALLBACK(_create_ok_),this); g_signal_connect(G_OBJECT(cancel_button),"clicked", G_CALLBACK(_create_cancel_),this); g_signal_connect(G_OBJECT(dialog),"delete_event", G_CALLBACK(_create_delete_),this); g_signal_connect(G_OBJECT(dialog_entry), "activate", G_CALLBACK (_create_ok_), this); d4x_eschandler_init(dialog,this); gtk_container_add(GTK_CONTAINER(dialog),vbox); gtk_widget_show_all(dialog); gtk_window_set_default(GTK_WINDOW(dialog),ok_button); gtk_widget_grab_focus(dialog_entry); gtk_window_set_modal (GTK_WINDOW(dialog),TRUE); gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (MainWindow)); }; static gboolean target_drag_drop (GtkTreeView *view, GdkDragContext *context, gint x, gint y, guint time, d4xQsTree *qt){ GtkTreePath *path=NULL; if (context->targets && gtk_tree_view_get_path_at_pos(view,x,y,&path,NULL,NULL,NULL)){ GtkTreeModel *model=gtk_tree_view_get_model(view); GtkTreeIter iter; if (gtk_tree_model_get_iter(model,&iter,path)) if (qt->drop_to_row) gtk_tree_iter_free(qt->drop_to_row); qt->drop_to_row=gtk_tree_iter_copy(&iter); gtk_drag_get_data (GTK_WIDGET(view), context, GDK_POINTER_TO_ATOM (context->targets->data), time); gtk_tree_path_free(path); return TRUE; }; if (qt->drop_to_row) gtk_tree_iter_free(qt->drop_to_row); qt->drop_to_row=NULL; return FALSE; }; static void _foreach_move_prepare_(GtkTreeModel *model,GtkTreePath *path, GtkTreeIter *iter,gpointer p){ tQueue *q=(tQueue*)p; tmpIterNode *i=new tmpIterNode(iter); q->insert(i); }; tDownload * d4xQsTree::get_download(GtkTreeView *view,GtkTreeIter *iter){ GtkListStore *list_store=GTK_LIST_STORE(gtk_tree_view_get_model(view)); GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(list_store),iter, NOTHING_COL,&val); tDownload *what=(tDownload *)g_value_get_pointer(&val); g_value_unset(&val); return (what); }; void d4xQsTree::drop_from(GtkTreeView *src_view){ drag_motion(NULL); if (drop_to_row==NULL) return; tQueue q; GtkTreeSelection *sel=gtk_tree_view_get_selection(src_view); gtk_tree_selection_selected_foreach(sel, _foreach_move_prepare_, &q); tNode *t=q.last(); if (t==NULL) return; tDownload *temp=get_download(src_view,((tmpIterNode*)t)->iter); d4xDownloadQueue *src=temp->myowner->PAPA; if (src==NULL) return; GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(store),drop_to_row, QROW_QUEUE,&val); d4xDownloadQueue *dst=(d4xDownloadQueue *)g_value_get_pointer(&val); g_value_unset(&val); if (dst && dst!=src){ while(t){ tDownload *temp=get_download(src_view,((tmpIterNode*)t)->iter); int type=temp->owner(); src->del(temp); src->qv.remove(temp); dst->add(temp,type); if (dst->SpdLmt==0 && temp->SpeedLimit) temp->SpeedLimit->base2=0; dst->qv.add(temp); t=t->next; }; _aa_.try_to_run_wait(dst); _aa_.try_to_run_wait(src); prepare_buttons(); }; }; void d4xQsTree::drag_motion(GtkTreeIter *iter){ if (row_to_color){ gtk_tree_store_set(store,row_to_color, QROW_LAST,FALSE, -1); gtk_tree_iter_free(row_to_color); }; if (iter==NULL){ row_to_color=NULL; }else{ row_to_color=gtk_tree_iter_copy(iter); gtk_tree_store_set(store,row_to_color, QROW_LAST,TRUE, -1); }; }; static gboolean target_drag_motion (GtkTreeView *view, GdkDragContext *context, gint x,gint y, guint time, d4xQsTree *qt){ GtkTreeIter iter; GtkTreePath *path=NULL; if (context->targets && gtk_tree_view_get_path_at_pos(view,x,y,&path,NULL,NULL,NULL)){ GtkTreeModel *model=gtk_tree_view_get_model(view); if (gtk_tree_model_get_iter(model,&iter,path)) qt->drag_motion(&iter); gtk_tree_path_free(path); return TRUE; }; qt->drag_motion(NULL); return FALSE; }; static void target_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gint y, GtkSelectionData *data, guint info, guint time, d4xQsTree *qt){ if ((data->length == sizeof(GtkWidget *)) && (data->format == 8)){ GtkTreeView **src_view=NULL; src_view=(GtkTreeView **)(data->data); if (src_view && *src_view){ qt->drop_from(*src_view); }; gtk_drag_finish (context, TRUE, FALSE, time); return; } gtk_drag_finish (context, FALSE, FALSE, time); }; static GtkTargetEntry ltarget_table1[] = { { "d4x/dpointer", 0, 0 } }; static guint ln_targets1 = sizeof(ltarget_table1) / sizeof(ltarget_table1[0]); static void target_drag_leave(GtkWidget *widget,GdkDragContext *context, guint time,d4xQsTree *qt){ qt->drag_motion(NULL); } static gboolean d4x_qstree_select_func(GtkTreeSelection *sel, GtkTreeModel *model,GtkTreePath *path, gboolean is_sel, gpointer data){ if (!is_sel){ d4xQsTree *qt=(d4xQsTree*)data; GtkTreeIter iter; gtk_tree_model_get_iter(model,&iter,path); qt->select_row(&iter); }; return(TRUE); }; void d4xQsTree::init(){ store=gtk_tree_store_new(QROW_LAST+1, G_TYPE_STRING, //name G_TYPE_STRING, //speed G_TYPE_INT, //Total G_TYPE_INT, //Wait G_TYPE_STRING, //Run G_TYPE_POINTER, G_TYPE_BOOLEAN);//queue view=GTK_TREE_VIEW(gtk_tree_view_new_with_model(GTK_TREE_MODEL(store))); GtkTreeSelection *sel=gtk_tree_view_get_selection(view); gtk_tree_selection_set_select_function(sel,d4x_qstree_select_func,this,NULL); gtk_tree_view_set_headers_visible(view,FALSE); GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer),"background-gdk", &BLUE,NULL); g_object_set (G_OBJECT (renderer),"foreground-gdk", &WHITE,NULL); GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("Name", renderer, "text",QROW_NAME, "background_set", QROW_LAST, "foreground_set", QROW_LAST, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer),"background-gdk", &BLUE,NULL); g_object_set (G_OBJECT (renderer),"foreground-gdk", &WHITE,NULL); column = gtk_tree_view_column_new_with_attributes ("Speed", renderer, "text",QROW_SPEED, "background_set", QROW_LAST, "foreground_set", QROW_LAST, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer),"background-gdk", &BLUE,NULL); g_object_set (G_OBJECT (renderer),"foreground-gdk", &WHITE,NULL); column = gtk_tree_view_column_new_with_attributes ("Total", renderer, "text",QROW_TOTAL, "background_set", QROW_LAST, "foreground_set", QROW_LAST, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer),"background-gdk", &BLUE,NULL); g_object_set (G_OBJECT (renderer),"foreground-gdk", &WHITE,NULL); column = gtk_tree_view_column_new_with_attributes ("Wait", renderer, "text",QROW_WAIT, "background_set", QROW_LAST, "foreground_set", QROW_LAST, NULL); gtk_tree_view_append_column(view, column); renderer = gtk_cell_renderer_text_new (); g_object_set (G_OBJECT (renderer),"background-gdk", &BLUE,NULL); g_object_set (G_OBJECT (renderer),"foreground-gdk", &WHITE,NULL); column = gtk_tree_view_column_new_with_attributes ("Run", renderer, "text",QROW_RUN, "background_set", QROW_LAST, "foreground_set", QROW_LAST, NULL); gtk_tree_view_append_column(view, column); drop_to_row=row_to_color=NULL; gtk_drag_dest_set (GTK_WIDGET(view), (GtkDestDefaults)(GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_HIGHLIGHT | GTK_DEST_DEFAULT_DROP), ltarget_table1, ln_targets1, (GdkDragAction)(GDK_ACTION_COPY|GDK_ACTION_MOVE)); g_signal_connect(G_OBJECT (view), "drag_leave", G_CALLBACK (target_drag_leave), this); g_signal_connect(G_OBJECT (view), "drag_drop", G_CALLBACK (target_drag_drop), this); g_signal_connect(G_OBJECT (view), "drag_data_received", G_CALLBACK (target_drag_data_received), this); g_signal_connect(G_OBJECT (view), "drag_motion", G_CALLBACK (target_drag_motion), this); g_signal_connect(G_OBJECT(view), "event", G_CALLBACK(_event_queue_),this); menu1=menu2=dialog=prefs=NULL; }; void d4xQsTree::add(d4xDownloadQueue *what,d4xDownloadQueue *papa){ what->inserted=1; if (papa){ gtk_tree_store_append(store,&(what->tree_iter),&(papa->tree_iter)); GtkTreePath *path=gtk_tree_model_get_path(GTK_TREE_MODEL(store),&(papa->tree_iter)); gtk_tree_view_expand_row(view,path,TRUE); gtk_tree_path_free(path); }else gtk_tree_store_append(store,&(what->tree_iter),NULL); char data[100]; sprintf(data,"%i/%i",what->count(DL_RUN),what->MAX_ACTIVE); gtk_tree_store_set(store,&(what->tree_iter), QROW_NAME,what->name.get(), QROW_TOTAL,what->count(), QROW_WAIT,what->count(DL_WAIT), QROW_RUN,data, QROW_QUEUE,what, QROW_LAST,FALSE, -1); }; void d4xQsTree::del(d4xDownloadQueue *what){ gtk_tree_store_remove(store,&(what->tree_iter)); _aa_.SpeedScheduler->del(what); what->inserted=0; }; void d4xQsTree::update(d4xDownloadQueue *what){ if (store==NULL) return; char data[100]; sprintf(data,"%i/%i",what->count(DL_RUN),what->MAX_ACTIVE); gtk_tree_store_set(store,&(what->tree_iter), QROW_NAME,what->name.get(), QROW_TOTAL,what->count(), QROW_WAIT,what->count(DL_WAIT), QROW_RUN,data, -1); }; void d4xQsTree::update_speed(d4xDownloadQueue *what){ gtk_tree_store_set(store,&(what->tree_iter), QROW_SPEED, (make_number_nice(what->speed.speed(),what->SPEED_FORMAT?2:0)+"B/s").c_str(), -1); }; void d4xQsTree::switch_remote(d4xDownloadQueue *what){ if (store && what->inserted){ GtkTreeSelection *sel=gtk_tree_view_get_selection(view); gtk_tree_selection_select_iter(sel,&(what->tree_iter)); }; }; void d4xQsTree::switch_to(d4xDownloadQueue *what){ if (D4X_QUEUE==what) return; if (D4X_QUEUE){ D4X_QUEUE->reset_empty_func(); D4X_QUEUE->qv.get_adj(); // gtk_widget_hide(D4X_QUEUE->qv.ListOfDownloads); gtk_container_remove(GTK_CONTAINER(ContainerForCList),D4X_QUEUE->qv.ListOfDownloads); }; gtk_container_add(GTK_CONTAINER(ContainerForCList),what->qv.ListOfDownloads); gtk_widget_show(what->qv.ListOfDownloads); what->set_defaults(); D4X_QUEUE=what; D4X_QUEUE->qv.set_shift(D4X_QUEUE->qv.current_shift); prepare_buttons(); }; void d4xQsTree::select_row(GtkTreeIter *iter){ GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(store),iter, QROW_QUEUE,&val); d4xDownloadQueue *q=(d4xDownloadQueue *)g_value_peek_pointer(&val); g_value_unset(&val); if (q) switch_to(q); }; void d4xQsTree::init_menus() { static char *ui_info= " " " " " " " " " " " " " " " " " "; static GtkActionEntry entries[] = { { "Menu1", NULL, "Menu1" }, { "Menu2", NULL, "Menu2" }, { "create", GTK_STOCK_NEW, N_("Create new queue"), NULL, "create new queue", G_CALLBACK(_menu_event_nq_)}, { "createsub", GTK_STOCK_ADD, N_("Create new subqueue"), NULL, "create new subqueue", G_CALLBACK(_menu_event_nsq_)}, { "delete", GTK_STOCK_REMOVE, N_("Delete queue"), NULL, "delete queue", G_CALLBACK(_menu_event_remove_)}, { "props", GTK_STOCK_PREFERENCES, N_("Properties"), NULL, "modify queue's properties", G_CALLBACK(_menu_event_props_)} }; GtkActionGroup *action_group = gtk_action_group_new ("QueueActions"); gtk_action_group_set_translate_func(action_group,d4x_menu_translate_func,NULL,NULL); GtkUIManager *ui_manager=gtk_ui_manager_new (); gtk_action_group_add_actions (action_group, entries, G_N_ELEMENTS (entries), this); gtk_ui_manager_insert_action_group (ui_manager, action_group, 0); GError *error = NULL; if (!gtk_ui_manager_add_ui_from_string (ui_manager, ui_info, -1, &error)) { g_message ("building menus failed: %s", error->message); g_error_free (error); exit (EXIT_FAILURE); } menu1 = gtk_ui_manager_get_widget (ui_manager,"/Menu1"); menu2 = gtk_ui_manager_get_widget (ui_manager,"/Menu2"); }; void d4xQsTree::popup_menu(GdkEvent *event,int selected){ if (menu1==NULL) init_menus(); GdkEventButton *bevent=(GdkEventButton *)event; if (selected) gtk_menu_popup(GTK_MENU(menu1), (GtkWidget *)NULL, (GtkWidget *)NULL, (GtkMenuPositionFunc)NULL, (gpointer)NULL, bevent->button,bevent->time); else gtk_menu_popup(GTK_MENU(menu2), (GtkWidget *)NULL, (GtkWidget *)NULL, (GtkMenuPositionFunc)NULL, (gpointer)NULL, bevent->button,bevent->time); }; d4xDownloadQueue *d4xQsTree::selected(){ GtkTreeSelection *sel=gtk_tree_view_get_selection(view); GtkTreeIter iter; if (gtk_tree_selection_get_selected(sel,NULL,&iter)){ GValue val={0,}; gtk_tree_model_get_value(GTK_TREE_MODEL(store),&iter, QROW_QUEUE,&val); d4xDownloadQueue *q=(d4xDownloadQueue *)g_value_peek_pointer(&val); g_value_unset(&val); return(q); }; return(NULL); }; void d4xQsTree::delete_queue(){ d4xDownloadQueue *q=selected(); if (q==NULL) return; if (q->count() || q->child.count()) return; //remove all downloads if (q->prev==NULL && q->next==NULL && q->parent==NULL) return; //last queue if (D4X_QUEUE==q){ if (q->parent) switch_to(q->parent); else{ d4xDownloadQueue *sw=(d4xDownloadQueue *)(q->next?q->next:q->prev); switch_to(sw); }; }; if (q->parent) q->parent->subq_del(q); else D4X_QTREE.del(q); del(q); delete(q); }; static void _prefs_cancel_(GtkButton *button,d4xQsTree *qt){ qt->prefs_cancel(); }; static void _prefs_ok_(GtkWidget *widget,d4xQsTree *qt){ qt->prefs_ok(); }; static void _prefs_delete_(GtkWidget *window,GdkEvent *event,d4xQsTree *qt){ qt->prefs_cancel(); }; void d4xQsTree::prefs_init(){ d4xDownloadQueue *q=selected(); if (q==NULL) return; if (prefs){ gdk_window_show(prefs->window); return; }; GtkWidget *vbox=gtk_vbox_new(FALSE,5); prefs = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_wmclass(GTK_WINDOW(prefs), "D4X_QueuePrefs","D4X"); gtk_window_set_title(GTK_WINDOW (prefs), _("Queue properties")); gtk_window_set_position(GTK_WINDOW(prefs), GTK_WIN_POS_CENTER); gtk_container_set_border_width(GTK_CONTAINER(prefs),5); GtkWidget *prefs_limits_tbox=gtk_hbox_new(FALSE,5); GtkAdjustment *adj = (GtkAdjustment *) gtk_adjustment_new (q->MAX_ACTIVE, 0, 50.0, 1.0, 3.0, 0.0); // max_threads=my_gtk_entry_new_with_max_length(3,q->MAX_ACTIVE); max_threads = gtk_spin_button_new (adj, 0, 0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (max_threads), TRUE); gtk_box_pack_start(GTK_BOX(prefs_limits_tbox),max_threads,FALSE,FALSE,0); GtkWidget *prefs_limits_tlabel=gtk_label_new(_("Maximum active downloads")); gtk_box_pack_start(GTK_BOX(prefs_limits_tbox),prefs_limits_tlabel,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),prefs_limits_tbox,FALSE,FALSE,0); adj = (GtkAdjustment *) gtk_adjustment_new (q->SpdLmt, 0, 999999.0, 1.0, 3.0, 0.0); speed_limit = gtk_spin_button_new (adj,0,0); gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (speed_limit), TRUE); prefs_limits_tbox=gtk_hbox_new(FALSE,5); prefs_limits_tlabel=gtk_label_new(_("Speed limitation per queue (Bytes/sec, 0 unlimited)")); gtk_box_pack_start(GTK_BOX(prefs_limits_tbox),speed_limit,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(prefs_limits_tbox),prefs_limits_tlabel,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),prefs_limits_tbox,FALSE,FALSE,0); del_completed=gtk_check_button_new_with_label(_("Automatically delete completed downloads")); del_fataled=gtk_check_button_new_with_label(_("Automatically delete failed downloads")); GTK_TOGGLE_BUTTON(del_completed)->active=q->AUTODEL_COMPLETED; GTK_TOGGLE_BUTTON(del_fataled)->active=q->AUTODEL_FAILED; gtk_box_pack_start(GTK_BOX(vbox),del_completed,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),del_fataled,FALSE,FALSE,0); path_entry=my_gtk_filesel_new(ALL_HISTORIES[PATH_HISTORY]); MY_GTK_FILESEL(path_entry)->modal=GTK_WINDOW(prefs); MY_GTK_FILESEL(path_entry)->only_dirs=TRUE; text_to_combo(MY_GTK_FILESEL(path_entry)->combo,q->save_path.get()); GtkWidget *path_label=gtk_label_new(_("Default folder to save downloaded files")); GtkWidget *path_vbox=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(path_vbox),path_label,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(path_vbox),path_entry,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),path_vbox,FALSE,FALSE,0); GtkWidget *columns_hbox=gtk_hbox_new(FALSE,5); GtkWidget *columns_frame1=gtk_frame_new(_("Size format")); GtkWidget *columns_frame2=gtk_frame_new(_("Time format")); GtkWidget *columns_frame3=gtk_frame_new(_("Speed format")); gtk_container_set_border_width(GTK_CONTAINER(columns_frame1),5); gtk_container_set_border_width(GTK_CONTAINER(columns_frame2),5); gtk_container_set_border_width(GTK_CONTAINER(columns_frame3),5); GtkWidget *columns_vbox1=gtk_vbox_new(FALSE,0); GtkWidget *columns_vbox2=gtk_vbox_new(FALSE,0); GtkWidget *columns_vbox3=gtk_vbox_new(FALSE,0); columns_nums1=gtk_radio_button_new_with_label((GSList *)NULL,"123456"); gtk_box_pack_start(GTK_BOX(columns_vbox1),columns_nums1,FALSE,FALSE,0); GSList *columns_group1=gtk_radio_button_get_group(GTK_RADIO_BUTTON(columns_nums1)); columns_nums2=gtk_radio_button_new_with_label(columns_group1,"123 456"); gtk_box_pack_start(GTK_BOX(columns_vbox1),columns_nums2,FALSE,FALSE,0); columns_nums3=gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(columns_nums2)),"123K"); gtk_box_pack_start(GTK_BOX(columns_vbox1),columns_nums3,FALSE,FALSE,0); columns_nums4=gtk_radio_button_new_with_label( gtk_radio_button_get_group(GTK_RADIO_BUTTON(columns_nums3)),"123'456"); gtk_box_pack_start(GTK_BOX(columns_vbox1),columns_nums4,FALSE,FALSE,0); switch(q->NICE_DEC_DIGITALS) { case 1: { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_nums2),TRUE); break; }; case 2:{ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_nums3),TRUE); break; }; case 3: { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_nums4),TRUE); break; }; default: gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_nums1),TRUE); }; columns_time1=gtk_radio_button_new_with_label((GSList *)NULL,"12:34:56"); gtk_box_pack_start(GTK_BOX(columns_vbox2),columns_time1,FALSE,FALSE,0); GSList *columns_group2=gtk_radio_button_get_group(GTK_RADIO_BUTTON(columns_time1)); columns_time2=gtk_radio_button_new_with_label(columns_group2,"12:34"); gtk_box_pack_start(GTK_BOX(columns_vbox2),columns_time2,FALSE,FALSE,0); if (q->TIME_FORMAT) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_time2),TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_time1),TRUE); columns_speed1=gtk_radio_button_new_with_label((GSList *)NULL,"2134"); gtk_box_pack_start(GTK_BOX(columns_vbox3),columns_speed1,FALSE,FALSE,0); GSList *columns_group3=gtk_radio_button_get_group(GTK_RADIO_BUTTON(columns_speed1)); columns_speed2=gtk_radio_button_new_with_label(columns_group3,"2.1K"); gtk_box_pack_start(GTK_BOX(columns_vbox3),columns_speed2,FALSE,FALSE,0); if (q->SPEED_FORMAT) gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_speed2),TRUE); else gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(columns_speed1),TRUE); gtk_container_add(GTK_CONTAINER(columns_frame1),columns_vbox1); GtkWidget *columns_vbox11=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox11),columns_frame1,FALSE,FALSE,0); GtkWidget *columns_vbox12=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox11),columns_vbox12,FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(columns_frame2),columns_vbox2); GtkWidget *columns_vbox21=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox21),columns_frame2,FALSE,FALSE,0); GtkWidget *columns_vbox22=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox21),columns_vbox22,FALSE,FALSE,0); gtk_container_add(GTK_CONTAINER(columns_frame3),columns_vbox3); GtkWidget *columns_vbox31=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox31),columns_frame3,FALSE,FALSE,0); GtkWidget *columns_vbox32=gtk_vbox_new(FALSE,0); gtk_box_pack_start(GTK_BOX(columns_vbox31),columns_vbox32,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(columns_hbox),columns_vbox11,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(columns_hbox),columns_vbox21,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(columns_hbox),columns_vbox31,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),columns_hbox,FALSE,FALSE,0); GtkWidget *prefs_tbox=gtk_hbox_new(FALSE,5); name=gtk_entry_new(); text_to_combo(name,q->name.get()); GtkWidget *prefs_tlabel=gtk_label_new(_("Name of the queue")); gtk_box_pack_start(GTK_BOX(prefs_tbox),prefs_tlabel,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(prefs_tbox),name,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),prefs_tbox,FALSE,FALSE,0); GtkWidget *hbbox=gtk_hbutton_box_new(); gtk_box_set_spacing(GTK_BOX(hbbox),5); GtkWidget *ok_button=gtk_button_new_from_stock(GTK_STOCK_OK); GtkWidget *cancel_button=gtk_button_new_from_stock(GTK_STOCK_CANCEL); GTK_WIDGET_SET_FLAGS(ok_button,GTK_CAN_DEFAULT); GTK_WIDGET_SET_FLAGS(cancel_button,GTK_CAN_DEFAULT); gtk_box_pack_end(GTK_BOX(hbbox),ok_button,FALSE,FALSE,0); gtk_box_pack_end(GTK_BOX(hbbox),cancel_button,FALSE,FALSE,0); gtk_box_pack_start(GTK_BOX(vbox),hbbox,FALSE,FALSE,0); g_signal_connect(G_OBJECT(ok_button),"clicked", G_CALLBACK(_prefs_ok_),this); g_signal_connect(G_OBJECT(cancel_button),"clicked", G_CALLBACK(_prefs_cancel_),this); g_signal_connect(G_OBJECT(prefs),"delete_event", G_CALLBACK(_prefs_delete_),this); d4x_eschandler_init(prefs,this); gtk_container_add(GTK_CONTAINER(prefs),vbox); gtk_widget_show_all(prefs); gtk_window_set_default(GTK_WINDOW(prefs),ok_button); gtk_window_set_modal (GTK_WINDOW(prefs),TRUE); gtk_window_set_transient_for(GTK_WINDOW (prefs), GTK_WINDOW (MainWindow)); }; void d4xQsTree::prefs_cancel(){ gtk_widget_destroy(prefs); prefs=NULL; }; void d4xQsTree::prefs_ok(){ d4xDownloadQueue *q=selected(); q->NICE_DEC_DIGITALS=(GTK_TOGGLE_BUTTON(columns_nums2)->active?1:0)+ (GTK_TOGGLE_BUTTON(columns_nums3)->active?2:0)+ (GTK_TOGGLE_BUTTON(columns_nums4)->active?3:0); q->TIME_FORMAT=GTK_TOGGLE_BUTTON(columns_time2)->active; q->SPEED_FORMAT=GTK_TOGGLE_BUTTON(columns_speed2)->active; q->name.set(text_from_combo(name)); char *path=normalize_path_full(text_from_combo(MY_GTK_FILESEL(path_entry)->combo)); q->save_path.set(path); delete[] path; q->update(); // sscanf(gtk_entry_get_text(GTK_ENTRY(max_threads)),"%u",&(q->MAX_ACTIVE)); q->MAX_ACTIVE=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON (max_threads)); q->SpdLmt=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON (speed_limit)); if (q->MAX_ACTIVE<0) q->MAX_ACTIVE=0; if (q->MAX_ACTIVE>50) q->MAX_ACTIVE=50; q->AUTODEL_FAILED=GTK_TOGGLE_BUTTON(del_fataled)->active; q->AUTODEL_COMPLETED=GTK_TOGGLE_BUTTON(del_completed)->active; if (q->AUTODEL_COMPLETED) _aa_.del_completed(q); if (q->AUTODEL_FAILED) _aa_.del_fataled(q); if (q->SpdLmt){ _aa_.SpeedScheduler->insert(q); }else{ _aa_.SpeedScheduler->del(q); }; update(q); _aa_.try_to_run_wait(q); prefs_cancel(); }; void d4xQsTree::move_to(tDownload *where){ if (where->myowner==NULL || where->myowner->PAPA==NULL) return; switch_to(where->myowner->PAPA); D4X_QUEUE->qv.move_to(where); D4X_QUEUE->qv.select(where); };