Skip to content

Commit 9d94242

Browse files
committed
Replace tooltip with delayed popover (#422)
1 parent 51275cc commit 9d94242

File tree

2 files changed

+58
-9
lines changed

2 files changed

+58
-9
lines changed

data/Application.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ launcher progressbar progress {
6464
min-width: 0;
6565
}
6666

67+
launcher .app-info {
68+
padding: 1em;
69+
}
70+
6771
backgrounditem,
6872
icongroup {
6973
padding: 6px;

src/AppSystem/Launcher.vala

Lines changed: 54 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
public class Dock.Launcher : BaseItem {
77
private const int DND_TIMEOUT = 1000;
8+
private const int POPOVER_NAME_TIMEOUT = 500;
89

910
private static Settings? notify_settings;
1011

@@ -30,7 +31,10 @@ public class Dock.Launcher : BaseItem {
3031
private Gtk.Revealer badge_revealer;
3132
private Adw.TimedAnimation bounce_up;
3233
private Adw.TimedAnimation bounce_down;
33-
private Gtk.PopoverMenu popover;
34+
private Gtk.PopoverMenu popover_menu;
35+
private Gtk.Popover popover_name;
36+
37+
private Gtk.EventControllerMotion motion_controller;
3438

3539
private Gtk.Image? second_running_indicator;
3640
private bool multiple_windows_open {
@@ -53,6 +57,8 @@ public class Dock.Launcher : BaseItem {
5357
private uint queue_dnd_cycle_id = 0;
5458

5559
private bool flagged_for_removal = false;
60+
private bool timeout_is_running = false;
61+
private bool is_hover = false;
5662

5763
public Launcher (App app) {
5864
Object (app: app, group: Group.LAUNCHER);
@@ -63,11 +69,26 @@ public class Dock.Launcher : BaseItem {
6369
}
6470

6571
construct {
66-
popover = new Gtk.PopoverMenu.from_model (app.menu_model) {
72+
popover_menu = new Gtk.PopoverMenu.from_model (app.menu_model) {
6773
autohide = true,
6874
position = TOP
6975
};
70-
popover.set_parent (this);
76+
popover_menu.set_parent (this);
77+
78+
var display_name = app.app_info.get_display_name ();
79+
var name_label = new Gtk.Label (display_name);
80+
name_label.add_css_class ("app-info");
81+
popover_name = new Gtk.Popover () {
82+
position = TOP,
83+
child = name_label,
84+
autohide = false
85+
};
86+
popover_name.set_parent (this);
87+
88+
motion_controller = new Gtk.EventControllerMotion ();
89+
motion_controller.enter.connect (on_enter);
90+
motion_controller.leave.connect (on_leave);
91+
add_controller (motion_controller);
7192

7293
image = new Gtk.Image ();
7394

@@ -99,8 +120,6 @@ public class Dock.Launcher : BaseItem {
99120
overlay.add_overlay (badge_revealer);
100121
overlay.add_overlay (progress_revealer);
101122

102-
tooltip_text = app.app_info.get_display_name ();
103-
104123
insert_action_group (ACTION_GROUP_PREFIX, app.action_group);
105124

106125
// We have to destroy the progressbar when it is not needed otherwise it will
@@ -154,7 +173,10 @@ public class Dock.Launcher : BaseItem {
154173
gesture_click.released.connect (on_click_released);
155174

156175
var long_press = new Gtk.GestureLongPress ();
157-
long_press.pressed.connect (popover.popup);
176+
long_press.pressed.connect (() => {
177+
popover_menu.popup ();
178+
popover_name.popdown ();
179+
});
158180
add_controller (long_press);
159181

160182
var scroll_controller = new Gtk.EventControllerScroll (VERTICAL);
@@ -200,8 +222,10 @@ public class Dock.Launcher : BaseItem {
200222
}
201223

202224
~Launcher () {
203-
popover.unparent ();
204-
popover.dispose ();
225+
popover_menu.unparent ();
226+
popover_menu.dispose ();
227+
popover_name.unparent ();
228+
popover_name.dispose ();
205229
}
206230

207231
/**
@@ -232,7 +256,8 @@ public class Dock.Launcher : BaseItem {
232256
}
233257
break;
234258
case Gdk.BUTTON_SECONDARY:
235-
popover.popup ();
259+
popover_menu.popup ();
260+
popover_name.popdown ();
236261
break;
237262
}
238263
}
@@ -328,4 +353,24 @@ public class Dock.Launcher : BaseItem {
328353
multiple_windows_open = app.windows.length > 1;
329354
}
330355
}
356+
357+
private void on_enter (Gtk.EventControllerMotion controller, double event_x, double event_y) {
358+
if (!timeout_is_running) {
359+
Timeout.add_once (POPOVER_NAME_TIMEOUT, show_popover_name);
360+
}
361+
timeout_is_running = true;
362+
is_hover = true;
363+
}
364+
365+
private void on_leave (Gtk.EventControllerMotion controller) {
366+
popover_name.popdown ();
367+
is_hover = false;
368+
}
369+
370+
private void show_popover_name () {
371+
timeout_is_running = false;
372+
if (!popover_menu.visible && is_hover) {
373+
popover_name.popup ();
374+
}
375+
}
331376
}

0 commit comments

Comments
 (0)