The attached patch adds a 'Storage Manager' to the connection details section. It's setup is similar to the network manager also in the connection details. The manager lists all pools on the connection and their associated details: name, type, total capacity and available space, as well as their associated volumes. All starting, stopping, and deleting of storage objects takes place here, as well as launching the the storage creation wizards (next patches). There is some small cleanup sprinkled in here as well of the existing network management code, nothing major though. Thanks to Tim Allen for most of the UI design. Screenshots can be seen here: http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-01.png http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-02.png http://fedorapeople.org/~crobinso/virt-manager/storage/storage-manager-03.png Thanks, Cole
# HG changeset patch # User "Cole Robinson <crobinso@xxxxxxxxxx>" # Date 1218416200 14400 # Node ID 145e007589cadd31bbdbd12b2b6cad4a35a47ba3 # Parent 97b86e27b9e540f67f677907e253462b70caeef4 Add storage manager to connection details section. diff -r 97b86e27b9e5 -r 145e007589ca src/virtManager/host.py --- a/src/virtManager/host.py Thu Aug 07 17:37:16 2008 -0400 +++ b/src/virtManager/host.py Sun Aug 10 20:56:40 2008 -0400 @@ -25,8 +25,13 @@ import sparkline import logging import os +import traceback + +from virtinst import Storage from virtManager.createnet import vmmCreateNetwork +from virtManager.createpool import vmmCreatePool +from virtManager.createvol import vmmCreateVolume from virtManager.error import vmmErrorDialog class vmmHost(gobject.GObject): @@ -39,6 +44,9 @@ self.window = gtk.glade.XML(config.get_glade_dir() + "/vmm-host.glade", "vmm-host", domain="virt-manager") self.config = config self.conn = conn + + self.PIXBUF_STATE_RUNNING = gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() + "/state_running.png", 18, 18) + self.PIXBUF_STATE_SHUTOFF = gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() + "/state_shutoff.png", 18, 18) topwin = self.window.get_widget("vmm-host") topwin.hide() @@ -60,7 +68,16 @@ self.window.get_widget("net-list").set_model(netListModel) self.populate_networks(netListModel) + poolListModel = gtk.ListStore(str, str, float) + self.window.get_widget("pool-list").set_model(poolListModel) + self.populate_storage_pools(poolListModel) + + volListModel = gtk.ListStore(str, str, str, str) + self.window.get_widget("vol-list").set_model(volListModel) + self.window.get_widget("net-list").get_selection().connect("changed", self.net_selected) + self.window.get_widget("pool-list").get_selection().connect("changed", self.pool_selected) + self.window.get_widget("vol-list").get_selection().connect("changed", self.vol_selected) netCol = gtk.TreeViewColumn("Networks") net_txt = gtk.CellRendererText() @@ -73,6 +90,35 @@ self.window.get_widget("net-list").append_column(netCol) self.window.get_widget("net-details").set_sensitive(False) + poolCol = gtk.TreeViewColumn("Pools") + pool_txt = gtk.CellRendererText() + pool_prg = gtk.CellRendererProgress() + poolCol.pack_start(pool_txt, True) + poolCol.pack_start(pool_prg, False) + poolCol.add_attribute(pool_txt, 'text', 1) + poolCol.add_attribute(pool_prg, 'value', 2) + self.window.get_widget("pool-list").append_column(poolCol) + + volCol = gtk.TreeViewColumn("Volumes") + vol_txt1 = gtk.CellRendererText() + volCol.pack_start(vol_txt1, True) + volCol.add_attribute(vol_txt1, 'text', 1) + self.window.get_widget("vol-list").append_column(volCol) + + volSizeCol = gtk.TreeViewColumn("Size") + vol_txt2 = gtk.CellRendererText() + volSizeCol.pack_start(vol_txt2, False) + volSizeCol.add_attribute(vol_txt2, 'text', 2) + self.window.get_widget("vol-list").append_column(volSizeCol) + + volFormatCol = gtk.TreeViewColumn("Format") + vol_txt3 = gtk.CellRendererText() + volFormatCol.pack_start(vol_txt3, False) + volFormatCol.add_attribute(vol_txt3, 'text', 3) + self.window.get_widget("vol-list").append_column(volFormatCol) + + self.window.get_widget("pool-details").set_sensitive(False) + self.cpu_usage_graph = sparkline.Sparkline() self.cpu_usage_graph.show() self.window.get_widget("performance-table").attach(self.cpu_usage_graph, 1, 2, 0, 1) @@ -81,11 +127,19 @@ self.memory_usage_graph.show() self.window.get_widget("performance-table").attach(self.memory_usage_graph, 1, 2, 1, 2) - self.add = None - self.window.get_widget("details-tabs").get_nth_page(2).hide() + self.addnet = None + self.addpool = None + self.addvol = None self.conn.connect("net-added", self.repopulate_networks) self.conn.connect("net-removed", self.repopulate_networks) + self.conn.connect("net-started", self.refresh_network) + self.conn.connect("net-stopped", self.refresh_network) + + self.conn.connect("pool-added", self.repopulate_storage_pools) + self.conn.connect("pool-removed", self.repopulate_storage_pools) + self.conn.connect("pool-started", self.refresh_storage_pool) + self.conn.connect("pool-stopped", self.refresh_storage_pool) # XXX not technically correct once we enable remote management if (os.getuid() != 0 and not self.conn.is_remote()) \ @@ -101,13 +155,20 @@ "on_net_delete_clicked": self.delete_network, "on_net_stop_clicked": self.stop_network, "on_net_start_clicked": self.start_network, + "on_pool_add_clicked" : self.add_pool, + "on_vol_add_clicked" : self.add_vol, + "on_pool_stop_clicked": self.stop_pool, + "on_pool_start_clicked": self.start_pool, + "on_pool_delete_clicked": self.delete_pool, + "on_pool_autostart_toggled": self.pool_autostart_changed, + "on_vol_delete_clicked": self.delete_vol, + "on_pool_apply_clicked": self.pool_apply, "on_config_autoconnect_toggled": self.toggle_autoconnect, }) self.conn.connect("resources-sampled", self.refresh_resources) - self.conn.connect("net-started", self.refresh_network) - self.conn.connect("net-stopped", self.refresh_network) self.refresh_resources() + self.reset_pool_state() def show(self): # Update autostart value @@ -140,9 +201,9 @@ self.err.val_err(_("Creating new networks on remote connections is not yet supported")) return - if self.add is None: - self.add = vmmCreateNetwork(self.config, self.conn) - self.add.show() + if self.addnet is None: + self.addnet = vmmCreateNetwork(self.config, self.conn) + self.addnet.show() def toggle_autoconnect(self, ignore=None): if self.conn.get_autoconnect() != \ @@ -169,6 +230,9 @@ memory_vector = self.conn.current_memory_vector() memory_vector.reverse() self.memory_usage_graph.set_property("data_array", memory_vector) + + + # Virtual Network functions def current_network(self): sel = self.window.get_widget("net-list").get_selection() @@ -202,7 +266,7 @@ self.window.get_widget("net-device").set_text(net.get_bridge_device()) self.window.get_widget("net-device").set_sensitive(True) self.window.get_widget("net-state").set_text(_("Active")) - self.window.get_widget("net-state-icon").set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() + "/state_running.png", 18, 18)) + self.window.get_widget("net-state-icon").set_from_pixbuf(self.PIXBUF_STATE_RUNNING) self.window.get_widget("net-start").set_sensitive(False) self.window.get_widget("net-stop").set_sensitive(True) self.window.get_widget("net-delete").set_sensitive(False) @@ -210,17 +274,12 @@ self.window.get_widget("net-device").set_text("") self.window.get_widget("net-device").set_sensitive(False) self.window.get_widget("net-state").set_text(_("Inactive")) - self.window.get_widget("net-state-icon").set_from_pixbuf(gtk.gdk.pixbuf_new_from_file_at_size(self.config.get_icon_dir() + "/state_shutoff.png", 18, 18)) + self.window.get_widget("net-state-icon").set_from_pixbuf(self.PIXBUF_STATE_SHUTOFF) self.window.get_widget("net-start").set_sensitive(True) self.window.get_widget("net-stop").set_sensitive(False) self.window.get_widget("net-delete").set_sensitive(True) - autostart = True - try: - autostart = net.get_autostart() - except: - # Hack, libvirt 0.2.1 is missing python binding for the autostart method - pass + autostart = net.get_autostart() if autostart: self.window.get_widget("net-autostart").set_text(_("On boot")) self.window.get_widget("net-autostart-icon").set_from_stock(gtk.STOCK_YES, gtk.ICON_SIZE_MENU) @@ -258,4 +317,211 @@ model.append([uuid, net.get_name(), gtk.STOCK_NETWORK]) + # ------------------------------ + # Storage Manager methods + # ------------------------------ + + + def add_pool(self, src): + if self.addpool is None: + self.addpool = vmmCreatePool(self.config, self.conn) + self.addpool.show() + + def add_vol(self, src): + pool = self.current_pool() + if pool is None: + return + if self.addvol is None: + self.addvol = vmmCreateVolume(self.config, self.conn, pool) + self.addvol.connect("vol-created", self.refresh_current_pool) + else: + self.addvol.set_parent_pool(pool) + self.addvol.show() + + def refresh_current_pool(self, ignore1=None): + cp = self.current_pool() + if cp is None: + return + self.refresh_storage_pool(None, None, cp.get_uuid()) + + def current_pool(self): + sel = self.window.get_widget("pool-list").get_selection() + active = sel.get_selected() + if active[1] != None: + curruuid = active[0].get_value(active[1], 0) + return self.conn.get_pool(curruuid) + return None + + def current_vol(self): + pool = self.current_pool() + if not pool: + return None + sel = self.window.get_widget("vol-list").get_selection() + active = sel.get_selected() + if active[1] != None: + curruuid = active[0].get_value(active[1], 0) + return pool.get_volume(curruuid) + return None + + def stop_pool(self, src): + pool = self.current_pool() + if pool is not None: + pool.stop() + + def start_pool(self, src): + pool = self.current_pool() + if pool is not None: + pool.start() + + def delete_pool(self, src): + pool = self.current_pool() + if pool is None: + return + + result = self.err.yes_no(_("This will permanently delete the volume " + "'%s,' are you sure?") % pool.get_name()) + if not result: + return + try: + pool.delete() + except Exception, e: + self.err.show_err(_("Error deleting pool: %s") % str(e), + "".join(traceback.format_exc())) + return + + def delete_vol(self, src): + vol = self.current_vol() + if vol is None: + return + + result = self.err.yes_no(_("This will permanently delete the volume " + "'%s,' are you sure?") % vol.get_name()) + if not result: + return + + try: + vol.delete() + except Exception, e: + self.err.show_err(_("Error deleting volume: %s") % str(e), + "".join(traceback.format_exc())) + return + + self.populate_storage_volumes() + + def pool_apply(self, src): + pool = self.current_pool() + if pool is None: + return + + try: + pool.set_autostart(self.window.get_widget("pool-autostart").get_active()) + except Exception, e: + self.err.show_err(_("Error setting pool autostart: %s") % str(e), + "".join(traceback.format_exc())) + return + self.window.get_widget("pool-apply").set_sensitive(False) + + def pool_autostart_changed(self, src): + auto = self.window.get_widget("pool-autostart").get_active() + self.window.get_widget("pool-autostart").set_label(auto and \ + _("On Boot") or \ + _("Never")) + self.window.get_widget("pool-apply").set_sensitive(True) + + def pool_selected(self, src): + selected = src.get_selected() + if selected[1] is None or \ + selected[0].get_value(selected[1], 0) is None: + self.reset_pool_state() + return + + uuid = selected[0].get_value(selected[1], 0) + pool = self.conn.get_pool(uuid) + auto = pool.get_autostart() + active = pool.is_active() + + # Set pool details state + self.window.get_widget("pool-details").set_sensitive(True) + self.window.get_widget("pool-name").set_markup("<b>%s:</b>" % \ + pool.get_name()) + self.window.get_widget("pool-sizes").set_markup("""<span size="large">%s Free</span> / <i>%s In Use</i>""" % (pool.get_pretty_available(), pool.get_pretty_allocation())) + self.window.get_widget("pool-type").set_text(Storage.StoragePool.get_pool_type_desc(pool.get_type())) + self.window.get_widget("pool-location").set_text(pool.get_target_path()) + self.window.get_widget("pool-state-icon").set_from_pixbuf((active and self.PIXBUF_STATE_RUNNING) or self.PIXBUF_STATE_SHUTOFF) + self.window.get_widget("pool-state").set_text((active and _("Active")) or _("Inactive")) + self.window.get_widget("pool-autostart").set_label((auto and _("On boot")) or _("Never")) + self.window.get_widget("pool-autostart").set_active(auto) + + self.window.get_widget("vol-list").set_sensitive(active) + self.populate_storage_volumes() + + self.window.get_widget("pool-delete").set_sensitive(not active) + self.window.get_widget("pool-stop").set_sensitive(active) + self.window.get_widget("pool-start").set_sensitive(not active) + self.window.get_widget("pool-apply").set_sensitive(False) + self.window.get_widget("vol-add").set_sensitive(active) + self.window.get_widget("vol-delete").set_sensitive(False) + + def refresh_storage_pool(self, src, uri, uuid): + sel = self.window.get_widget("pool-list").get_selection() + active = sel.get_selected() + if active[1] != None: + curruuid = active[0].get_value(active[1], 0) + if curruuid == uuid: + self.pool_selected(sel) + + def reset_pool_state(self): + self.window.get_widget("pool-details").set_sensitive(False) + self.window.get_widget("pool-name").set_text("") + self.window.get_widget("pool-sizes").set_text("") + self.window.get_widget("pool-type").set_text("") + self.window.get_widget("pool-location").set_text("") + self.window.get_widget("pool-state-icon").set_from_pixbuf(self.PIXBUF_STATE_SHUTOFF) + self.window.get_widget("pool-state").set_text(_("Inactive")) + self.window.get_widget("vol-list").get_model().clear() + self.window.get_widget("pool-autostart").set_label(_("Never")) + self.window.get_widget("pool-autostart").set_active(False) + + self.window.get_widget("pool-delete").set_sensitive(False) + self.window.get_widget("pool-stop").set_sensitive(False) + self.window.get_widget("pool-start").set_sensitive(False) + self.window.get_widget("pool-apply").set_sensitive(False) + self.window.get_widget("vol-add").set_sensitive(False) + self.window.get_widget("vol-delete").set_sensitive(False) + self.window.get_widget("vol-list").set_sensitive(False) + + def vol_selected(self, src): + selected = src.get_selected() + if selected[1] is None or \ + selected[0].get_value(selected[1], 0) is None: + self.window.get_widget("vol-delete").set_sensitive(False) + return + + self.window.get_widget("vol-delete").set_sensitive(True) + + def repopulate_storage_pools(self, src, uri, uuid): + self.populate_storage_pools(self.window.get_widget("pool-list").get_model()) + + def populate_storage_pools(self, model): + model.clear() + for uuid in self.conn.list_pool_uuids(): + pool = self.conn.get_pool(uuid) + cap = pool.get_capacity() + all = pool.get_allocation() + if not cap or all is None: + per = 0 + else: + per = int(((float(all) / float(cap)) * 100)) + model.append([uuid, pool.get_name(), per]) + + def populate_storage_volumes(self): + pool = self.current_pool() + model = self.window.get_widget("vol-list").get_model() + model.clear() + vols = pool.get_volumes() + for key in vols.keys(): + vol = vols[key] + model.append([key, vol.get_name(), vol.get_pretty_capacity(), + vol.get_format() or ""]) + gobject.type_register(vmmHost) diff -r 97b86e27b9e5 -r 145e007589ca src/vmm-host.glade --- a/src/vmm-host.glade Thu Aug 07 17:37:16 2008 -0400 +++ b/src/vmm-host.glade Sun Aug 10 20:56:40 2008 -0400 @@ -9,7 +9,7 @@ <property name="type">GTK_WINDOW_TOPLEVEL</property> <property name="window_position">GTK_WIN_POS_NONE</property> <property name="modal">False</property> - <property name="default_width">600</property> + <property name="default_width">650</property> <property name="default_height">450</property> <property name="resizable">True</property> <property name="destroy_with_parent">False</property> @@ -1714,23 +1714,21 @@ </child> <child> - <widget class="GtkHBox" id="hbox2"> + <widget class="GtkVBox" id="vbox5"> + <property name="border_width">3</property> <property name="visible">True</property> <property name="homogeneous">False</property> <property name="spacing">0</property> <child> - <widget class="GtkScrolledWindow" id="scrolledwindow2"> - <property name="border_width">6</property> + <widget class="GtkHPaned" id="hpaned1"> + <property name="border_width">3</property> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="hscrollbar_policy">GTK_POLICY_NEVER</property> - <property name="vscrollbar_policy">GTK_POLICY_AUTOMATIC</property> - <property name="shadow_type">GTK_SHADOW_IN</property> - <property name="window_placement">GTK_CORNER_TOP_LEFT</property> <child> - <widget class="GtkTreeView" id="treeview1"> + <widget class="GtkTreeView" id="pool-list"> + <property name="width_request">134</property> <property name="visible">True</property> <property name="can_focus">True</property> <property name="headers_visible">False</property> @@ -1741,61 +1739,248 @@ <property name="hover_selection">False</property> <property name="hover_expand">False</property> </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">False</property> + </packing> </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">True</property> - </packing> - </child> - - <child> - <widget class="GtkVBox" id="vbox3"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">3</property> <child> - <widget class="GtkFrame" id="frame5"> + <widget class="GtkVBox" id="pool-details"> <property name="visible">True</property> - <property name="label_xalign">0</property> - <property name="label_yalign">0.5</property> - <property name="shadow_type">GTK_SHADOW_NONE</property> + <property name="homogeneous">False</property> + <property name="spacing">3</property> <child> - <widget class="GtkAlignment" id="alignment5"> + <widget class="GtkTable" id="table5"> + <property name="border_width">6</property> <property name="visible">True</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xscale">1</property> - <property name="yscale">1</property> - <property name="top_padding">0</property> - <property name="bottom_padding">0</property> - <property name="left_padding">12</property> - <property name="right_padding">0</property> + <property name="n_rows">5</property> + <property name="n_columns">2</property> + <property name="homogeneous">False</property> + <property name="row_spacing">3</property> + <property name="column_spacing">8</property> <child> - <widget class="GtkTable" id="table5"> - <property name="border_width">6</property> + <widget class="GtkLabel" id="label73"> <property name="visible">True</property> - <property name="n_rows">2</property> - <property name="n_columns">2</property> + <property name="label" translatable="yes">Pool Type:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">1</property> + <property name="bottom_attach">2</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pool-type"> + <property name="visible">True</property> + <property name="label" translatable="yes">Pool Type</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <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="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pool-name"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Poolname:</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pool-sizes"> + <property name="visible">True</property> + <property name="label" translatable="yes"><span size="large">1234 GB Free</span> / <i>6000 GB In Use</i></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">1</property> + <property name="right_attach">2</property> + <property name="top_attach">0</property> + <property name="bottom_attach">1</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label60"> + <property name="visible">True</property> + <property name="label" translatable="yes">Location:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">2</property> + <property name="bottom_attach">3</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkEntry" id="pool-location"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="editable">False</property> + <property name="visibility">True</property> + <property name="max_length">0</property> + <property name="text" translatable="yes"></property> + <property name="has_frame">True</property> + <property name="invisible_char">â?¢</property> + <property name="activates_default">False</property> + </widget> + <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"></property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label75"> + <property name="visible">True</property> + <property name="label" translatable="yes">State:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">3</property> + <property name="bottom_attach">4</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox7"> + <property name="visible">True</property> <property name="homogeneous">False</property> - <property name="row_spacing">3</property> - <property name="column_spacing">3</property> + <property name="spacing">3</property> <child> - <widget class="GtkLabel" id="label59"> + <widget class="GtkImage" id="pool-state-icon"> <property name="visible">True</property> - <property name="label" translatable="yes">Location:</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="pool-state"> + <property name="visible">True</property> + <property name="label" translatable="yes">Active</property> <property name="use_underline">False</property> <property name="use_markup">False</property> <property name="justify">GTK_JUSTIFY_LEFT</property> <property name="wrap">False</property> <property name="selectable">False</property> - <property name="xalign">1</property> + <property name="xalign">0.5</property> <property name="yalign">0.5</property> <property name="xpad">0</property> <property name="ypad">0</property> @@ -1805,115 +1990,467 @@ <property name="angle">0</property> </widget> <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">1</property> - <property name="bottom_attach">2</property> - <property name="x_options">fill</property> - <property name="y_options"></property> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> </packing> </child> + </widget> + <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="x_options">fill</property> + <property name="y_options">fill</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label76"> + <property name="visible">True</property> + <property name="label" translatable="yes">Autostart:</property> + <property name="use_underline">False</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="left_attach">0</property> + <property name="right_attach">1</property> + <property name="top_attach">4</property> + <property name="bottom_attach">5</property> + <property name="x_options">fill</property> + <property name="y_options"></property> + </packing> + </child> + + <child> + <widget class="GtkCheckButton" id="pool-autostart"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label" translatable="yes">Some label</property> + <property name="use_underline">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <property name="active">False</property> + <property name="inconsistent">False</property> + <property name="draw_indicator">True</property> + <signal name="toggled" handler="on_pool_autostart_toggled" last_modification_time="Thu, 07 Aug 2008 01:27:28 GMT"/> + </widget> + <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">fill</property> + <property name="y_options"></property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkVBox" id="vbox6"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">3</property> + + <child> + <widget class="GtkLabel" id="label77"> + <property name="visible">True</property> + <property name="label" translatable="yes"><b>Volumes</b></property> + <property name="use_underline">False</property> + <property name="use_markup">True</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkScrolledWindow" id="scrolledwindow5"> + <property name="visible">True</property> + <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">GTK_SHADOW_IN</property> + <property name="window_placement">GTK_CORNER_TOP_LEFT</property> <child> - <widget class="GtkEntry" id="storage-location"> + <widget class="GtkTreeView" id="vol-list"> <property name="visible">True</property> <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char">â?¢</property> - <property name="activates_default">False</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Storage Location</atkproperty> - </accessibility> + <property name="headers_visible">True</property> + <property name="rules_hint">False</property> + <property name="reorderable">False</property> + <property name="enable_search">True</property> + <property name="fixed_height_mode">False</property> + <property name="hover_selection">False</property> + <property name="hover_expand">False</property> </widget> - <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"></property> - </packing> </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + </widget> + <packing> + <property name="shrink">True</property> + <property name="resize">True</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox9"> + <property name="border_width">3</property> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkHBox" id="hbox10"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="pool-add"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_pool_add_clicked" last_modification_time="Thu, 07 Aug 2008 01:22:11 GMT"/> + + <child> + <widget class="GtkImage" id="image4"> + <property name="visible">True</property> + <property name="stock">gtk-add</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="pool-start"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_pool_start_clicked" last_modification_time="Thu, 07 Aug 2008 01:24:39 GMT"/> + + <child> + <widget class="GtkImage" id="someicon"> + <property name="visible">True</property> + <property name="stock">gtk-media-play</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="pool-stop"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_pool_stop_clicked" last_modification_time="Thu, 07 Aug 2008 01:24:56 GMT"/> + + <child> + <widget class="GtkImage" id="image6"> + <property name="visible">True</property> + <property name="stock">gtk-cancel</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="pool-delete"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_pool_delete_clicked" last_modification_time="Thu, 07 Aug 2008 01:25:09 GMT"/> + + <child> + <widget class="GtkImage" id="image7"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">True</property> + <property name="fill">True</property> + </packing> + </child> + + <child> + <widget class="GtkHBox" id="hbox11"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">0</property> + + <child> + <widget class="GtkButton" id="vol-add"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_vol_add_clicked" last_modification_time="Thu, 07 Aug 2008 03:19:43 GMT"/> + + <child> + <widget class="GtkAlignment" id="alignment9"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> <child> - <widget class="GtkLabel" id="label68"> + <widget class="GtkHBox" id="hbox13"> <property name="visible">True</property> - <property name="label" translatable="yes">Name:</property> - <property name="use_underline">False</property> - <property name="use_markup">False</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">1</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkImage" id="image8"> + <property name="visible">True</property> + <property name="stock">gtk-new</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="somelabel"> + <property name="visible">True</property> + <property name="label" translatable="yes">New Volume</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> </widget> - <packing> - <property name="left_attach">0</property> - <property name="right_attach">1</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="x_options">fill</property> - <property name="y_options"></property> - </packing> - </child> - - <child> - <widget class="GtkEntry" id="storage-name"> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="editable">False</property> - <property name="visibility">True</property> - <property name="max_length">0</property> - <property name="text" translatable="yes"></property> - <property name="has_frame">True</property> - <property name="invisible_char">â?¢</property> - <property name="activates_default">False</property> - <accessibility> - <atkproperty name="AtkObject::accessible_name" translatable="yes">Storage Name</atkproperty> - </accessibility> - </widget> - <packing> - <property name="left_attach">1</property> - <property name="right_attach">2</property> - <property name="top_attach">0</property> - <property name="bottom_attach">1</property> - <property name="y_options"></property> - </packing> </child> </widget> </child> </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> </child> <child> - <widget class="GtkLabel" id="label62"> + <widget class="GtkButton" id="vol-delete"> <property name="visible">True</property> - <property name="label" translatable="yes"><b>Basic details</b></property> - <property name="use_underline">False</property> - <property name="use_markup">True</property> - <property name="justify">GTK_JUSTIFY_LEFT</property> - <property name="wrap">False</property> - <property name="selectable">False</property> - <property name="xalign">0.5</property> - <property name="yalign">0.5</property> - <property name="xpad">0</property> - <property name="ypad">0</property> - <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> - <property name="width_chars">-1</property> - <property name="single_line_mode">False</property> - <property name="angle">0</property> + <property name="can_focus">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_vol_delete_clicked" last_modification_time="Thu, 07 Aug 2008 01:26:50 GMT"/> + + <child> + <widget class="GtkAlignment" id="alignment10"> + <property name="visible">True</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <property name="top_padding">0</property> + <property name="bottom_padding">0</property> + <property name="left_padding">0</property> + <property name="right_padding">0</property> + + <child> + <widget class="GtkHBox" id="hbox14"> + <property name="visible">True</property> + <property name="homogeneous">False</property> + <property name="spacing">2</property> + + <child> + <widget class="GtkImage" id="image9"> + <property name="visible">True</property> + <property name="stock">gtk-delete</property> + <property name="icon_size">4</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkLabel" id="label82"> + <property name="visible">True</property> + <property name="label" translatable="yes">Delete Volume</property> + <property name="use_underline">True</property> + <property name="use_markup">False</property> + <property name="justify">GTK_JUSTIFY_LEFT</property> + <property name="wrap">False</property> + <property name="selectable">False</property> + <property name="xalign">0.5</property> + <property name="yalign">0.5</property> + <property name="xpad">0</property> + <property name="ypad">0</property> + <property name="ellipsize">PANGO_ELLIPSIZE_NONE</property> + <property name="width_chars">-1</property> + <property name="single_line_mode">False</property> + <property name="angle">0</property> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + </widget> + </child> + </widget> + </child> </widget> <packing> - <property name="type">label_item</property> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> + </packing> + </child> + + <child> + <widget class="GtkButton" id="pool-apply"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="label">gtk-apply</property> + <property name="use_stock">True</property> + <property name="relief">GTK_RELIEF_NORMAL</property> + <property name="focus_on_click">True</property> + <signal name="clicked" handler="on_pool_apply_clicked" last_modification_time="Fri, 08 Aug 2008 01:11:49 GMT"/> + </widget> + <packing> + <property name="padding">0</property> + <property name="expand">False</property> + <property name="fill">False</property> </packing> </child> </widget> @@ -1923,47 +2460,10 @@ <property name="fill">True</property> </packing> </child> - - <child> - <widget class="GtkHSeparator" id="hseparator2"> - <property name="visible">True</property> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> - - <child> - <widget class="GtkHButtonBox" id="hbuttonbox2"> - <property name="border_width">6</property> - <property name="visible">True</property> - <property name="layout_style">GTK_BUTTONBOX_END</property> - <property name="spacing">3</property> - - <child> - <widget class="GtkButton" id="storage-apply"> - <property name="visible">True</property> - <property name="can_default">True</property> - <property name="can_focus">True</property> - <property name="label">gtk-apply</property> - <property name="use_stock">True</property> - <property name="relief">GTK_RELIEF_NORMAL</property> - <property name="focus_on_click">True</property> - </widget> - </child> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">False</property> - <property name="fill">False</property> - </packing> - </child> </widget> <packing> <property name="padding">0</property> - <property name="expand">True</property> + <property name="expand">False</property> <property name="fill">True</property> </packing> </child>
_______________________________________________ et-mgmt-tools mailing list et-mgmt-tools@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/et-mgmt-tools