Commit 24e8d783 authored by Christian Hergert's avatar Christian Hergert
Browse files

devices: make device GMenu private to IdeContext

We can't use a global GMenu since that will result in duplicate entries
when secondary workbenches are opened. This uses a private GMenu owned
by the IdeDeviceManager and uses that from the omnibar.
parent 1daa7b4f
......@@ -30,6 +30,7 @@
#include "devices/ide-deploy-strategy.h"
#include "devices/ide-device.h"
#include "devices/ide-device-manager.h"
#include "devices/ide-device-private.h"
#include "devices/ide-device-provider.h"
#include "local/ide-local-device.h"
#include "plugins/ide-extension-util.h"
......@@ -58,6 +59,14 @@ struct _IdeDeviceManager
*/
PeasExtensionSet *providers;
/*
* Our menu that contains our list of devices for the user to select. This
* is "per-IdeContext" so that it is not global to the system (which would
* result in duplicates for each workbench opened).
*/
GMenu *menu;
GMenu *menu_section;
/*
* Our progress in a deployment. Simplifies binding to the progress bar
* in the omnibar.
......@@ -121,7 +130,6 @@ ide_device_manager_provider_device_added_cb (IdeDeviceManager *self,
const gchar *display_name;
const gchar *icon_name;
const gchar *device_id;
GMenu *menu;
guint position;
IDE_ENTRY;
......@@ -141,15 +149,13 @@ ide_device_manager_provider_device_added_cb (IdeDeviceManager *self,
g_ptr_array_add (self->devices, g_object_ref (device));
/* Now add a new menu item to our selection model */
menu = dzl_application_get_menu_by_id (DZL_APPLICATION (IDE_APPLICATION_DEFAULT),
"ide-device-manager-menu-section");
menu_item = g_menu_item_new (display_name, NULL);
g_menu_item_set_attribute (menu_item, "id", "s", device_id);
g_menu_item_set_attribute (menu_item, "verb-icon-name", "s", icon_name ?: "computer-symbolic");
g_menu_item_set_action_and_target_value (menu_item,
"device-manager.device",
g_variant_new_string (device_id));
g_menu_append_item (menu, menu_item);
g_menu_append_item (self->menu_section, menu_item);
/* Now notify about the new device */
g_list_model_items_changed (G_LIST_MODEL (self), position, 0, 1);
......@@ -174,8 +180,7 @@ ide_device_manager_provider_device_removed_cb (IdeDeviceManager *self,
device_id = ide_device_get_id (device);
menu = dzl_application_get_menu_by_id (DZL_APPLICATION (IDE_APPLICATION_DEFAULT),
"ide-device-manager-menu-section");
menu = self->menu_section;
n_items = g_menu_model_get_n_items (G_MENU_MODEL (menu));
for (guint i = 0; i < n_items; i++)
......@@ -449,6 +454,8 @@ ide_device_manager_finalize (GObject *object)
IdeDeviceManager *self = (IdeDeviceManager *)object;
g_clear_pointer (&self->devices, g_ptr_array_unref);
g_clear_object (&self->menu);
g_clear_object (&self->menu_section);
G_OBJECT_CLASS (ide_device_manager_parent_class)->finalize (object);
}
......@@ -564,6 +571,10 @@ static void
ide_device_manager_init (IdeDeviceManager *self)
{
self->devices = g_ptr_array_new_with_free_func (g_object_unref);
self->menu = g_menu_new ();
self->menu_section = g_menu_new ();
g_menu_append_section (self->menu, _("Devices"), G_MENU_MODEL (self->menu_section));
}
/**
......@@ -988,3 +999,11 @@ ide_device_manager_get_progress (IdeDeviceManager *self)
return self->progress;
}
GMenu *
_ide_device_manager_get_menu (IdeDeviceManager *self)
{
g_return_val_if_fail (IDE_IS_DEVICE_MANAGER (self), NULL);
return self->menu;
}
/* ide-device-private.h
*
* Copyright 2018 Christian Hergert <chergert@redhat.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once
#include "ide-device-manager.h"
G_BEGIN_DECLS
GMenu *_ide_device_manager_get_menu (IdeDeviceManager *self);
G_END_DECLS
......@@ -247,9 +247,4 @@
</submenu>
</section>
</menu>
<menu id="ide-device-manager-menu">
<section id="ide-device-manager-menu-section">
<attribute name="label" translatable="yes">Devices</attribute>
</section>
</menu>
</interface>
......@@ -30,6 +30,7 @@
#include "config/ide-configuration.h"
#include "config/ide-configuration-manager.h"
#include "devices/ide-device-manager.h"
#include "devices/ide-device-private.h"
#include "projects/ide-project.h"
#include "runtimes/ide-runtime.h"
#include "util/ide-gtk.h"
......@@ -135,6 +136,7 @@ struct _IdeOmniBar
GtkButton *cancel_button;
GtkLabel *config_name_label;
GtkLabel *config_ready_label;
DzlMenuButton *device_button;
GtkStack *message_stack;
DzlListBox *pausables;
GtkPopover *popover;
......@@ -269,6 +271,7 @@ ide_omni_bar_context_set (GtkWidget *widget,
GListModel *pausables = NULL;
IdeProject *project = NULL;
IdeVcs *vcs = NULL;
GMenu *menu = NULL;
IDE_ENTRY;
......@@ -285,6 +288,7 @@ ide_omni_bar_context_set (GtkWidget *widget,
project = ide_context_get_project (context);
pausables = _ide_context_get_pausables (context);
device_manager = ide_context_get_device_manager (context);
menu = _ide_device_manager_get_menu (device_manager);
}
dzl_binding_group_set_source (self->build_manager_bindings, build_manager);
......@@ -294,6 +298,7 @@ ide_omni_bar_context_set (GtkWidget *widget,
dzl_binding_group_set_source (self->project_bindings, project);
dzl_binding_group_set_source (self->vcs_bindings, vcs);
dzl_list_box_set_model (self->pausables, pausables);
dzl_menu_button_set_model (self->device_button, G_MENU_MODEL (menu));
if (config_manager != NULL)
{
......@@ -638,6 +643,7 @@ ide_omni_bar_class_init (IdeOmniBarClass *klass)
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, cancel_button);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, config_name_label);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, config_ready_label);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, device_button);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, event_box);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, message_stack);
gtk_widget_class_bind_template_child (widget_class, IdeOmniBar, pausables);
......
......@@ -6,7 +6,6 @@
</style>
<child>
<object class="DzlMenuButton" id="device_button">
<property name="menu-id">ide-device-manager-menu</property>
<property name="icon-name">computer-symbolic</property>
<property name="focus-on-click">false</property>
<property name="show-arrow">false</property>
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment