diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 21:38:38 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-10 21:38:38 +0000 |
commit | 2e2851dc13d73352530dd4495c7e05603b2e520d (patch) | |
tree | 622b9cd8e5d32091c9aa9e4937b533975a40356c /deluge/plugins/AutoAdd/deluge_autoadd/data | |
parent | Initial commit. (diff) | |
download | deluge-2e2851dc13d73352530dd4495c7e05603b2e520d.tar.xz deluge-2e2851dc13d73352530dd4495c7e05603b2e520d.zip |
Adding upstream version 2.1.2~dev0+20240219.upstream/2.1.2_dev0+20240219upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'deluge/plugins/AutoAdd/deluge_autoadd/data')
6 files changed, 2758 insertions, 0 deletions
diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js new file mode 100644 index 0000000..e68fce3 --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd.js @@ -0,0 +1,226 @@ +/** + * Script: autoadd.js + * The client-side javascript code for the AutoAdd plugin. + * + * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com> + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Ext.ns('Deluge.ux.AutoAdd'); +Deluge.ux.AutoAdd.onClickFunctions = {}; + +Ext.ns('Deluge.ux.preferences'); + +/** + * @class Deluge.ux.preferences.AutoAddPage + * @extends Ext.Panel + */ +Deluge.ux.preferences.AutoAddPage = Ext.extend(Ext.Panel, { + title: _('AutoAdd'), + header: false, + layout: 'fit', + border: false, + watchdirs: {}, + + initComponent: function () { + Deluge.ux.preferences.AutoAddPage.superclass.initComponent.call(this); + + var autoAdd = this; + + this.list = new Ext.list.ListView({ + store: new Ext.data.JsonStore({ + fields: ['id', 'enabled', 'owner', 'path'], + }), + columns: [ + { + id: 'enabled', + header: _('Active'), + sortable: true, + dataIndex: 'enabled', + tpl: new Ext.XTemplate('{enabled:this.getCheckbox}', { + getCheckbox: function (checked, selected) { + Deluge.ux.AutoAdd.onClickFunctions[selected.id] = + function () { + if (selected.enabled) { + deluge.client.autoadd.disable_watchdir( + selected.id + ); + checked = false; + } else { + deluge.client.autoadd.enable_watchdir( + selected.id + ); + checked = true; + } + autoAdd.updateWatchDirs(); + }; + return ( + '<input id="enabled-' + + selected.id + + '" type="checkbox"' + + (checked ? ' checked' : '') + + ' onclick="Deluge.ux.AutoAdd.onClickFunctions[' + + selected.id + + ']()" />' + ); + }, + }), + width: 0.15, + }, + { + id: 'owner', + header: _('Owner'), + sortable: true, + dataIndex: 'owner', + width: 0.2, + }, + { + id: 'path', + header: _('Path'), + sortable: true, + dataIndex: 'path', + }, + ], + singleSelect: true, + autoExpandColumn: 'path', + }); + this.list.on('selectionchange', this.onSelectionChange, this); + + this.panel = this.add({ + items: [this.list], + bbar: { + items: [ + { + text: _('Add'), + iconCls: 'icon-add', + handler: this.onAddClick, + scope: this, + }, + { + text: _('Edit'), + iconCls: 'icon-edit', + handler: this.onEditClick, + scope: this, + disabled: true, + }, + '->', + { + text: _('Remove'), + iconCls: 'icon-remove', + handler: this.onRemoveClick, + scope: this, + disabled: true, + }, + ], + }, + }); + + this.on('show', this.onPreferencesShow, this); + }, + + updateWatchDirs: function () { + deluge.client.autoadd.get_watchdirs({ + success: function (watchdirs) { + this.watchdirs = watchdirs; + var watchdirsArray = []; + for (var id in watchdirs) { + if (watchdirs.hasOwnProperty(id)) { + var watchdir = {}; + watchdir['id'] = id; + watchdir['enabled'] = watchdirs[id].enabled; + watchdir['owner'] = + watchdirs[id].owner || 'localclient'; + watchdir['path'] = watchdirs[id].path; + + watchdirsArray.push(watchdir); + } + } + this.list.getStore().loadData(watchdirsArray); + }, + scope: this, + }); + }, + + onAddClick: function () { + if (!this.addWin) { + this.addWin = new Deluge.ux.AutoAdd.AddAutoAddCommandWindow(); + this.addWin.on( + 'watchdiradd', + function () { + this.updateWatchDirs(); + }, + this + ); + } + this.addWin.show(); + }, + + onEditClick: function () { + if (!this.editWin) { + this.editWin = new Deluge.ux.AutoAdd.EditAutoAddCommandWindow(); + this.editWin.on( + 'watchdiredit', + function () { + this.updateWatchDirs(); + }, + this + ); + } + var id = this.list.getSelectedRecords()[0].id; + this.editWin.show(id, this.watchdirs[id]); + }, + + onPreferencesShow: function () { + this.updateWatchDirs(); + }, + + onRemoveClick: function () { + var record = this.list.getSelectedRecords()[0]; + deluge.client.autoadd.remove(record.id, { + success: function () { + this.updateWatchDirs(); + }, + scope: this, + }); + }, + + onSelectionChange: function (dv, selections) { + if (selections.length) { + this.panel.getBottomToolbar().items.get(1).enable(); + this.panel.getBottomToolbar().items.get(3).enable(); + } else { + this.panel.getBottomToolbar().items.get(1).disable(); + this.panel.getBottomToolbar().items.get(3).disable(); + } + }, +}); + +Deluge.plugins.AutoAddPlugin = Ext.extend(Deluge.Plugin, { + name: 'AutoAdd', + + static: { + prefsPage: null, + }, + + onDisable: function () { + deluge.preferences.removePage(Deluge.plugins.AutoAddPlugin.prefsPage); + Deluge.plugins.AutoAddPlugin.prefsPage = null; + }, + + onEnable: function () { + /* + * Called for each of the JavaScript files. + * This will prevent adding unnecessary tabs to the preferences window. + */ + if (!Deluge.plugins.AutoAddPlugin.prefsPage) { + Deluge.plugins.AutoAddPlugin.prefsPage = deluge.preferences.addPage( + new Deluge.ux.preferences.AutoAddPage() + ); + } + }, +}); + +Deluge.registerPlugin('AutoAdd', Deluge.plugins.AutoAddPlugin); diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js new file mode 100644 index 0000000..7ec4448 --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.js @@ -0,0 +1,470 @@ +/** + * Script: autoadd.js + * The client-side javascript code for the AutoAdd plugin. + * + * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com> + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Ext.ns('Deluge.ux.AutoAdd'); + +/** + * @class Deluge.ux.AutoAdd.AutoAddWindowBase + * @extends Ext.Window + */ +Deluge.ux.AutoAdd.AutoAddWindowBase = Ext.extend(Ext.Window, { + width: 350, + autoHeight: true, + closeAction: 'hide', + + spin_ids: ['max_download_speed', 'max_upload_speed', 'stop_ratio'], + spin_int_ids: ['max_upload_slots', 'max_connections'], + chk_ids: [ + 'stop_at_ratio', + 'remove_at_ratio', + 'move_completed', + 'add_paused', + 'auto_managed', + 'queue_to_top', + ], + toggle_ids: [ + 'append_extension_toggle', + 'download_location_toggle', + 'label_toggle', + 'copy_torrent_toggle', + 'delete_copy_torrent_toggle', + 'seed_mode', + ], + + accounts: new Ext.data.ArrayStore({ + storeId: 'accountStore', + id: 0, + fields: [ + { + name: 'displayText', + type: 'string', + }, + ], + }), + labels: new Ext.data.ArrayStore({ + storeId: 'labelStore', + id: 0, + fields: [ + { + name: 'displayText', + type: 'string', + }, + ], + }), + + initComponent: function () { + Deluge.ux.AutoAdd.AutoAddWindowBase.superclass.initComponent.call(this); + this.addButton(_('Cancel'), this.onCancelClick, this); + + this.MainTab = new Deluge.ux.AutoAdd.AutoAddMainPanel(); + this.OptionsTab = new Deluge.ux.AutoAdd.AutoAddOptionsPanel(); + + this.form = this.add({ + xtype: 'form', + baseCls: 'x-plain', + bodyStyle: 'padding: 5px', + items: [ + { + xtype: 'tabpanel', + activeTab: 0, + items: [this.MainTab, this.OptionsTab], + }, + ], + }); + }, + + onCancelClick: function () { + this.hide(); + }, + + getOptions: function () { + var options = {}; + + options['enabled'] = Ext.getCmp('enabled').getValue(); + options['path'] = Ext.getCmp('path').getValue(); + options['download_location'] = + Ext.getCmp('download_location').getValue(); + options['move_completed_path'] = Ext.getCmp( + 'move_completed_path' + ).getValue(); + options['copy_torrent'] = Ext.getCmp('copy_torrent').getValue(); + + options['label'] = Ext.getCmp('label').getValue(); + options['append_extension'] = Ext.getCmp('append_extension').getValue(); + options['owner'] = Ext.getCmp('owner').getValue(); + + this.toggle_ids.forEach(function (toggle_id) { + options[toggle_id] = Ext.getCmp(toggle_id).getValue(); + }); + this.spin_ids.forEach(function (spin_id) { + options[spin_id] = Ext.getCmp(spin_id).getValue(); + options[spin_id + '_toggle'] = Ext.getCmp( + spin_id + '_toggle' + ).getValue(); + }); + this.spin_int_ids.forEach(function (spin_int_id) { + options[spin_int_id] = Ext.getCmp(spin_int_id).getValue(); + options[spin_int_id + '_toggle'] = Ext.getCmp( + spin_int_id + '_toggle' + ).getValue(); + }); + this.chk_ids.forEach(function (chk_id) { + options[chk_id] = Ext.getCmp(chk_id).getValue(); + options[chk_id + '_toggle'] = Ext.getCmp( + chk_id + '_toggle' + ).getValue(); + }); + + if ( + options['copy_torrent_toggle'] && + options['path'] === options['copy_torrent'] + ) { + throw _( + '"Watch Folder" directory and "Copy of .torrent' + + ' files to" directory cannot be the same!' + ); + } + + return options; + }, + + loadOptions: function (options) { + /* + * Populate all available options data to the UI + */ + var value; + + if (options === undefined) { + options = {}; + } + Ext.getCmp('enabled').setValue( + options['enabled'] !== undefined ? options['enabled'] : true + ); + Ext.getCmp('isnt_append_extension').setValue(true); + Ext.getCmp('append_extension_toggle').setValue( + options['append_extension_toggle'] !== undefined + ? options['append_extension_toggle'] + : false + ); + Ext.getCmp('append_extension').setValue( + options['append_extension'] !== undefined + ? options['append_extension'] + : '.added' + ); + Ext.getCmp('download_location_toggle').setValue( + options['download_location_toggle'] !== undefined + ? options['download_location_toggle'] + : false + ); + Ext.getCmp('copy_torrent_toggle').setValue( + options['copy_torrent_toggle'] !== undefined + ? options['copy_torrent_toggle'] + : false + ); + Ext.getCmp('delete_copy_torrent_toggle').setValue( + options['delete_copy_torrent_toggle'] !== undefined + ? options['delete_copy_torrent_toggle'] + : false + ); + + value = + options['seed_mode'] !== undefined ? options['seed_mode'] : false; + Ext.getCmp('seed_mode').setValue(value); + + this.accounts.removeAll(true); + this.labels.removeAll(true); + Ext.getCmp('owner').store = this.accounts; + Ext.getCmp('label').store = this.labels; + Ext.getCmp('label').setValue( + options['label'] !== undefined ? options['label'] : '' + ); + Ext.getCmp('label_toggle').setValue( + options['label_toggle'] !== undefined + ? options['label_toggle'] + : false + ); + + this.spin_ids.forEach(function (spin_id) { + Ext.getCmp(spin_id).setValue( + options[spin_id] !== undefined ? options[spin_id] : 0 + ); + Ext.getCmp(spin_id + '_toggle').setValue( + options[spin_id + '_toggle'] !== undefined + ? options[spin_id + '_toggle'] + : false + ); + }); + this.chk_ids.forEach(function (chk_id) { + Ext.getCmp(chk_id).setValue( + options[chk_id] !== undefined ? options[chk_id] : true + ); + Ext.getCmp(chk_id + '_toggle').setValue( + options[chk_id + '_toggle'] !== undefined + ? options[chk_id + '_toggle'] + : false + ); + }); + value = + options['add_paused'] !== undefined ? options['add_paused'] : true; + if (!value) { + Ext.getCmp('not_add_paused').setValue(true); + } + value = + options['queue_to_top'] !== undefined + ? options['queue_to_top'] + : true; + if (!value) { + Ext.getCmp('not_queue_to_top').setValue(true); + } + value = + options['auto_managed'] !== undefined + ? options['auto_managed'] + : true; + if (!value) { + Ext.getCmp('not_auto_managed').setValue(true); + } + [ + 'move_completed_path', + 'path', + 'download_location', + 'copy_torrent', + ].forEach(function (field) { + value = options[field] !== undefined ? options[field] : ''; + Ext.getCmp(field).setValue(value); + }); + + if (Object.keys(options).length === 0) { + deluge.client.core.get_config({ + success: function (config) { + var value; + Ext.getCmp('download_location').setValue( + options['download_location'] !== undefined + ? options['download_location'] + : config['download_location'] + ); + value = + options['move_completed_toggle'] !== undefined + ? options['move_completed_toggle'] + : config['move_completed']; + if (value) { + Ext.getCmp('move_completed_toggle').setValue( + options['move_completed_toggle'] !== undefined + ? options['move_completed_toggle'] + : false + ); + Ext.getCmp('move_completed_path').setValue( + options['move_completed_path'] !== undefined + ? options['move_completed_path'] + : config['move_completed_path'] + ); + } + value = + options['copy_torrent_toggle'] !== undefined + ? options['copy_torrent_toggle'] + : config['copy_torrent_file']; + if (value) { + Ext.getCmp('copy_torrent_toggle').setValue(true); + Ext.getCmp('copy_torrent').setValue( + options['copy_torrent'] !== undefined + ? options['copy_torrent'] + : config['torrentfiles_location'] + ); + } + value = + options['delete_copy_torrent_toggle'] !== undefined + ? options['copy_torrent_toggle'] + : config['del_copy_torrent_file']; + if (value) { + Ext.getCmp('delete_copy_torrent_toggle').setValue(true); + } + }, + }); + } + + deluge.client.core.get_enabled_plugins({ + success: function (plugins) { + if (plugins !== undefined && plugins.indexOf('Label') > -1) { + this.MainTab.LabelFset.setVisible(true); + deluge.client.label.get_labels({ + success: function (labels) { + for ( + var index = 0; + index < labels.length; + index++ + ) { + labels[index] = [labels[index]]; + } + this.labels.loadData(labels, false); + }, + failure: function (failure) { + console.error(failure); + }, + scope: this, + }); + } else { + this.MainTab.LabelFset.setVisible(false); + } + }, + scope: this, + }); + + var me = this; + + function on_accounts(accounts, owner) { + for (var index = 0; index < accounts.length; index++) { + accounts[index] = [accounts[index]['username']]; + } + me.accounts.loadData(accounts, false); + Ext.getCmp('owner').setValue(owner).enable(); + } + + function on_accounts_failure(failure) { + deluge.client.autoadd.get_auth_user({ + success: function (user) { + me.accounts.loadData([[user]], false); + Ext.getCmp('owner').setValue(user).disable(true); + }, + scope: this, + }); + } + + deluge.client.autoadd.is_admin_level({ + success: function (is_admin) { + if (is_admin) { + deluge.client.core.get_known_accounts({ + success: function (accounts) { + deluge.client.autoadd.get_auth_user({ + success: function (user) { + on_accounts( + accounts, + options['owner'] !== undefined + ? options['owner'] + : user + ); + }, + scope: this, + }); + }, + failure: on_accounts_failure, + scope: this, + }); + } else { + on_accounts_failure(null); + } + }, + scope: this, + }); + }, +}); + +/** + * @class Deluge.ux.AutoAdd.EditAutoAddCommandWindow + * @extends Deluge.ux.AutoAdd.AutoAddWindowBase + */ +Deluge.ux.AutoAdd.EditAutoAddCommandWindow = Ext.extend( + Deluge.ux.AutoAdd.AutoAddWindowBase, + { + title: _('Edit Watch Folder'), + + initComponent: function () { + Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.initComponent.call( + this + ); + this.addButton(_('Save'), this.onSaveClick, this); + this.addEvents({ + watchdiredit: true, + }); + }, + + show: function (watchdir_id, options) { + Deluge.ux.AutoAdd.EditAutoAddCommandWindow.superclass.show.call( + this + ); + this.watchdir_id = watchdir_id; + this.loadOptions(options); + }, + + onSaveClick: function () { + try { + var options = this.getOptions(); + deluge.client.autoadd.set_options(this.watchdir_id, options, { + success: function () { + this.fireEvent('watchdiredit', this, options); + }, + scope: this, + }); + } catch (err) { + Ext.Msg.show({ + title: _('Incompatible Option'), + msg: err, + buttons: Ext.Msg.OK, + scope: this, + }); + } + + this.hide(); + }, + } +); + +/** + * @class Deluge.ux.AutoAdd.AddAutoAddCommandWindow + * @extends Deluge.ux.AutoAdd.AutoAddWindowBase + */ +Deluge.ux.AutoAdd.AddAutoAddCommandWindow = Ext.extend( + Deluge.ux.AutoAdd.AutoAddWindowBase, + { + title: _('Add Watch Folder'), + + initComponent: function () { + Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.initComponent.call( + this + ); + this.addButton(_('Add'), this.onAddClick, this); + this.addEvents({ + watchdiradd: true, + }); + }, + + show: function () { + Deluge.ux.AutoAdd.AddAutoAddCommandWindow.superclass.show.call( + this + ); + this.loadOptions(); + }, + + onAddClick: function () { + var options = this.getOptions(); + deluge.client.autoadd.add(options, { + success: function () { + this.fireEvent('watchdiradd', this, options); + this.hide(); + }, + failure: function (err) { + const regex = /: (.*\n)\n?\]/m; + var error; + if ((error = regex.exec(err.error.message)) !== null) { + error = error[1]; + } else { + error = err.error.message; + } + Ext.Msg.show({ + title: _('Incompatible Option'), + msg: error, + buttons: Ext.Msg.OK, + scope: this, + }); + }, + scope: this, + }); + }, + } +); diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui new file mode 100644 index 0000000..f1870f1 --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options.ui @@ -0,0 +1,1322 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface> + <requires lib="gtk+" version="3.0"/> + <object class="GtkAdjustment" id="adjustment1"> + <property name="lower">-1</property> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment2"> + <property name="lower">-1</property> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment3"> + <property name="lower">-1</property> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment4"> + <property name="lower">-1</property> + <property name="upper">10000</property> + <property name="step_increment">1</property> + <property name="page_increment">10</property> + </object> + <object class="GtkAdjustment" id="adjustment5"> + <property name="upper">100</property> + <property name="value">2</property> + <property name="step_increment">0.10000000149</property> + <property name="page_increment">10</property> + </object> + <object class="GtkDialog" id="options_dialog"> + <property name="can_focus">False</property> + <property name="title" translatable="yes">Watch Folder Properties</property> + <property name="resizable">False</property> + <property name="modal">True</property> + <property name="type_hint">dialog</property> + <signal name="close" handler="on_options_dialog_close" swapped="no"/> + <child> + <placeholder/> + </child> + <child internal-child="vbox"> + <object class="GtkBox" id="dialog-vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child internal-child="action_area"> + <object class="GtkButtonBox" id="dialog-action_area1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="opts_cancel_button"> + <property name="label">gtk-cancel</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_opts_cancel" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="opts_add_button"> + <property name="label">gtk-add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_opts_add" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="opts_apply_button"> + <property name="label">gtk-apply</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_opts_apply" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="pack_type">end</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkNotebook" id="notebook1"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <child> + <object class="GtkBox" id="vbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox" id="vbox6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkBox" id="hbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkEntry" id="path_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="tooltip_text" translatable="yes">If a .torrent file is added to this directory, +it will be added to the session.</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFileChooserButton" id="path_chooser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="tooltip_text" translatable="yes">If a .torrent file is added to this directory, +it will be added to the session.</property> + <property name="action">select-folder</property> + <property name="title" translatable="yes">Select A Folder</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="enabled"> + <property name="label" translatable="yes">Enable this watch folder</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Watch Folder</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkAlignment" id="alignment2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="vbox7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkRadioButton" id="isnt_append_extension"> + <property name="label" translatable="yes">Delete .torrent after adding</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Once the torrent is added to the session, +the .torrent will be deleted.</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="hbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkRadioButton" id="append_extension_toggle"> + <property name="label" translatable="yes">Append extension after adding:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Once the torrent is added to the session, +an extension will be appended to the .torrent +and it will remain in the same directory.</property> + <property name="draw_indicator">True</property> + <property name="group">isnt_append_extension</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkEntry" id="append_extension"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + <property name="text" translatable="yes">.added</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkTable" id="table4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">2</property> + <property name="n_columns">2</property> + <child> + <object class="GtkRadioButton" id="copy_torrent_toggle"> + <property name="label" translatable="yes">Copy of .torrent files to:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">Once the torrent is added to the session, +the .torrent will copied to the chosen directory +and deleted from the watch folder.</property> + <property name="draw_indicator">True</property> + <property name="group">isnt_append_extension</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + </child> + <child> + <object class="GtkBox" id="hbox7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkEntry" id="copy_torrent_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">•</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFileChooserButton" id="copy_torrent_chooser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action">select-folder</property> + <property name="title" translatable="yes">Select A Folder</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="delete_copy_torrent_toggle"> + <property name="label" translatable="yes">Delete copy of torrent file on remove</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">Once the torrent is deleted from the session, +also delete the .torrent file used to add it.</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_padding">15</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Torrent File Action</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox" id="vbox3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkCheckButton" id="download_location_toggle"> + <property name="label" translatable="yes">Set download folder</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="tooltip_text" translatable="yes">This folder will be where the torrent data is downloaded to.</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="hbox4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkEntry" id="download_location_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFileChooserButton" id="download_location_chooser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action">select-folder</property> + <property name="title" translatable="yes">Select A Folder</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label7"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Download Folder</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox" id="vbox4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkCheckButton" id="move_completed_toggle"> + <property name="label" translatable="yes">Set move completed folder</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkBox" id="hbox5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkEntry" id="move_completed_path_entry"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFileChooserButton" id="move_completed_path_chooser"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="action">select-folder</property> + <property name="title" translatable="yes">Select A Folder</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="move_completed"> + <property name="sensitive">False</property> + <property name="can_focus">False</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label8"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Move Completed</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">False</property> + <property name="position">4</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="label_frame"> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkBox" id="hbox11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckButton" id="label_toggle"> + <property name="label" translatable="yes">Label: </property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkComboBox" id="label"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_entry">True</property> + <child internal-child="entry"> + <object class="GtkEntry" id="combobox-entry1"> + <property name="can_focus">False</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label17"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Label</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">5</property> + </packing> + </child> + </object> + </child> + <child type="tab"> + <object class="GtkLabel" id="label4"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Main</property> + </object> + <packing> + <property name="tab_fill">False</property> + </packing> + </child> + <child> + <object class="GtkBox" id="vbox5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">6</property> + <property name="spacing">5</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="OwnerFrame"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkComboBox" id="OwnerCombobox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="has_tooltip">True</property> + <property name="tooltip_text" translatable="yes">The user selected here will be the owner of the torrent.</property> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label3"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Owner</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment11"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkTable" id="table1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">3</property> + <property name="n_rows">4</property> + <property name="n_columns">3</property> + <property name="column_spacing">2</property> + <property name="row_spacing">4</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkCheckButton" id="max_upload_speed_toggle"> + <property name="label" translatable="yes">Max Upload Speed:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="max_connections_toggle"> + <property name="label" translatable="yes">Max Connections:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="max_upload_slots_toggle"> + <property name="label" translatable="yes">Max Upload Slots:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="max_download_speed"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">adjustment1</property> + <property name="climb_rate">1</property> + <property name="digits">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="max_upload_speed"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">adjustment2</property> + <property name="climb_rate">1</property> + <property name="digits">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="max_connections"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">adjustment3</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="max_upload_slots"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="adjustment">adjustment4</property> + <property name="climb_rate">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkLabel" id="label14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">KiB/s</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkLabel" id="label15"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xpad">5</property> + <property name="label" translatable="yes">KiB/s</property> + <property name="xalign">0</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="max_download_speed_toggle"> + <property name="label" translatable="yes">Max Download Speed:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Bandwidth</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkFrame" id="frame6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkAlignment" id="alignment12"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="left_padding">12</property> + <child> + <object class="GtkTable" id="table2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="n_rows">6</property> + <property name="n_columns">3</property> + <property name="column_spacing">2</property> + <property name="row_spacing">4</property> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkAlignment" id="alignment13"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkCheckButton" id="stop_at_ratio_toggle"> + <property name="label" translatable="yes">Stop seed at ratio:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + </child> + </object> + <packing> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkAlignment" id="alignment14"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xalign">0</property> + <property name="yalign">0</property> + <property name="left_padding">12</property> + <child> + <object class="GtkCheckButton" id="remove_at_ratio"> + <property name="label" translatable="yes">Remove at ratio</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + </child> + </object> + <packing> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="auto_managed_toggle"> + <property name="label" translatable="yes">Auto Managed:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="remove_at_ratio_toggle"> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="stop_ratio_toggle"> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkSpinButton" id="stop_ratio"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="invisible_char">●</property> + <property name="adjustment">adjustment5</property> + <property name="climb_rate">1</property> + <property name="digits">1</property> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="y_options"/> + </packing> + </child> + <child> + <object class="GtkBox" id="auto_managed_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkRadioButton" id="auto_managed"> + <property name="label">gtk-yes</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="isnt_auto_managed"> + <property name="label">gtk-no</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <property name="draw_indicator">True</property> + <property name="group">auto_managed</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options">GTK_FILL</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="stop_at_ratio"> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="left_attach">2</property> + <property name="right_attach">3</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + <child> + <placeholder/> + </child> + <child> + <object class="GtkCheckButton" id="add_paused_toggle"> + <property name="label" translatable="yes">Add Paused:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + </child> + <child> + <object class="GtkBox" id="add_paused_box"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkRadioButton" id="add_paused"> + <property name="label">gtk-yes</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="isnt_add_paused"> + <property name="label">gtk-no</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_stock">True</property> + <property name="draw_indicator">True</property> + <property name="group">add_paused</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="queue_to_top_toggle"> + <property name="label" translatable="yes">Queue to:</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_toggle_toggled" swapped="no"/> + </object> + <packing> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkBox" id="hbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <child> + <object class="GtkRadioButton" id="queue_to_top"> + <property name="label" translatable="yes">Top</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="active">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkRadioButton" id="isnt_queue_to_top"> + <property name="label" translatable="yes">Bottom</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="draw_indicator">True</property> + <property name="group">queue_to_top</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + </packing> + </child> + <child> + <object class="GtkCheckButton" id="seed_mode"> + <property name="label" translatable="yes">Skip File Hash Check</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="use_underline">True</property> + <property name="draw_indicator">True</property> + </object> + <packing> + <property name="top_attach">5</property> + <property name="bottom_attach">6</property> + <property name="x_options">GTK_FILL</property> + <property name="y_options"/> + </packing> + </child> + </object> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label16"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Queue</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="position">1</property> + </packing> + </child> + <child type="tab"> + <object class="GtkLabel" id="label5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Options</property> + </object> + <packing> + <property name="position">1</property> + <property name="tab_fill">False</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHButtonBox" id="hbuttonbox2"> + <property name="visible">True</property> + <property name="can_focus">False</property> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + <action-widgets> + <action-widget response="0">opts_cancel_button</action-widget> + <action-widget response="0">opts_add_button</action-widget> + <action-widget response="0">opts_apply_button</action-widget> + </action-widgets> + </object> +</interface> diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js new file mode 100644 index 0000000..f685ff2 --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/main_tab.js @@ -0,0 +1,304 @@ +/** + * Script: main_tab.js + * The client-side javascript code for the AutoAdd plugin. + * + * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com> + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Ext.ns('Deluge.ux.AutoAdd'); + +/** + * @class Deluge.ux.AutoAdd.AutoAddMainPanel + * @extends Ext.Panel + */ +Deluge.ux.AutoAdd.AutoAddMainPanel = Ext.extend(Ext.Panel, { + id: 'main_tab_panel', + title: _('Main'), + + initComponent: function () { + Deluge.ux.AutoAdd.AutoAddMainPanel.superclass.initComponent.call(this); + this.watchFolderFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Watch Folder'), + defaultType: 'textfield', + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + width: '85%', + labelWidth: 1, + items: [ + { + xtype: 'textfield', + id: 'path', + hideLabel: true, + width: 304, + }, + { + hideLabel: true, + id: 'enabled', + xtype: 'checkbox', + boxLabel: _('Enable this watch folder'), + checked: true, + }, + ], + }); + + this.torrentActionFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Torrent File Action'), + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + width: '85%', + labelWidth: 1, + defaults: { + style: 'margin-bottom: 2px', + }, + items: [ + { + xtype: 'radiogroup', + columns: 1, + items: [ + { + xtype: 'radio', + name: 'torrent_action', + id: 'isnt_append_extension', + boxLabel: _('Delete .torrent after adding'), + checked: true, + hideLabel: true, + listeners: { + check: function (cb, newValue) { + if (newValue) { + Ext.getCmp( + 'append_extension' + ).setDisabled(newValue); + Ext.getCmp('copy_torrent').setDisabled( + newValue + ); + Ext.getCmp( + 'delete_copy_torrent_toggle' + ).setDisabled(newValue); + } + }, + }, + }, + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + xtype: 'radio', + name: 'torrent_action', + id: 'append_extension_toggle', + boxLabel: _( + 'Append extension after adding:' + ), + hideLabel: true, + listeners: { + check: function (cb, newValue) { + if (newValue) { + Ext.getCmp( + 'append_extension' + ).setDisabled(!newValue); + Ext.getCmp( + 'copy_torrent' + ).setDisabled(newValue); + Ext.getCmp( + 'delete_copy_torrent_toggle' + ).setDisabled(newValue); + } + }, + }, + }, + { + xtype: 'textfield', + id: 'append_extension', + hideLabel: true, + disabled: true, + style: 'margin-left: 2px', + width: 112, + }, + ], + }, + { + xtype: 'container', + hideLabel: true, + items: [ + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + xtype: 'radio', + name: 'torrent_action', + id: 'copy_torrent_toggle', + boxLabel: _( + 'Copy of .torrent files to:' + ), + hideLabel: true, + listeners: { + check: function (cb, newValue) { + if (newValue) { + Ext.getCmp( + 'append_extension' + ).setDisabled(newValue); + Ext.getCmp( + 'copy_torrent' + ).setDisabled( + !newValue + ); + Ext.getCmp( + 'delete_copy_torrent_toggle' + ).setDisabled( + !newValue + ); + } + }, + }, + }, + { + xtype: 'textfield', + id: 'copy_torrent', + hideLabel: true, + disabled: true, + style: 'margin-left: 2px', + width: 152, + }, + ], + }, + { + xtype: 'checkbox', + id: 'delete_copy_torrent_toggle', + boxLabel: _( + 'Delete copy of torrent file on remove' + ), + style: 'margin-left: 10px', + disabled: true, + }, + ], + }, + ], + }, + ], + }); + + this.downloadFolderFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Download Folder'), + defaultType: 'textfield', + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + width: '85%', + labelWidth: 1, + items: [ + { + hideLabel: true, + id: 'download_location_toggle', + xtype: 'checkbox', + boxLabel: _('Set download folder'), + listeners: { + check: function (cb, checked) { + Ext.getCmp('download_location').setDisabled( + !checked + ); + }, + }, + }, + { + xtype: 'textfield', + id: 'download_location', + hideLabel: true, + width: 304, + disabled: true, + }, + ], + }); + + this.moveCompletedFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Move Completed'), + defaultType: 'textfield', + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + width: '85%', + labelWidth: 1, + items: [ + { + hideLabel: true, + id: 'move_completed_toggle', + xtype: 'checkbox', + boxLabel: _('Set move completed folder'), + listeners: { + check: function (cb, checked) { + Ext.getCmp('move_completed_path').setDisabled( + !checked + ); + }, + }, + }, + { + xtype: 'textfield', + id: 'move_completed_path', + hideLabel: true, + width: 304, + disabled: true, + }, + ], + }); + + this.LabelFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Label'), + defaultType: 'textfield', + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 3px;', + //width: '85%', + labelWidth: 1, + //hidden: true, + items: [ + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + hashLabel: false, + id: 'label_toggle', + xtype: 'checkbox', + boxLabel: _('Label:'), + listeners: { + check: function (cb, checked) { + Ext.getCmp('label').setDisabled(!checked); + }, + }, + }, + { + xtype: 'combo', + id: 'label', + hideLabel: true, + //width: 220, + width: 254, + disabled: true, + style: 'margin-left: 2px', + mode: 'local', + valueField: 'displayText', + displayField: 'displayText', + }, + ], + }, + ], + }); + + this.add([ + this.watchFolderFset, + this.torrentActionFset, + this.downloadFolderFset, + this.moveCompletedFset, + this.LabelFset, + ]); + }, +}); diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js new file mode 100644 index 0000000..4ce030e --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/autoadd_options/options_tab.js @@ -0,0 +1,302 @@ +/** + * Script: options_tab.js + * The client-side javascript code for the AutoAdd plugin. + * + * Copyright (C) 2009 GazpachoKing <chase.sterling@gmail.com> + * + * This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with + * the additional special exception to link portions of this program with the OpenSSL library. + * See LICENSE for more details. + */ + +Ext.ns('Deluge.ux.AutoAdd'); + +/** + * @class Deluge.ux.AutoAdd.AutoAddOptionsPanel + * @extends Ext.Panel + */ +Deluge.ux.AutoAdd.AutoAddOptionsPanel = Ext.extend(Ext.Panel, { + id: 'options_tab_panel', + title: _('Options'), + + initComponent: function () { + Deluge.ux.AutoAdd.AutoAddOptionsPanel.superclass.initComponent.call( + this + ); + var maxDownload = { + idCheckbox: 'max_download_speed_toggle', + labelCheckbox: 'Max Download Speed (KiB/s):', + idSpinner: 'max_download_speed', + decimalPrecision: 1, + }; + var maxUploadSpeed = { + idCheckbox: 'max_upload_speed_toggle', + labelCheckbox: 'Max upload Speed (KiB/s):', + idSpinner: 'max_upload_speed', + decimalPrecision: 1, + }; + var maxConnections = { + idCheckbox: 'max_connections_toggle', + labelCheckbox: 'Max Connections::', + idSpinner: 'max_connections', + decimalPrecision: 0, + }; + var maxUploadSlots = { + idCheckbox: 'max_upload_slots_toggle', + labelCheckbox: 'Max Upload Slots:', + idSpinner: 'max_upload_slots', + decimalPrecision: 0, + }; + // queue data + var addPause = { + idCheckbox: 'add_paused_toggle', + labelCheckbox: 'Add Pause:', + nameRadio: 'add_paused', + labelRadio: { + yes: 'Yes', + no: 'No', + }, + }; + var queueTo = { + idCheckbox: 'queue_to_top_toggle', + labelCheckbox: 'Queue To:', + nameRadio: 'queue_to_top', + labelRadio: { + yes: 'Top', + no: 'Bottom', + }, + }; + var autoManaged = { + idCheckbox: 'auto_managed_toggle', + labelCheckbox: 'Auto Managed:', + nameRadio: 'auto_managed', + labelRadio: { + yes: 'Yes', + no: 'No', + }, + }; + + this.ownerFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Owner'), + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + //width: '85%', + labelWidth: 1, + items: [ + { + xtype: 'combo', + id: 'owner', + hideLabel: true, + width: 312, + mode: 'local', + valueField: 'displayText', + displayField: 'displayText', + }, + ], + }); + + this.bandwidthFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Bandwidth'), + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + //width: '85%', + labelWidth: 1, + defaults: { + style: 'margin-bottom: 5px', + }, + }); + this.bandwidthFset.add(this._getBandwidthContainer(maxDownload)); + this.bandwidthFset.add(this._getBandwidthContainer(maxUploadSpeed)); + this.bandwidthFset.add(this._getBandwidthContainer(maxConnections)); + this.bandwidthFset.add(this._getBandwidthContainer(maxUploadSlots)); + + this.queueFset = new Ext.form.FieldSet({ + xtype: 'fieldset', + border: false, + title: _('Queue'), + style: 'margin-top: 3px; margin-bottom: 0px; padding-bottom: 0px;', + //width: '85%', + labelWidth: 1, + defaults: { + style: 'margin-bottom: 5px', + }, + items: [ + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + }, + ], + }); + this.queueFset.add(this._getQueueContainer(addPause)); + this.queueFset.add(this._getQueueContainer(queueTo)); + this.queueFset.add(this._getQueueContainer(autoManaged)); + this.queueFset.add({ + xtype: 'container', + hideLabel: true, + items: [ + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + xtype: 'checkbox', + id: 'stop_at_ratio_toggle', + boxLabel: _('Stop seed at ratio:'), + hideLabel: true, + width: 175, + listeners: { + check: function (cb, checked) { + Ext.getCmp('stop_ratio').setDisabled( + !checked + ); + Ext.getCmp('remove_at_ratio').setDisabled( + !checked + ); + }, + }, + }, + { + xtype: 'spinnerfield', + id: 'stop_ratio', + hideLabel: true, + disabled: true, + value: 0.0, + minValue: 0.0, + maxValue: 100.0, + decimalPrecision: 1, + incrementValue: 0.1, + style: 'margin-left: 2px', + width: 100, + }, + ], + }, + { + xtype: 'container', + layout: 'hbox', + hideLabel: true, + style: 'margin-left: 10px', + items: [ + { + xtype: 'checkbox', + id: 'remove_at_ratio', + boxLabel: _('Remove at ratio'), + disabled: true, + checked: true, + }, + { + xtype: 'checkbox', + id: 'remove_at_ratio_toggle', + disabled: true, + checked: true, + hidden: true, + }, + { + xtype: 'checkbox', + id: 'stop_ratio_toggle', + disabled: true, + checked: true, + hidden: true, + }, + { + xtype: 'checkbox', + id: 'stop_ratio_toggle', + disabled: true, + checked: true, + hidden: true, + }, + ], + }, + ], + }); + this.queueFset.add({ + xtype: 'checkbox', + id: 'seed_mode', + boxLabel: _('Skip File Hash Check'), + hideLabel: true, + width: 175, + }); + + this.add([this.ownerFset, this.bandwidthFset, this.queueFset]); + }, + + _getBandwidthContainer: function (values) { + return new Ext.Container({ + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + xtype: 'checkbox', + hideLabel: true, + id: values.idCheckbox, + boxLabel: _(values.labelCheckbox), + width: 175, + listeners: { + check: function (cb, checked) { + Ext.getCmp(values.idSpinner).setDisabled(!checked); + }, + }, + }, + { + xtype: 'spinnerfield', + id: values.idSpinner, + hideLabel: true, + disabled: true, + minValue: -1, + maxValue: 10000, + value: 0.0, + decimalPrecision: values.decimalPrecision, + style: 'margin-left: 2px', + width: 100, + }, + ], + }); + }, + + _getQueueContainer: function (values) { + return new Ext.Container({ + xtype: 'container', + layout: 'hbox', + hideLabel: true, + items: [ + { + xtype: 'checkbox', + hideLabel: true, + id: values.idCheckbox, + boxLabel: _(values.labelCheckbox), + width: 175, + listeners: { + check: function (cb, checked) { + Ext.getCmp(values.nameRadio).setDisabled(!checked); + Ext.getCmp('not_' + values.nameRadio).setDisabled( + !checked + ); + }, + }, + }, + { + xtype: 'radio', + name: values.nameRadio, + id: values.nameRadio, + boxLabel: _(values.labelRadio.yes), + hideLabel: true, + checked: true, + disabled: true, + width: 50, + }, + { + xtype: 'radio', + name: values.nameRadio, + id: 'not_' + values.nameRadio, + boxLabel: _(values.labelRadio.no), + hideLabel: true, + disabled: true, + }, + ], + }); + }, +}); diff --git a/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui b/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui new file mode 100644 index 0000000..0e645d3 --- /dev/null +++ b/deluge/plugins/AutoAdd/deluge_autoadd/data/config.ui @@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Generated with glade 3.22.1 --> +<interface> + <requires lib="gtk+" version="3.0"/> + <object class="GtkWindow" id="prefs_window"> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkBox" id="hbox9"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <placeholder/> + </child> + <child> + <object class="GtkAlignment" id="prefs_box_1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkBox" id="prefs_box"> + <property name="width_request">340</property> + <property name="height_request">390</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="border_width">3</property> + <property name="orientation">vertical</property> + <child> + <object class="GtkFrame" id="frame1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label_xalign">0</property> + <property name="shadow_type">none</property> + <child> + <object class="GtkBox" id="watchdirs_vbox"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="homogeneous">True</property> + <property name="orientation">vertical</property> + <child> + <placeholder/> + </child> + </object> + </child> + <child type="label"> + <object class="GtkLabel" id="label1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes"><b>Watch Folders:</b></property> + <property name="use_markup">True</property> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkHButtonBox" id="hbuttonbox1"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <child> + <object class="GtkButton" id="add_button"> + <property name="label">gtk-add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_add_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="remove_button"> + <property name="label">gtk-remove</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_remove_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> + <object class="GtkButton" id="edit_button"> + <property name="label">gtk-edit</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + <signal name="clicked" handler="on_edit_button_clicked" swapped="no"/> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">True</property> + <property name="fill">True</property> + <property name="position">1</property> + </packing> + </child> + </object> + </child> + </object> +</interface> |