diff options
Diffstat (limited to 'core/plugin')
-rw-r--r-- | core/plugin/change_account/change_account.rb | 4 | ||||
-rw-r--r-- | core/plugin/gtk/world_shifter.rb | 122 |
2 files changed, 80 insertions, 46 deletions
diff --git a/core/plugin/change_account/change_account.rb b/core/plugin/change_account/change_account.rb index dfe0f8f2..80472b25 100644 --- a/core/plugin/change_account/change_account.rb +++ b/core/plugin/change_account/change_account.rb @@ -54,7 +54,7 @@ Plugin.create :change_account do btn_add = Gtk::Button.new(Gtk::Stock::ADD) btn_delete = Gtk::Button.new(Gtk::Stock::DELETE) btn_add.ssc(:clicked) do - boot_wizard + Plugin.call(:request_world_add) true end btn_delete.ssc(:clicked) do @@ -70,7 +70,7 @@ Plugin.create :change_account do add(btn_add))) end - def boot_wizard + on_request_world_add do dialog(_('アカウント追加')){ select 'Select world', :world do worlds, = Plugin.filtering(:world_setting_list, Hash.new) diff --git a/core/plugin/gtk/world_shifter.rb b/core/plugin/gtk/world_shifter.rb index b0ecffd9..7839e40c 100644 --- a/core/plugin/gtk/world_shifter.rb +++ b/core/plugin/gtk/world_shifter.rb @@ -6,60 +6,24 @@ class Gtk::WorldShifter < Gtk::EventBox UserConfig[:gtk_accountbox_geometry] ||= 32 def initialize - Plugin[:gtk].on_primary_service_changed(&method(:travel)) super - Plugin[:gtk].on_userconfig_modify do |key, newval| - refresh if key == :world_shifter_visibility - end - Plugin[:gtk].on_service_registered do |service| - refresh - end - Plugin[:gtk].on_service_destroyed do |service| - refresh - end ssc(:button_press_event) do |this,event| open_menu event if 3 >= event.button false end ssc_atonce(:realize) do - travel Service.primary + refresh end + pluggaloid_event_listener end def refresh - if visible? - if not @face - @face = Gtk::Image.new(Skin['loading.png'].pixbuf(width: UserConfig[:gtk_accountbox_geometry], height: UserConfig[:gtk_accountbox_geometry])) - self.add(@face).show_all - end - else - if @face - self.remove(@face) - @face.destroy - @face = nil - end - end - end - - def travel(world) - refresh - if @face - transaction = @world_transaction = SecureRandom.uuid - rect = { width: UserConfig[:gtk_accountbox_geometry], - height: UserConfig[:gtk_accountbox_geometry] } - @face.pixbuf = world&.icon&.load_pixbuf(**rect) do |pixbuf| - if transaction == @world_transaction - @face.pixbuf = pixbuf - end - end || Skin['notfound.png'].pixbuf(**rect) - end + destroy_menu + put_face + modify_face end def open_menu(event) - @menu_last_services ||= Service.to_a.hash - if @menu_last_services != Service.to_a.hash - @menu.destroy if @menu - @menu_last_services = @menu = nil end @menu ||= Gtk::Menu.new.tap do |menu| Enumerator.new{|y| Plugin.filtering(:worlds, y) @@ -69,9 +33,50 @@ class Gtk::WorldShifter < Gtk::EventBox item.ssc(:activate) { |w| Plugin.call(:world_change_current, world) false } - menu.append item end - menu end - @menu.show_all.popup(nil, nil, event.button, event.time) end + menu.append item + end + menu.append Gtk::SeparatorMenuItem.new + item = Gtk::ImageMenuItem.new(Plugin[:gtk]._('Worldを追加'), false) + item.set_image Gtk::WebIcon.new(Skin['add.png'], UserConfig[:gtk_accountbox_geometry], UserConfig[:gtk_accountbox_geometry]) + item.ssc(:activate) { |w| + Plugin.call(:request_world_add) + false } + menu.append item + menu + end + @menu.show_all.popup(nil, nil, event.button, event.time) + end + + def destroy_menu + @menu&.destroy + @menu = nil + end + + def pluggaloid_event_listener + tag = Plugin[:gtk].handler_tag(:world_shifter) do + Plugin[:gtk].on_world_change_current(&method(:refresh)) + Plugin[:gtk].on_userconfig_modify do |key, newval| + refresh if key == :world_shifter_visibility + end + Plugin[:gtk].on_world_create do |world| + refresh + end + Plugin[:gtk].on_world_destroy do |world| + refresh + end + end + ssc(:destroy) do + Plugin[:gtk].detach(tag) + end + end + + def put_face + if visible? + add_face_widget_ifn + else + remove_face_widget_ifn + end + end def visible? case UserConfig[:world_shifter_visibility] @@ -83,4 +88,33 @@ class Gtk::WorldShifter < Gtk::EventBox false end end + + def modify_face + if @face + world, = Plugin.filtering(:world_current, nil) + transaction = @world_transaction = SecureRandom.uuid + rect = { width: UserConfig[:gtk_accountbox_geometry], + height: UserConfig[:gtk_accountbox_geometry] } + @face.pixbuf = world&.icon&.load_pixbuf(**rect) do |pixbuf| + if transaction == @world_transaction + @face.pixbuf = pixbuf + end + end || Skin['add.png'].pixbuf(**rect) + end + end + + def add_face_widget_ifn + if not @face + @face = Gtk::Image.new(Skin['loading.png'].pixbuf(width: UserConfig[:gtk_accountbox_geometry], height: UserConfig[:gtk_accountbox_geometry])) + self.add(@face).show_all + end + end + + def remove_face_widget_ifn + if @face + self.remove(@face) + @face.destroy + @face = nil + end + end end |