addhw: Simplify chardev UI

The previous UI was a ugly and the doc text wasn't particularly helpful,
just make it work like the other UI.
This commit is contained in:
Cole Robinson 2013-09-09 12:48:17 -04:00
parent 2e4685590f
commit 32c990dc29
2 changed files with 260 additions and 442 deletions

View File

@ -1460,379 +1460,81 @@ to connect to the virtual machine.</property>
<property name="border_width">1</property>
<property name="spacing">6</property>
<child>
<object class="GtkAlignment" id="alignment7">
<object class="GtkAlignment" id="alignment9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">2</property>
<property name="left_padding">24</property>
<child>
<object class="GtkHBox" id="hbox3">
<object class="GtkGrid" id="char-table">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<property name="row_spacing">6</property>
<property name="column_spacing">6</property>
<child>
<object class="GtkVBox" id="vbox7">
<object class="GtkEntry" id="char-path">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="char-use-telnet">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">6</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="char-mode">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">12</property>
<property name="halign">start</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkFrame" id="frame7">
<object class="GtkEntry" id="char-host">
<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="alignment8">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">2</property>
<property name="left_padding">24</property>
<child>
<object class="GtkTable" id="table4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_columns">2</property>
<property name="column_spacing">12</property>
<property name="row_spacing">6</property>
<child>
<object class="GtkComboBox" id="char-device-type">
<property name="visible">True</property>
<property name="can_focus">False</property>
<signal name="changed" handler="on_char_device_type_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Device _Type:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-device-type</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label12">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Character Device&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkFrame" id="char-param-box">
<object class="GtkLabel" id="char-port-label">
<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="alignment9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="top_padding">2</property>
<property name="left_padding">24</property>
<child>
<object class="GtkTable" id="char-param-table">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="n_rows">6</property>
<property name="n_columns">2</property>
<property name="column_spacing">8</property>
<child>
<object class="GtkEntry" id="char-path">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="focus-in-event" handler="char_path_focus_in" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="char-target-name">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="focus-in-event" handler="char_name_focus_in" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="right_attach">2</property>
<property name="top_attach">5</property>
<property name="bottom_attach">6</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-target-name-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">6</property>
<property name="label" translatable="yes">_Name:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-target-name</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">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkCheckButton" id="char-use-telnet">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="xalign">0.5</property>
<property name="draw_indicator">True</property>
<signal name="focus-in-event" handler="char_telnet_focus_in" swapped="no"/>
</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="y_options"/>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-use-telnet-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">6</property>
<property name="label" translatable="yes">Use Te_lnet:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-use-telnet</property>
</object>
<packing>
<property name="top_attach">4</property>
<property name="bottom_attach">5</property>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="char-mode">
<property name="visible">True</property>
<property name="can_focus">False</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="GtkLabel" id="char-bind-host-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">8</property>
<property name="label" translatable="yes">_Bind Host:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-bind-host</property>
</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">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-path-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">8</property>
<property name="label" translatable="yes">_Path:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-path</property>
</object>
<packing>
<property name="x_options">GTK_FILL</property>
<property name="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-host-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">8</property>
<property name="label" translatable="yes">H_ost:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-host</property>
</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">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox4">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="char-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="focus-in-event" handler="char_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-port-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Port:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-port</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="char-port">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment3</property>
<signal name="focus-in-event" handler="char_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</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="y_options">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="char-bind-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
<signal name="focus-in-event" handler="char_bind_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-bind-port-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Po_rt:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-bind-port</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="char-bind-port">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment2</property>
<signal name="focus-in-event" handler="char_bind_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</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">GTK_FILL</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-mode-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="ypad">8</property>
<property name="label" translatable="yes">_Mode:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-mode</property>
</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">GTK_FILL</property>
</packing>
</child>
</object>
</child>
</object>
</child>
<child type="label">
<object class="GtkLabel" id="label43">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">&lt;b&gt;Device Parameters&lt;/b&gt;</property>
<property name="use_markup">True</property>
</object>
</child>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Port:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-port</property>
</object>
<packing>
<property name="expand">False</property>
@ -1840,42 +1542,214 @@ to connect to the virtual machine.</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="GtkAlignment" id="alignment10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkEventBox" id="char-info-box">
<object class="GtkSpinButton" id="char-port">
<property name="visible">True</property>
<property name="can_focus">False</property>
<child>
<object class="GtkLabel" id="char-info">
<property name="width_request">150</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
<property name="xpad">3</property>
<property name="ypad">6</property>
<property name="label" translatable="yes">label</property>
<property name="wrap">True</property>
<property name="max_width_chars">20</property>
</object>
</child>
<property name="can_focus">True</property>
<property name="adjustment">adjustment3</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">1</property>
<property name="left_attach">1</property>
<property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkHBox" id="hbox10">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="spacing">6</property>
<child>
<object class="GtkEntry" id="char-bind-host">
<property name="visible">True</property>
<property name="can_focus">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-bind-port-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Po_rt:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-bind-port</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSpinButton" id="char-bind-port">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment2</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">5</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-path-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Path:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-path</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">2</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-mode-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Mode:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-mode</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">3</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-host-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">H_ost:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-host</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">4</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-bind-host-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Bind Host:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-bind-host</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">5</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-use-telnet-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Use Te_lnet:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-use-telnet</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">6</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="label9">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">Device _Type:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-device-type</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkComboBox" id="char-device-type">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">start</property>
<signal name="changed" handler="on_char_device_type_changed" swapped="no"/>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">0</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="char-target-name-label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="xalign">0</property>
<property name="label" translatable="yes">_Name:</property>
<property name="use_underline">True</property>
<property name="mnemonic_widget">char-target-name</property>
</object>
<packing>
<property name="left_attach">0</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="char-target-name">
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">●</property>
</object>
<packing>
<property name="left_attach">1</property>
<property name="top_attach">1</property>
<property name="width">1</property>
<property name="height">1</property>
</packing>
</child>
</object>
@ -2633,7 +2507,6 @@ access in the guest.</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="invisible_char">•</property>
<signal name="focus-in-event" handler="char_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
@ -2662,7 +2535,6 @@ access in the guest.</property>
<property name="can_focus">True</property>
<property name="adjustment">adjustment1</property>
<property name="climb_rate">1</property>
<signal name="focus-in-event" handler="char_host_focus_in" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>

View File

@ -59,8 +59,6 @@ char_widget_mappings = {
"source_path" : "char-path",
"source_mode" : "char-mode",
"source_host" : "char-host",
"source_port" : "char-port",
"bind_port" : "char-bind-port",
"bind_host" : "char-bind-host",
"protocol" : "char-use-telnet",
"target_name" : "char-target-name",
@ -107,16 +105,6 @@ class vmmAddHardware(vmmGObjectUI):
"on_fs_source_browse_clicked": self.browse_fs_source,
"on_usbredir_type_changed": self.change_usbredir_type,
# Char dev info signals
"char_device_type_focus": self.update_doc_char_type,
"char_path_focus_in": self.update_doc_char_source_path,
"char_mode_changed": self.update_doc_char_source_mode,
"char_mode_focus" : self.update_doc_char_source_mode,
"char_host_focus_in": self.update_doc_char_source_host,
"char_bind_host_focus_in": self.update_doc_char_bind_host,
"char_telnet_focus_in": self.update_doc_char_protocol,
"char_name_focus_in": self.update_doc_char_target_name,
})
self.bind_escape_key_close()
@ -129,38 +117,6 @@ class vmmAddHardware(vmmGObjectUI):
hwlist = self.widget("hardware-list")
hwlist.get_selection().connect("changed", self.hw_selected)
def _update_doc(self, param):
doc = self._build_doc_str(param)
self.widget("char-info").set_markup(doc)
def update_doc_char_type(self, *ignore):
return self._update_doc("type")
def update_doc_char_source_path(self, *ignore):
return self._update_doc("source_path")
def update_doc_char_source_mode(self, *ignore):
return self._update_doc("source_mode")
def update_doc_char_source_host(self, *ignore):
return self._update_doc("source_host")
def update_doc_char_bind_host(self, *ignore):
return self._update_doc("bind_host")
def update_doc_char_protocol(self, *ignore):
return self._update_doc("protocol")
def update_doc_char_target_name(self, *ignore):
return self._update_doc("target_name")
def _build_doc_str(self, param, docstr=None):
doctmpl = "<i>%s</i>"
if docstr:
return doctmpl % (docstr)
elif not self._dev:
return ""
propdoc = getattr(self._dev.all_xml_props()[param], "__doc__")
if propdoc:
return doctmpl % propdoc
return ""
def show(self, parent):
logging.debug("Showing addhw")
self.reset_state()
@ -314,9 +270,6 @@ class vmmAddHardware(vmmGObjectUI):
desc = VirtualSerialDevice.pretty_mode(t)
char_mode_model.append([t, desc + " (%s)" % t])
self.widget("char-info-box").modify_bg(Gtk.StateType.NORMAL,
Gdk.Color.parse("grey")[1])
# Watchdog widgets
combo = self.widget("watchdog-model")
uihelpers.build_watchdogmodel_combo(self.vm, combo)
@ -1014,7 +967,6 @@ class vmmAddHardware(vmmGObjectUI):
self.widget("tpm-param-box").set_visible(show_something)
def change_char_device_type(self, src):
self._update_doc("type")
idx = src.get_active()
if idx < 0:
return
@ -1026,16 +978,10 @@ class vmmAddHardware(vmmGObjectUI):
self._dev = char_class(conn)
self._dev.type = devtype
show_something = False
for param_name, widget_name in char_widget_mappings.items():
make_visible = self._dev.supports_property(param_name)
if make_visible:
show_something = True
self.widget(widget_name).set_visible(make_visible)
self.widget(widget_name + "-label").set_visible(make_visible)
self.widget("char-param-box").set_visible(show_something)
uihelpers.set_grid_row_visible(self.widget(widget_name + "-label"),
make_visible)
has_mode = self._dev.supports_property("source_mode")
if has_mode and self.widget("char-mode").get_active() == -1: