Bug 799705 - Remove Old Prices by Namespace

Add visibility of the namespace used for commodities so prices to
remove can be more specific.
Add a further option to restrict which namespaces are shown in the
list view. This also allows for quick selection by entering the
namespace in the combo entry.
pull/2167/head
Robert Fewell 3 months ago
parent e5fe2f3e0e
commit c32002bd77

@ -31,6 +31,7 @@
#include <gnc-quotes.hpp>
#include "dialog-utils.h"
#include "dialog-commodity.h"
#include "gnc-accounting-period.h"
#include "gnc-amount-edit.h"
#include "gnc-commodity-edit.h"
@ -39,6 +40,7 @@
#include "gnc-currency-edit.h"
#include "gnc-date-edit.h"
#include "gnc-engine.h"
#include "gnc-gtk-utils.h"
#include "gnc-gui-query.h"
#include "gnc-pricedb.h"
#include "gnc-session.h"
@ -85,9 +87,11 @@ struct PricesDialog
GtkWidget * remove_button;
GtkWidget * add_button;
GtkWidget *remove_dialog;
GtkWidget *remove_dialog;
GtkTreeView *remove_view;
int remove_source;
GtkWidget *namespace_cbwe;
gchar *target_namespace_name;
int remove_source;
};
@ -234,21 +238,51 @@ gnc_prices_dialog_remove_clicked (GtkWidget *widget, gpointer data)
/** Enumeration for the price delete list-store */
enum GncPriceColumn {PRICED_FULL_NAME, PRICED_COMM, PRICED_DATE, PRICED_COUNT};
enum GncPriceColumn {PRICED_NAMESPACE_NAME, PRICED_FULL_NAME, PRICED_COMM, PRICED_DATE, PRICED_COUNT};
static bool
continue_namespace_check (const gchar *target_namespace_name, const gchar *namespace_name)
{
if ((g_strcmp0 (target_namespace_name, GNC_COMMODITY_NS_CURRENCY) == 0) &&
(g_strcmp0 (namespace_name, GNC_COMMODITY_NS_CURRENCY) != 0))
return true;
if ((g_strcmp0 (target_namespace_name, GNC_COMMODITY_NS_NONISO_GUI) == 0) &&
(g_strcmp0 (namespace_name, GNC_COMMODITY_NS_CURRENCY) == 0))
return true;
if ((g_strcmp0 (target_namespace_name, GNC_COMMODITY_NS_NONISO_GUI) != 0) &&
(g_strcmp0 (target_namespace_name, GNC_COMMODITY_NS_CURRENCY) != 0) &&
(g_strcmp0 (target_namespace_name, namespace_name) != 0))
return true;
return false;
}
static time64
gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb, const gchar *target_namespace_name)
{
auto oldest = gnc_time (nullptr);
auto model = gtk_tree_view_get_model (view);
const auto commodity_table = gnc_get_current_commodities ();
auto namespace_list = gnc_commodity_table_get_namespaces (commodity_table);
auto namespace_list = gnc_commodity_table_get_namespaces_list (commodity_table);
// disconnect the model to the price treeview
g_object_ref (G_OBJECT(model));
gtk_tree_view_set_model (GTK_TREE_VIEW(view), nullptr);
gtk_list_store_clear (GTK_LIST_STORE(model));
for (auto node_n = namespace_list; node_n; node_n = g_list_next (node_n))
{
auto tmp_namespace = static_cast<char*>(node_n->data);
DEBUG("Looking at namespace %s", tmp_namespace);
auto commodity_list = gnc_commodity_table_get_commodities (commodity_table, tmp_namespace);
auto tmp_namespace = static_cast<gnc_commodity_namespace*>(node_n->data);
auto tmp_namespace_name_str = gnc_commodity_namespace_get_name (tmp_namespace);
DEBUG("Restricted to %s, looking at namespace %s", target_namespace_name, tmp_namespace_name_str);
if (continue_namespace_check (target_namespace_name, tmp_namespace_name_str))
continue;
auto commodity_list = gnc_commodity_table_get_commodities (commodity_table, tmp_namespace_name_str);
for (auto node_c = commodity_list; node_c; node_c = g_list_next (node_c))
{
auto tmp_commodity = static_cast<gnc_commodity*>(node_c->data);
@ -262,6 +296,7 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
auto price = static_cast<GNCPrice*> (node->data);
auto price_time = gnc_price_get_time64 (price);
auto name_str = gnc_commodity_get_printname (tmp_commodity);
auto tmp_namespace_gui_str = gnc_commodity_namespace_get_gui_name (tmp_namespace);
if (oldest > price_time)
oldest = price_time;
@ -271,8 +306,13 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
GtkTreeIter iter;
gtk_list_store_append (GTK_LIST_STORE(model), &iter);
gtk_list_store_set (GTK_LIST_STORE(model), &iter, PRICED_FULL_NAME, name_str,
PRICED_COMM, tmp_commodity, PRICED_DATE, date_str, PRICED_COUNT, num_str, -1);
gtk_list_store_set (GTK_LIST_STORE(model), &iter,
PRICED_NAMESPACE_NAME, tmp_namespace_gui_str,
PRICED_FULL_NAME, name_str,
PRICED_COMM, tmp_commodity,
PRICED_DATE, date_str,
PRICED_COUNT, num_str,
-1);
g_free (date_str);
g_free (num_str);
@ -283,6 +323,10 @@ gnc_prices_dialog_load_view (GtkTreeView *view, GNCPriceDB *pdb)
}
g_list_free (namespace_list);
// reconnect the model to the price treeview
gtk_tree_view_set_model (GTK_TREE_VIEW(view), model);
g_object_unref (G_OBJECT(model));
return oldest;
}
@ -315,17 +359,20 @@ static void
change_source_flag (PriceRemoveSourceFlags source, gboolean set, gpointer data)
{
auto pdb_dialog = static_cast<PricesDialog *> (data);
GtkWidget *w = gtk_dialog_get_widget_for_response (GTK_DIALOG(pdb_dialog->remove_dialog), GTK_RESPONSE_OK);
gboolean enable_button;
auto widget_ok = gtk_dialog_get_widget_for_response (GTK_DIALOG(pdb_dialog->remove_dialog),
GTK_RESPONSE_OK);
auto widget_apply = gtk_dialog_get_widget_for_response (GTK_DIALOG(pdb_dialog->remove_dialog),
GTK_RESPONSE_APPLY);
if (set)
pdb_dialog->remove_source = pdb_dialog->remove_source | source;
else
pdb_dialog->remove_source = pdb_dialog->remove_source & (~source);
// Check if we have the required options to enable OK button
enable_button = (pdb_dialog->remove_source > 8 ? TRUE : FALSE); // commodities flag is 8
gtk_widget_set_sensitive (w, enable_button);
// Check if we have the required options to enable OK and Apply buttons
gboolean enable_button = (pdb_dialog->remove_source > 8 ? TRUE : FALSE); // commodities flag is 8
gtk_widget_set_sensitive (widget_ok, enable_button);
gtk_widget_set_sensitive (widget_apply, enable_button);
DEBUG("Source is: %d, remove_source is %d", source, pdb_dialog->remove_source);
}
@ -383,6 +430,46 @@ get_fiscal_end_date (void)
return time64_to_gdate (end);
}
static void
namespace_changed_cb (GtkComboBox *cbwe, gpointer data)
{
auto pdb_dialog = static_cast<PricesDialog *>(data);
if (pdb_dialog->target_namespace_name)
g_free (pdb_dialog->target_namespace_name);
pdb_dialog->target_namespace_name = gnc_ui_namespace_picker_ns (GTK_WIDGET(cbwe));
gnc_prices_dialog_load_view (pdb_dialog->remove_view,
pdb_dialog->price_db,
pdb_dialog->target_namespace_name);
}
static PriceRemoveKeepOptions
get_keep_options_value (GtkBuilder *builder)
{
if (!builder)
return PRICE_REMOVE_KEEP_LAST_WEEKLY;
auto button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_none"));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
return PRICE_REMOVE_KEEP_NONE;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_month"));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
return PRICE_REMOVE_KEEP_LAST_MONTHLY;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_quarter"));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
return PRICE_REMOVE_KEEP_LAST_QUARTERLY;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_period"));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
return PRICE_REMOVE_KEEP_LAST_PERIOD;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_scaled"));
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(button)))
return PRICE_REMOVE_KEEP_SCALED;
// default which is also "radiobutton_last_week"
return PRICE_REMOVE_KEEP_LAST_WEEKLY;
}
void
gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
{
@ -390,6 +477,7 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
ENTER(" ");
auto builder = gtk_builder_new();
gnc_builder_add_from_file (builder, "dialog-price.glade", "liststore3");
gnc_builder_add_from_file (builder, "dialog-price.glade", "liststore4");
gnc_builder_add_from_file (builder, "dialog-price.glade", "deletion_date_dialog");
@ -404,6 +492,14 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
auto label = GTK_WIDGET(gtk_builder_get_object (builder, "date_label"));
gnc_date_make_mnemonic_target (GNC_DATE_EDIT(date), label);
// Setup namespace
pdb_dialog->namespace_cbwe = GTK_WIDGET(gtk_builder_get_object (builder, "namespace_combo_we"));
gnc_ui_update_namespace_picker (pdb_dialog->namespace_cbwe, nullptr, DIAG_COMM_ALL);
gnc_cbwe_require_list_item (GTK_COMBO_BOX(pdb_dialog->namespace_cbwe));
gtk_combo_box_set_active (GTK_COMBO_BOX(pdb_dialog->namespace_cbwe), 1);
g_signal_connect (G_OBJECT(pdb_dialog->namespace_cbwe), "changed",
G_CALLBACK(namespace_changed_cb), pdb_dialog);
// Setup the commodity view
pdb_dialog->remove_view = GTK_TREE_VIEW(gtk_builder_get_object (builder, "commodty_treeview"));
auto selection = gtk_tree_view_get_selection (pdb_dialog->remove_view);
@ -422,15 +518,20 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
gtk_cell_renderer_set_alignment (cr, 0.5, 0.5);
// Load the view and get the earliest date
gnc_prices_dialog_load_view (pdb_dialog->remove_view, pdb_dialog->price_db);
gtk_tree_selection_select_all (selection);
pdb_dialog->target_namespace_name = g_strdup (GNC_COMMODITY_NS_NONISO_GUI);
gnc_prices_dialog_load_view (pdb_dialog->remove_view,
pdb_dialog->price_db,
pdb_dialog->target_namespace_name);
g_signal_connect (selection, "changed", G_CALLBACK(selection_changed_cb), pdb_dialog);
gtk_builder_connect_signals_full (builder, gnc_builder_connect_full_func, pdb_dialog);
gtk_window_set_transient_for (GTK_WINDOW (pdb_dialog->remove_dialog), GTK_WINDOW (pdb_dialog->window));
pdb_dialog->remove_source = PRICE_REMOVE_SOURCE_FQ + PRICE_REMOVE_SOURCE_COMM; // FQ and Commodities highlighted
pdb_dialog->remove_source = PRICE_REMOVE_SOURCE_FQ;
change_source_flag (PRICE_REMOVE_SOURCE_FQ, TRUE, pdb_dialog);
auto button = GTK_WIDGET(gtk_builder_get_object (builder, "checkbutton_fq"));
g_signal_connect (button, "toggled", G_CALLBACK (check_event_fq_cb), pdb_dialog);
button = GTK_WIDGET(gtk_builder_get_object (builder, "checkbutton_user"));
@ -438,76 +539,87 @@ gnc_prices_dialog_remove_old_clicked (GtkWidget *widget, gpointer data)
button = GTK_WIDGET(gtk_builder_get_object (builder, "checkbutton_app"));
g_signal_connect (button, "toggled", G_CALLBACK (check_event_app_cb), pdb_dialog);
auto result = gtk_dialog_run (GTK_DIALOG (pdb_dialog->remove_dialog));
if (result == GTK_RESPONSE_OK)
bool leave = false;
int response = 0;
while (!leave && (response = gtk_dialog_run (GTK_DIALOG(pdb_dialog->remove_dialog))))
{
const char *fmt = _("Are you sure you want to delete these prices?");
auto comm_list = gnc_prices_dialog_get_commodities (pdb_dialog->remove_view);
if ((response == GTK_RESPONSE_CLOSE) || (response == GTK_RESPONSE_DELETE_EVENT))
leave = true;
// Are you sure you want to delete the entries and we have commodities
if ((g_list_length (comm_list) != 0) && (gnc_verify_dialog (GTK_WINDOW (pdb_dialog->remove_dialog), FALSE, fmt, NULL)))
if ((response == GTK_RESPONSE_OK) || (response == GTK_RESPONSE_APPLY))
{
time64 last;
GDate fiscal_end_date = get_fiscal_end_date ();
PriceRemoveKeepOptions keep = PRICE_REMOVE_KEEP_NONE;
// disconnect the model to the price treeview
auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->price_tree));
g_object_ref (G_OBJECT(model));
gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), NULL);
DEBUG("deleting prices");
last = gnc_date_edit_get_date (GNC_DATE_EDIT (date));
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_week"));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
keep = PRICE_REMOVE_KEEP_LAST_WEEKLY;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_month"));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
keep = PRICE_REMOVE_KEEP_LAST_MONTHLY;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_quarter"));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
keep = PRICE_REMOVE_KEEP_LAST_QUARTERLY;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_last_period"));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
keep = PRICE_REMOVE_KEEP_LAST_PERIOD;
button = GTK_WIDGET(gtk_builder_get_object (builder, "radiobutton_scaled"));
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)))
keep = PRICE_REMOVE_KEEP_SCALED;
if (keep != PRICE_REMOVE_KEEP_SCALED)
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, last,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
keep);
const char *fmt = _("Are you sure you want to delete these prices?");
auto comm_list = gnc_prices_dialog_get_commodities (pdb_dialog->remove_view);
bool delete_entries = false;
// Are you sure you want to delete the entries and we have commodities
if ((g_list_length (comm_list) != 0) &&
(gnc_verify_dialog (GTK_WINDOW(pdb_dialog->remove_dialog), FALSE, fmt, NULL)))
{
time64 last;
GDate fiscal_end_date = get_fiscal_end_date ();
PriceRemoveKeepOptions keep = get_keep_options_value (builder);
delete_entries = true;
// disconnect the model to the price treeview
auto model = gtk_tree_view_get_model (GTK_TREE_VIEW(pdb_dialog->price_tree));
g_object_ref (G_OBJECT(model));
gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), nullptr);
DEBUG("deleting prices for keep option %d", keep);
last = gnc_date_edit_get_date (GNC_DATE_EDIT (date));
if (keep != PRICE_REMOVE_KEEP_SCALED)
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, last,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
keep);
else
{
auto tmp_date = time64_to_gdate (last);
g_date_subtract_months (&tmp_date, 6);
auto tmp = gdate_to_time64 (tmp_date);
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, tmp,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
PRICE_REMOVE_KEEP_LAST_WEEKLY);
g_date_subtract_months (&tmp_date, 6);
tmp = gdate_to_time64 (tmp_date);
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, tmp,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
PRICE_REMOVE_KEEP_LAST_MONTHLY);
}
// reconnect the model to the price treeview
gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), model);
g_object_unref (G_OBJECT(model));
}
g_list_free (comm_list);
if (response == GTK_RESPONSE_OK)
{
if (delete_entries)
leave = true;
}
else
{
auto tmp_date = time64_to_gdate (last);
g_date_subtract_months (&tmp_date, 6);
auto tmp = gdate_to_time64 (tmp_date);
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, tmp,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
PRICE_REMOVE_KEEP_LAST_WEEKLY);
g_date_subtract_months (&tmp_date, 6);
tmp = gdate_to_time64 (tmp_date);
gnc_pricedb_remove_old_prices (pdb_dialog->price_db, comm_list,
&fiscal_end_date, tmp,
static_cast<PriceRemoveSourceFlags> (pdb_dialog->remove_source),
PRICE_REMOVE_KEEP_LAST_MONTHLY);
if (delete_entries)
gnc_prices_dialog_load_view (pdb_dialog->remove_view,
pdb_dialog->price_db,
pdb_dialog->target_namespace_name);
}
// reconnect the model to the price treeview
gtk_tree_view_set_model (GTK_TREE_VIEW(pdb_dialog->price_tree), model);
g_object_unref(G_OBJECT(model));
}
g_list_free (comm_list);
}
gnc_gui_refresh_all ();
if (pdb_dialog->target_namespace_name)
g_free (pdb_dialog->target_namespace_name);
gtk_widget_destroy (pdb_dialog->remove_dialog);
g_object_unref (G_OBJECT (builder));
g_object_unref (G_OBJECT(builder));
LEAVE(" ");
}

@ -1,7 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<!-- Generated with glade 3.40.0 -->
<interface>
<requires lib="gtk+" version="3.22"/>
<object class="GtkTreeModelSort"/>
<object class="GtkListStore" id="liststore1">
<columns>
<!-- column-name item -->
@ -135,7 +136,7 @@
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">end</property>
<property name="label" translatable="yes">Nam_espace</property>
<property name="label" translatable="yes">_Namespace</property>
<property name="use-underline">True</property>
<property name="justify">center</property>
<property name="mnemonic-widget">namespace_cbwe</property>
@ -358,6 +359,8 @@
</object>
<object class="GtkListStore" id="liststore4">
<columns>
<!-- column-name namespace_name -->
<column type="gchararray"/>
<!-- column-name full_name -->
<column type="gchararray"/>
<!-- column-name commodity -->
@ -386,8 +389,8 @@
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="cancel_button">
<property name="label" translatable="yes">_Cancel</property>
<object class="GtkButton" id="del_close_button">
<property name="label" translatable="yes">_Close</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="can-default">True</property>
@ -401,7 +404,21 @@
</packing>
</child>
<child>
<object class="GtkButton" id="ok_button">
<object class="GtkButton" id="del_apply_button">
<property name="label" translatable="yes">_Apply</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkButton" id="del_ok_button">
<property name="label" translatable="yes">_OK</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
@ -412,7 +429,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="position">2</property>
</packing>
</child>
</object>
@ -423,7 +440,7 @@
</packing>
</child>
<child>
<!-- n-columns=2 n-rows=7 -->
<!-- n-columns=2 n-rows=8 -->
<object class="GtkGrid" id="table2">
<property name="visible">True</property>
<property name="can-focus">False</property>
@ -554,7 +571,7 @@
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">6</property>
<property name="top-attach">7</property>
<property name="width">2</property>
</packing>
</child>
@ -575,13 +592,24 @@
<child internal-child="selection">
<object class="GtkTreeSelection" id="selection1"/>
</child>
<child>
<object class="GtkTreeViewColumn" id="namespace_column">
<property name="title" translatable="yes">Namespace</property>
<child>
<object class="GtkCellRendererText" id="namespace_cellr"/>
<attributes>
<attribute name="text">0</attribute>
</attributes>
</child>
</object>
</child>
<child>
<object class="GtkTreeViewColumn" id="name_column">
<property name="title" translatable="yes">Commodity</property>
<child>
<object class="GtkCellRendererText" id="name_cellr"/>
<attributes>
<attribute name="text">0</attribute>
<attribute name="text">1</attribute>
</attributes>
</child>
</object>
@ -592,7 +620,7 @@
<child>
<object class="GtkCellRendererText" id="date_cellr"/>
<attributes>
<attribute name="text">2</attribute>
<attribute name="text">3</attribute>
</attributes>
</child>
</object>
@ -609,7 +637,7 @@
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
<property name="top-attach">5</property>
<property name="width">2</property>
</packing>
</child>
@ -623,7 +651,7 @@
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="top-attach">4</property>
<property name="width">2</property>
</packing>
</child>
@ -637,7 +665,7 @@
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">5</property>
<property name="top-attach">6</property>
<property name="width">2</property>
</packing>
</child>
@ -705,7 +733,7 @@
<property name="can-focus">False</property>
<child>
<object class="GtkCheckButton" id="checkbutton_app">
<property name="label" translatable="yes">_Added by the application</property>
<property name="label" translatable="yes">Added _by the application</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">False</property>
@ -779,6 +807,39 @@ These prices were added so that there's always a "nearest in time" price for eve
<property name="top-attach">2</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="namespace_label">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">_Namespace</property>
<property name="use-underline">True</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="namespace_combo_we">
<property name="width-request">250</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">start</property>
<property name="model">liststore3</property>
<property name="has-entry">True</property>
<property name="entry-text-column">0</property>
<child internal-child="entry">
<object class="GtkEntry" id="combobox-entry4">
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
</child>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">True</property>
@ -789,8 +850,9 @@ These prices were added so that there's always a "nearest in time" price for eve
</object>
</child>
<action-widgets>
<action-widget response="-6">cancel_button</action-widget>
<action-widget response="-5">ok_button</action-widget>
<action-widget response="-7">del_close_button</action-widget>
<action-widget response="-10">del_apply_button</action-widget>
<action-widget response="-5">del_ok_button</action-widget>
</action-widgets>
</object>
<object class="GtkWindow" id="prices_window">

Loading…
Cancel
Save