extern GValue *ghb_queue_edit_settings;
static gchar *last_scan_file = NULL;
+static void
+show_scan_progress(signal_user_data_t *ud)
+{
+ GtkProgressBar *progress;
+ GtkLabel *label;
+
+ progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "scan_prog"));
+ gtk_progress_bar_set_fraction (progress, 0);
+ gtk_widget_show(GTK_WIDGET(progress));
+
+ label = GTK_LABEL(GHB_WIDGET(ud->builder, "source_title"));
+ gtk_label_set_text( label, "Scanning ..." );
+}
+
void
ghb_do_scan(
signal_user_data_t *ud,
ghb_settings_set_string(ud->settings, "source", filename);
if (update_source_label(ud, filename))
{
- GtkProgressBar *progress;
- progress = GTK_PROGRESS_BAR(GHB_WIDGET(ud->builder, "progressbar"));
gchar *path;
+ gint preview_count;
+
+ show_scan_progress(ud);
path = ghb_settings_get_string( ud->settings, "source");
- gtk_progress_bar_set_fraction (progress, 0);
- gtk_progress_bar_set_text (progress, "Scanning ...");
prune_logs(ud);
- gint preview_count;
+
preview_count = ghb_settings_get_int(ud->settings, "preview_count");
ghb_backend_scan(path, titlenum, preview_count);
g_free(path);
g_free(path);
}
+static gint
+queue_pending_count(GValue *queue)
+{
+ gint nn, ii, count;
+ GValue *js;
+ gint status;
+
+ nn = 0;
+ count = ghb_array_len(queue);
+ for (ii = 0; ii < count; ii++)
+ {
+
+ js = ghb_array_get_nth(queue, ii);
+ status = ghb_settings_get_int(js, "job_status");
+ if (status == GHB_QUEUE_PENDING)
+ {
+ nn++;
+ }
+ }
+ return nn;
+}
+
+void
+ghb_update_pending(signal_user_data_t *ud)
+{
+ GtkLabel *label;
+ gint pending;
+ gchar *str;
+
+ label = GTK_LABEL(GHB_WIDGET(ud->builder, "pending_status"));
+ pending = queue_pending_count(ud->queue);
+ str = g_strdup_printf("%d encode(s) pending in the queue", pending);
+ gtk_label_set_text(label, str);
+ g_free(str);
+}
+
GValue*
ghb_start_next_job(signal_user_data_t *ud, gboolean find_first)
{
gint count, ii, jj;
GValue *js;
gint status;
+ GtkWidget *prog;
g_debug("start_next_job");
+ prog = GHB_WIDGET(ud->builder, "progressbar");
+ gtk_widget_show(prog);
+
count = ghb_array_len(ud->queue);
if (find_first)
{ // Start the first pending item in the queue
current = ii;
ghb_inhibit_gpm();
queue_scan(ud, js);
+ ghb_update_pending(ud);
return js;
}
}
current = jj;
ghb_inhibit_gpm();
queue_scan(ud, js);
+ ghb_update_pending(ud);
return js;
}
}
current = ii;
ghb_inhibit_gpm();
queue_scan(ud, js);
+ ghb_update_pending(ud);
return js;
}
}
// Nothing found
ghb_uninhibit_gpm();
ghb_notify_done(ud);
+ ghb_update_pending(ud);
+ gtk_widget_hide(prog);
return NULL;
}
gint qcount;
gint index;
GValue *js;
+ gboolean subtitle_scan = FALSE;
- if (status->job_count > 1)
- {
- task_str = g_strdup_printf("pass %d of %d, ",
- status->job_cur, status->job_count);
- }
- else
- {
- task_str = g_strdup("");
- }
qcount = ghb_array_len(ud->queue);
if (qcount > 1)
{
index = find_queue_job(ud->queue, status->unique_id, &js);
job_str = g_strdup_printf("job %d of %d, ", index+1, qcount);
+ subtitle_scan = ghb_settings_get_boolean(js, "subtitle_scan");
}
else
{
job_str = g_strdup("");
}
+ if (status->job_count > 1)
+ {
+ if (status->job_cur == 1 && subtitle_scan)
+ {
+ task_str = g_strdup_printf("pass %d (subtitle scan) of %d, ",
+ status->job_cur, status->job_count);
+ }
+ else
+ {
+ task_str = g_strdup_printf("pass %d of %d, ",
+ status->job_cur, status->job_count);
+ }
+ }
+ else
+ {
+ task_str = g_strdup("");
+ }
if(status->seconds > -1)
{
status_str= g_strdup_printf(
ghb_status_t status;
gchar *status_str;
GtkProgressBar *progress;
+ GtkLabel *work_status;
gint titleindex;
GValue *js;
gint index;
ghb_track_status();
ghb_get_status(&status);
progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar"));
+ work_status = GTK_LABEL(GHB_WIDGET (ud->builder, "work_status"));
if (status.scan.state == GHB_STATE_IDLE &&
status.queue.state == GHB_STATE_IDLE)
{
// Then handle the status of the queue
if (status.scan.state & GHB_STATE_SCANNING)
{
+ GtkProgressBar *scan_prog;
+ GtkLabel *label;
+
+ scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog"));
+ label = GTK_LABEL(GHB_WIDGET (ud->builder, "source_title"));
+
if (status.scan.title_cur == 0)
{
status_str = g_strdup ("Scanning...");
status_str = g_strdup_printf ("Scanning title %d of %d...",
status.scan.title_cur, status.scan.title_count );
}
- gtk_progress_bar_set_text (progress, status_str);
+ gtk_label_set_text (label, status_str);
g_free(status_str);
if (status.scan.title_count > 0)
{
- gtk_progress_bar_set_fraction (progress,
+ gtk_progress_bar_set_fraction (scan_prog,
(gdouble)status.scan.title_cur / status.scan.title_count);
}
}
else if (status.scan.state & GHB_STATE_SCANDONE)
{
- status_str = g_strdup_printf ("Scan done");
- gtk_progress_bar_set_text (progress, status_str);
- g_free(status_str);
- gtk_progress_bar_set_fraction (progress, 1.0);
+ gchar *source;
+ GtkProgressBar *scan_prog;
+ GtkLabel *label;
+
+ source = ghb_settings_get_string(ud->settings, "source");
+ update_source_label(ud, source);
+
+ scan_prog = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "scan_prog"));
+ gtk_progress_bar_set_fraction (scan_prog, 1.0);
+ gtk_widget_hide(GTK_WIDGET(scan_prog));
ghb_title_info_t tinfo;
titleindex = ghb_longest_title();
ghb_ui_update(ud, "title", ghb_int64_value(titleindex));
+ label = GTK_LABEL(GHB_WIDGET (ud->builder, "source_title"));
// Are there really any titles.
if (!ghb_get_title_info(&tinfo, titleindex))
{
- GtkProgressBar *progress;
- progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar"));
- gtk_progress_bar_set_fraction (progress, 0);
- gtk_progress_bar_set_text (progress, "No Source");
+ gtk_label_set_text(label, "None");
}
ghb_clear_scan_state(GHB_STATE_SCANDONE);
ghb_queue_buttons_grey(ud, work_started);
ghb_queue_edit_settings = NULL;
}
}
- else if (status.queue.state & GHB_STATE_SCANNING)
+
+ if (status.queue.state & GHB_STATE_SCANNING)
{
- status_str = g_strdup_printf ("Scanning ...");
- gtk_progress_bar_set_text (progress, status_str);
- g_free(status_str);
+ // This needs to be in scanning and working since scanning
+ // happens fast enough that it can be missed
+ if (!work_started)
+ {
+ work_started = TRUE;
+ ghb_queue_buttons_grey(ud, TRUE);
+ }
+ gtk_label_set_text (work_status, "Scanning ...");
gtk_progress_bar_set_fraction (progress, 0);
}
else if (status.queue.state & GHB_STATE_SCANDONE)
ghb_clear_queue_state(GHB_STATE_SCANDONE);
usleep(2000000);
submit_job(ud->current_job);
+ ghb_update_pending(ud);
}
else if (status.queue.state & GHB_STATE_PAUSED)
{
- status_str = g_strdup_printf ("Paused");
- gtk_progress_bar_set_text (progress, status_str);
- g_free(status_str);
+ gtk_label_set_text (work_status, "Paused");
}
else if (status.queue.state & GHB_STATE_WORKING)
{
+ // This needs to be in scanning and working since scanning
+ // happens fast enough that it can be missed
+ if (!work_started)
+ {
+ work_started = TRUE;
+ ghb_queue_buttons_grey(ud, TRUE);
+ }
+ index = find_queue_job(ud->queue, status.queue.unique_id, &js);
+ if (status.queue.unique_id != 0 && index >= 0)
+ {
+ gchar working_icon[] = "hb-working0";
+ working_icon[10] = '0' + working;
+ working = (working+1) % 6;
+ treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list"));
+ store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
+ gchar *path = g_strdup_printf ("%d", index);
+ if (gtk_tree_model_get_iter_from_string(
+ GTK_TREE_MODEL(store), &iter, path))
+ {
+ gtk_tree_store_set(store, &iter, 0, working_icon, -1);
+ }
+ g_free(path);
+ }
+ GtkLabel *label;
+ gchar *status_str;
+
status_str = working_status_string(ud, &status.queue);
- gtk_progress_bar_set_text (progress, status_str);
+ label = GTK_LABEL(GHB_WIDGET(ud->builder, "queue_status"));
+ gtk_label_set_text (label, status_str);
+#if !GTK_CHECK_VERSION(2, 16, 0)
+ GtkStatusIcon *si;
+
+ si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
+ gtk_status_icon_set_tooltip(si, status_str);
+#endif
+ gtk_label_set_text (work_status, status_str);
gtk_progress_bar_set_fraction (progress, status.queue.progress);
g_free(status_str);
}
switch( status.queue.error )
{
case GHB_ERROR_NONE:
- gtk_progress_bar_set_text( progress, "Rip done!" );
+ gtk_label_set_text (work_status, "Rip Done!");
qstatus = GHB_QUEUE_DONE;
if (js != NULL)
{
}
break;
case GHB_ERROR_CANCELED:
- gtk_progress_bar_set_text( progress, "Rip canceled." );
+ gtk_label_set_text (work_status, "Rip Canceled.");
qstatus = GHB_QUEUE_CANCELED;
if (js != NULL)
{
}
break;
default:
- gtk_progress_bar_set_text( progress, "Rip failed.");
+ gtk_label_set_text (work_status, "Rip Failed.");
qstatus = GHB_QUEUE_CANCELED;
if (js != NULL)
{
{
ghb_uninhibit_gpm();
ud->current_job = NULL;
+ gtk_widget_hide(GTK_WIDGET(progress));
}
if (js)
ghb_settings_set_int(js, "job_status", qstatus);
}
else if (status.queue.state & GHB_STATE_MUXING)
{
- gtk_progress_bar_set_text(progress, "Muxing: this may take awhile...");
- }
- if (status.queue.state & GHB_STATE_SCANNING)
- {
- // This needs to be in scanning and working since scanning
- // happens fast enough that it can be missed
- if (!work_started)
- {
- work_started = TRUE;
- ghb_queue_buttons_grey(ud, TRUE);
- }
+ gtk_label_set_text (work_status, "Muxing: This may take a while...");
}
- if (status.queue.state & GHB_STATE_WORKING)
- {
- // This needs to be in scanning and working since scanning
- // happens fast enough that it can be missed
- if (!work_started)
- {
- work_started = TRUE;
- ghb_queue_buttons_grey(ud, TRUE);
- }
- index = find_queue_job(ud->queue, status.queue.unique_id, &js);
- if (status.queue.unique_id != 0 && index >= 0)
- {
- gchar working_icon[] = "hb-working0";
- working_icon[10] = '0' + working;
- working = (working+1) % 6;
- treeview = GTK_TREE_VIEW(GHB_WIDGET(ud->builder, "queue_list"));
- store = GTK_TREE_STORE(gtk_tree_view_get_model(treeview));
- gchar *path = g_strdup_printf ("%d", index);
- if (gtk_tree_model_get_iter_from_string(
- GTK_TREE_MODEL(store), &iter, path))
- {
- gtk_tree_store_set(store, &iter, 0, working_icon, -1);
- }
- g_free(path);
- }
- GtkLabel *label;
- gchar *status_str;
- status_str = working_status_string(ud, &status.queue);
- label = GTK_LABEL(GHB_WIDGET(ud->builder, "queue_status"));
- gtk_label_set_text (label, status_str);
-#if !GTK_CHECK_VERSION(2, 16, 0)
- GtkStatusIcon *si;
-
- si = GTK_STATUS_ICON(GHB_OBJECT(ud->builder, "hb_status"));
- gtk_status_icon_set_tooltip(si, status_str);
-#endif
- g_free(status_str);
- }
if (status.scan.state & GHB_STATE_WORKING)
{
GtkProgressBar *live_progress;
if (ud->current_dvd_device != NULL &&
strcmp(device, ud->current_dvd_device) == 0)
{
- GtkProgressBar *progress;
- progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar"));
- gtk_progress_bar_set_text (progress, "Scanning ...");
- gtk_progress_bar_set_fraction (progress, 0);
+ show_scan_progress(ud);
update_source_label(ud, device);
gint preview_count;
preview_count = ghb_settings_get_int(ud->settings, "preview_count");
}
if (g_drive_has_media(gd))
{
- GtkProgressBar *progress;
- progress = GTK_PROGRESS_BAR(GHB_WIDGET (ud->builder, "progressbar"));
- gtk_progress_bar_set_text (progress, "Scanning ...");
- gtk_progress_bar_set_fraction (progress, 0);
+ show_scan_progress(ud);
update_source_label(ud, device);
gint preview_count;
preview_count = ghb_settings_get_int(ud->settings, "preview_count");
</object>
<object class="GtkWindow" id="hb_window">
<property name="visible">True</property>
+ <property name="resizable">False</property>
<property name="title" translatable="yes">HandBrake</property>
<property name="default_width">500</property>
<property name="default_height">400</property>
</packing>
</child>
<child>
+ <object class="GtkToolButton" id="queue_stop1">
+ <property name="visible">False</property>
+ <property name="sensitive">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="tooltip-text" translatable="yes">Stop Encoding</property>
+ <property name="label" translatable="yes">Stop</property>
+ <property name="icon_name">hb-stop</property>
+ <signal handler="queue_stop_clicked_cb" name="clicked"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkToolButton" id="queue_pause1">
<property name="visible">True</property>
<property name="sensitive">False</property>
<object class="GtkVBox" id="vbox15">
<property name="visible">True</property>
<child>
- <object class="GtkFrame" id="frame1">
+ <object class="GtkAlignment" id="alignment1">
<property name="visible">True</property>
- <property name="label_xalign">0</property>
- <property name="shadow_type">GTK_SHADOW_NONE</property>
+ <property name="left_padding">6</property>
+ <property name="right_padding">12</property>
+ <property name="top_padding">12</property>
+ <property name="bottom_padding">6</property>
+ <property name="xalign">0</property>
+ <property name="xscale">1</property>
<child>
- <object class="GtkAlignment" id="alignment1">
+ <object class="GtkVBox" id="vbox16">
<property name="visible">True</property>
- <property name="left_padding">12</property>
- <property name="top_padding">6</property>
- <property name="bottom_padding">6</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkVBox" id="vbox16">
+ <object class="GtkHBox" id="hbox54">
<property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="spacing">6</property>
<child>
- <object class="GtkHBox" id="hbox54">
+ <object class="GtkLabel" id="label7">
+ <property name="visible">True</property>
+ <property name="label" translatable="yes"><b>Source:</b></property>
+ <property name="use_markup">True</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="source_title">
+ <property name="width_request">240</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="spacing">5</property>
+ <property name="xalign">0</property>
+ <property name="label" translatable="yes">None</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment68">
+ <property name="visible">True</property>
+ <property name="xscale">1</property>
+ <property name="yscale">0</property>
<child>
- <object class="GtkLabel" id="source_title">
- <property name="visible">True</property>
+ <object class="GtkProgressBar" id="scan_prog">
+ <property name="height_request">10</property>
+ <property name="visible">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="xalign">0</property>
- <property name="label" translatable="yes"></property>
+ <property name="text" translatable="yes"/>
</object>
</child>
- <child>
- <placeholder/>
- </child>
- <child>
- <placeholder/>
- </child>
</object>
+ <packing>
+ <property name="position">2</property>
+ </packing>
</child>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkAlignment" id="alignment65">
+ <property name="visible">True</property>
+ <property name="left_padding">6</property>
+ <property name="bottom_padding">6</property>
<child>
<object class="GtkHBox" id="hbox5">
<property name="visible">True</property>
</packing>
</child>
</object>
- <packing>
- <property name="position">1</property>
- </packing>
</child>
</object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
</child>
</object>
</child>
- <child type="label">
- <object class="GtkLabel" id="label7">
- <property name="visible">True</property>
- <property name="label" translatable="yes"><b>Source</b></property>
- <property name="use_markup">True</property>
- </object>
- </child>
</object>
- <packing>
- <property name="expand">False</property>
- <property name="position">0</property>
- </packing>
</child>
<child>
<object class="GtkFrame" id="frame2">
</packing>
</child>
<child>
+ <object class="GtkAlignment" id="alignment67">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="top_padding">0</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+
+ <child>
<object class="GtkNotebook" id="settings_box">
<property name="visible">True</property>
<property name="can_focus">True</property>
</packing>
</child>
</object>
+ </child>
+
+ </object>
<packing>
<property name="expand">False</property>
<property name="position">1</property>
</packing>
</child>
+
<child>
- <object class="GtkLabel" id="label80">
- <property name="height_request">1</property>
+ <object class="GtkAlignment" id="alignment66">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="top_padding">4</property>
+ <property name="bottom_padding">4</property>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <property name="xalign">0.0</property>
+ <property name="yalign">1.0</property>
+ <child>
+ <object class="GtkHBox" id="hbox46">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <child>
+ <object class="GtkLabel" id="work_status">
+ <property name="visible">True</property>
+ <property name="xalign">0</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </object>
+ <packing>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkLabel" id="pending_status">
+ <property name="visible">True</property>
+ <property name="xalign">1</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ </object>
+ </child>
</object>
<packing>
<property name="position">2</property>
</packing>
</child>
<child>
- <object class="GtkProgressBar" id="progressbar">
- <property name="height_request">20</property>
+ <object class="GtkAlignment" id="alignment66">
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="text" translatable="yes"/>
+ <property name="left_padding">12</property>
+ <property name="right_padding">12</property>
+ <property name="bottom_padding">6</property>
+ <child>
+ <object class="GtkProgressBar" id="progressbar">
+ <property name="height_request">10</property>
+ <property name="visible">False</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="text" translatable="yes"/>
+ </object>
+ </child>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">False</property>
</packing>
</child>
+
+ <child>
+ <object class="GtkAlignment" id="alignment69">
+ <property name="visible">True</property>
+ <property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
+ <property name="top_padding">6</property>
+ <property name="right_padding">6</property>
+
<child>
<object class="GtkFrame" id="presets_frame">
<property name="visible">False</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
<property name="label_xalign">0</property>
- <property name="shadow_type">out</property>
+ <property name="shadow_type">none</property>
<signal handler="presets_frame_size_allocate_cb" name="size_allocate"/>
<child>
<object class="GtkAlignment" id="alignment21">
<property name="can_focus">True</property>
<property name="hscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
<property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property>
+ <property name="shadow_type">etched-in</property>
<child>
<object class="GtkTreeView" id="presets_list">
<property name="width_request">206</property>
</object>
</child>
</object>
+ </child>
+
+ </object>
<packing>
<property name="position">1</property>
</packing>
</child>
+
</object>
<packing>
<property name="position">2</property>