Skip to content

Commit

Permalink
redesign device map dialog and refactor it to own class (bnc#900807)
Browse files Browse the repository at this point in the history
  • Loading branch information
jreidinger committed Oct 15, 2014
1 parent 2aa6947 commit 3e155ba
Show file tree
Hide file tree
Showing 5 changed files with 185 additions and 197 deletions.
170 changes: 0 additions & 170 deletions src/include/bootloader/grub/options.rb
Expand Up @@ -85,176 +85,6 @@ def passwd_content
)
end


def InitDiskOrder(widget)
disksOrder = BootStorage.DisksOrder

UI.ChangeWidget(Id(:disks), :Items, disksOrder)
UI.ChangeWidget(Id(:disks), :CurrentItem, Ops.get(disksOrder, 0, ""))

nil
end

def GetItemID(t)
t = deep_copy(t)
Ops.get_string(
Builtins.argsof(Ops.get_term(Builtins.argsof(t), 0) { Id("") }),
0,
""
)
end

def StoreDiskOrder(widget, event)
event = deep_copy(event)
disksOrder = Convert.convert(
UI.QueryWidget(Id(:disks), :Items),
:from => "any",
:to => "list <term>"
)
result = Builtins.maplist(disksOrder) { |t| GetItemID(t) }
BootCommon.mbrDisk = Ops.get(result, 0, "")
index = 0
BootStorage.device_mapping = Builtins.listmap(result) do |d|
indexs = Builtins.tostring(index)
index = Ops.add(index, 1)
{ d => Builtins.sformat("hd%1", indexs) }
end

nil
end

def NewDevicePopup
popup = VBox(
VSpacing(1),
# textentry header
InputField(Id(:devname), Opt(:hstretch), _("&Device")),
VSpacing(1),
HBox(
HStretch(),
PushButton(Id(:ok), Opt(:key_F10, :default), Label.OKButton),
HStretch(),
PushButton(Id(:cancel), Opt(:key_F8), Label.CancelButton),
HStretch()
),
VSpacing(1)
)
UI.OpenDialog(popup)
UI.SetFocus(:devname)
pushed = UI.UserInput
new_dev = UI.QueryWidget(Id(:devname), :Value)
UI.CloseDialog

pushed == :ok ? new_dev : ""
end


def HandleDiskOrder(widget, event)
action = event["ID"]
changed = false
disksOrder = UI.QueryWidget(Id(:disks), :Items)
current = UI.QueryWidget(Id(:disks), :CurrentItem)
pos = 0
while pos < disksOrder.size &&
GetItemID(disksOrder[pos] || term(:Item, Id(""))) != current
pos += 1
end
Builtins.y2debug("Calling handle disk order with action #{action} and selected on pos #{pos}")


case action
when :up
changed = true
# swap elements
disksOrder.insert(pos - 1, disksOrder.delete_at(pos))
pos -= 1
when :down
changed = true
# swap elements
disksOrder.insert(pos + 1, disksOrder.delete_at(pos))
pos += 1
when :delete
changed = true
disksOrder = Builtins.remove(disksOrder, pos)
pos = pos > 0 ? pos -1 : 0
UI.ChangeWidget(
Id(:disks),
:CurrentItem,
GetItemID(disksOrder[pos] || term(:Item, Id("")))
)
when :add
new_dev = NewDevicePopup()
if new_dev != ""
changed = true
disksOrder << Item(Id(new_dev), new_dev)
end
end

#disabling & enabling up/down, do it after change
UI.ChangeWidget(Id(:up), :Enabled, pos > 0 && pos < disksOrder.size)
UI.ChangeWidget(Id(:down), :Enabled, pos < disksOrder.size - 1)

UI.ChangeWidget(Id(:disks), :Items, disksOrder) if changed

nil
end

def ValidateDiskOrder(key, event)
event = deep_copy(event)
disksOrder = Convert.convert(
UI.QueryWidget(Id(:disks), :Items),
:from => "any",
:to => "list <term>"
)
return true if Ops.greater_than(Builtins.size(disksOrder), 0)
Popup.Warning(_("Device map must contain at least one device"))
false
end

def DisksOrderWidget
contents = HBox(
HSpacing(2),
VBox(
VSpacing(1),
SelectionBox(Id(:disks), Opt(:notify), _("D&isks"), []),
HBox(
HStretch(),
PushButton(Id(:add), Opt(:key_F3), Label.AddButton),
PushButton(Id(:delete), Opt(:key_F5), Label.DeleteButton),
HStretch()
),
VSpacing(1)
),
HSquash(
VBox(
VStretch(),
PushButton(Id(:up), Opt(:hstretch), _("&Up")),
PushButton(Id(:down), Opt(:hstretch), _("&Down")),
VStretch()
)
),
HSpacing(2)
)
{
"widget" => :custom,
"custom_widget" => contents,
"init" => fun_ref(method(:InitDiskOrder), "void (string)"),
"handle" => fun_ref(
method(:HandleDiskOrder),
"symbol (string, map)"
),
"store" => fun_ref(
method(:StoreDiskOrder),
"void (string, map)"
),
"help" => Ops.get(@grub_help_messages, "disk_order", ""),
"validate_type" => :function,
"validate_function" => fun_ref(
method(:ValidateDiskOrder),
"boolean (string, map)"
)
}
end

# Init function of a widget
# @param [String] widget string widget key
def InitBootLoaderLocationWidget(widget)
Expand Down
22 changes: 0 additions & 22 deletions src/include/bootloader/grub2/dialogs.rb
Expand Up @@ -213,28 +213,6 @@ def grub2SecureBootWidget
}
end

# Run dialog to adjust installation on i386 and AMD64
# @return [Symbol] for wizard sequencer
def Grub2InstallDetailsDialog
contents = HBox(
HStretch(),
VBox(VStretch(), Frame(_("Disk Order"), "disks_order"), VStretch()),
HStretch()
)

CWM.ShowAndRun(
{
"widget_descr" => { "disks_order" => DisksOrderWidget() },
"widget_names" => ["disks_order"],
"contents" => contents,
"caption" => _("Disk order settings"),
"back_button" => Label.BackButton,
"abort_button" => Label.CancelButton,
"next_button" => Label.OKButton
}
)
end

def ppc_location_init(widget)
UI::ChangeWidget(
Id("boot_custom_list"),
Expand Down
183 changes: 183 additions & 0 deletions src/lib/bootloader/device_map_dialog.rb
@@ -0,0 +1,183 @@
require "yast"

Yast.import "BootCommon"
Yast.import "BootStorage"
Yast.import "Label"
Yast.import "Popup"

module Bootloader
class DeviceMapDialog
include Yast::UIShortcuts
include Yast::I18n

def self.run
new.run
end

def run
return unless create_dialog

begin
return controller_loop
ensure
close_dialog
end

end
private


def create_dialog
Yast::UI.OpenDialog dialog_content
refresh_buttons
end

def close_dialog
Yast::UI.CloseDialog
end

def controller_loop
while true do
input = Yast::UI.UserInput
pos = selected_disk_index
case input
when :ok
if disks.empty?
Yast::Popup.Error(_("Device map must contain at least one device"))
next
end
store_order
return :back # we just go back to original dialog
when :cancel
return :back
when :up
disks.insert(pos - 1, disks.delete_at(pos))
pos -= 1
when :down
disks.insert(pos + 1, disks.delete_at(pos))
pos += 1
when :delete
disks.delete_at(pos)
pos = pos == disks.size ? pos -1 : pos
when :add
disk = add_device_popup
disks << disk if disk
pos = disks.size - 1
when :disks
refresh_buttons
next
else
raise "Unknown action #{input}"
end
refresh_disks
Yast::UI.ChangeWidget(Id(:disks), :CurrentItem, disks[pos])
refresh_buttons
end
end

def dialog_content
VBox(
headings,
VSpacing(1),
contents,
VSpacing(1),
ending_buttons
)
end

def headings
Heading(_("Disk order settings"))
end

def contents
HBox(
SelectionBox(Id(:disks), Opt(:notify), _("D&isks"), disks),
action_buttons
)
end

def action_buttons
VBox(
PushButton(Id(:add), Opt(:key_F3), Yast::Label.AddButton),
PushButton(Id(:delete), Opt(:key_F5), Yast::Label.DeleteButton),
VSpacing(1),
PushButton(Id(:up), Opt(:hstretch), Yast::Label.UpButton),
PushButton(Id(:down), Opt(:hstretch), Yast::Label.DownButton),
VStretch()
)
end

def ending_buttons
ButtonBox(
PushButton(Id(:ok), Yast::Label.OKButton),
PushButton(Id(:cancel), Yast::Label.CancelButton)
)
end

def disks
@disks ||= Yast::BootStorage.DisksOrder
end

def refresh_disks
Yast::UI.ChangeWidget(Id(:disks), :Items, disks)
end

def store_order
Yast::BootCommon.mbrDisk = disks.first

mapping = disks.reduce({}) do |res, disk|
res[disk] = "hd#{res.size}"
res
end

Yast::BootStorage.device_mapping = mapping
end

def add_device_popup
popup = VBox(
VSpacing(1),
# textentry header
InputField(Id(:devname), Opt(:hstretch), _("&Device")),
VSpacing(1),
ButtonBox(
PushButton(Id(:ok), Opt(:key_F10, :default), Yast::Label.OKButton),
PushButton(Id(:cancel), Opt(:key_F8), Yast::Label.CancelButton),
),
VSpacing(1)
)
Yast::UI.OpenDialog(popup)
Yast::UI.SetFocus(:devname)
pushed = Yast::UI.UserInput
new_dev = Yast::UI.QueryWidget(Id(:devname), :Value)
Yast::UI.CloseDialog

pushed == :ok ? new_dev : nil
end

def selected_disk_index
disks.index(Yast::UI.QueryWidget(Id(:disks), :CurrentItem))
end

def refresh_buttons
pos = selected_disk_index
if !pos #nothing selected
disk_to_select = disks.first
# there is no disks
if !disk_to_select
up_down_enablement(false, false)
return
end
Yast::UI.ChangeWidget(Id(:disks), :CurrentItem, disk_to_select)
refresh_buttons
return
end

up_down_enablement(pos > 0, pos < (disks.size - 1))
end

def up_down_enablement(up, down)
Yast::UI.ChangeWidget(Id(:up), :Enabled, up)
Yast::UI.ChangeWidget(Id(:down), :Enabled, down)
end
end
end

0 comments on commit 3e155ba

Please sign in to comment.