Some fixes and polishes around modal toggling and area disabling.

* Close menu before toggling modal (before because the menu changes `Main.actionMode`).
* Hide the helper and update the grid display when toggling modal.
* Signal `stop-drawing` -> `leave-drawing-mode` for consistence.
* `area.disable` -> area `destroy` event handler.
* `area.isInDrawingMode` -> `area.reactive`.
This commit is contained in:
abakkk 2020-06-22 11:56:34 +02:00
parent 98832cec72
commit 0b8786eaa0
2 changed files with 34 additions and 23 deletions

47
draw.js
View File

@ -120,11 +120,14 @@ var DrawingArea = new Lang.Class({
Name: 'DrawOnYourScreenDrawingArea', Name: 'DrawOnYourScreenDrawingArea',
Extends: St.DrawingArea, Extends: St.DrawingArea,
Signals: { 'show-osd': { param_types: [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_DOUBLE] }, Signals: { 'show-osd': { param_types: [GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_STRING, GObject.TYPE_DOUBLE] },
'stop-drawing': {} }, 'leave-drawing-mode': {} },
_init: function(params, monitor, helper, loadPersistent) { _init: function(params, monitor, helper, loadPersistent) {
this.parent({ style_class: 'draw-on-your-screen', name: params.name}); this.parent({ style_class: 'draw-on-your-screen', name: params.name});
this.connect('destroy', this._onDestroy.bind(this));
this.reactiveHandler = this.connect('notify::reactive', this._onReactiveChanged.bind(this));
this.settings = Convenience.getSettings(); this.settings = Convenience.getSettings();
this.monitor = monitor; this.monitor = monitor;
this.helper = helper; this.helper = helper;
@ -151,6 +154,11 @@ var DrawingArea = new Lang.Class({
return this._menu; return this._menu;
}, },
closeMenu: function() {
if (this._menu)
this._menu.close();
},
get currentTool() { get currentTool() {
return this._currentTool; return this._currentTool;
}, },
@ -251,7 +259,7 @@ var DrawingArea = new Lang.Class({
cr.restore(); cr.restore();
} }
if (this.isInDrawingMode && this.hasGrid && this.gridGap && this.gridGap >= 1) { if (this.reactive && this.hasGrid && this.gridGap && this.gridGap >= 1) {
cr.save(); cr.save();
Clutter.cairo_set_source_color(cr, this.gridColor); Clutter.cairo_set_source_color(cr, this.gridColor);
@ -392,7 +400,7 @@ var DrawingArea = new Lang.Class({
if (this.helper.visible) if (this.helper.visible)
this.helper.hideHelp(); this.helper.hideHelp();
else else
this.emit('stop-drawing'); this.emit('leave-drawing-mode');
return Clutter.EVENT_STOP; return Clutter.EVENT_STOP;
} else { } else {
@ -867,23 +875,33 @@ var DrawingArea = new Lang.Class({
this.helper.showHelp(); this.helper.showHelp();
}, },
// The area is reactive when it is modal.
_onReactiveChanged: function() {
if (this.hasGrid)
this._redisplay();
if (this.helper.visible)
this.helper.hideHelp();
},
_onDestroy: function() {
this.disconnect(this.reactiveHandler);
this.erase();
if (this._menu)
this._menu.disable();
},
enterDrawingMode: function() { enterDrawingMode: function() {
this.isInDrawingMode = true;
this.stageKeyPressedHandler = global.stage.connect('key-press-event', this._onStageKeyPressed.bind(this)); this.stageKeyPressedHandler = global.stage.connect('key-press-event', this._onStageKeyPressed.bind(this));
this.stageKeyReleasedHandler = global.stage.connect('key-release-event', this._onStageKeyReleased.bind(this)); this.stageKeyReleasedHandler = global.stage.connect('key-release-event', this._onStageKeyReleased.bind(this));
this.keyPressedHandler = this.connect('key-press-event', this._onKeyPressed.bind(this)); this.keyPressedHandler = this.connect('key-press-event', this._onKeyPressed.bind(this));
this.buttonPressedHandler = this.connect('button-press-event', this._onButtonPressed.bind(this)); this.buttonPressedHandler = this.connect('button-press-event', this._onButtonPressed.bind(this));
this._onKeyboardPopupMenuHandler = this.connect('popup-menu', this._onKeyboardPopupMenu.bind(this)); this._onKeyboardPopupMenuHandler = this.connect('popup-menu', this._onKeyboardPopupMenu.bind(this));
this.scrollHandler = this.connect('scroll-event', this._onScroll.bind(this)); this.scrollHandler = this.connect('scroll-event', this._onScroll.bind(this));
this.get_parent().set_background_color(this.hasBackground ? this.activeBackgroundColor : null); this.get_parent().set_background_color(this.reactive && this.hasBackground ? this.activeBackgroundColor : null);
if (this.hasGrid)
// redisplay to show the grid before updating the style because _updateStyle is long.
this._redisplay();
this._updateStyle(); this._updateStyle();
}, },
leaveDrawingMode: function(save) { leaveDrawingMode: function(save) {
this.isInDrawingMode = false;
if (this.stageKeyPressedHandler) { if (this.stageKeyPressedHandler) {
global.stage.disconnect(this.stageKeyPressedHandler); global.stage.disconnect(this.stageKeyPressedHandler);
this.stageKeyPressedHandler = null; this.stageKeyPressedHandler = null;
@ -921,17 +939,13 @@ var DrawingArea = new Lang.Class({
this.scrollHandler = null; this.scrollHandler = null;
} }
if (this.helper.visible)
this.helper.hideHelp();
this.currentElement = null; this.currentElement = null;
this._stopTextCursorTimeout(); this._stopTextCursorTimeout();
this.currentTool = Shapes.NONE; this.currentTool = Shapes.NONE;
this.dashedLine = false; this.dashedLine = false;
this.fill = false; this.fill = false;
this._redisplay(); this._redisplay();
if (this._menu) this.closeMenu();
this._menu.close();
this.get_parent().set_background_color(null); this.get_parent().set_background_color(null);
if (save) if (save)
this.savePersistent(); this.savePersistent();
@ -1101,11 +1115,6 @@ var DrawingArea = new Lang.Class({
get drawingContentsHasChanged() { get drawingContentsHasChanged() {
let contents = `[\n ` + new Array(...this.elements.map(element => JSON.stringify(element))).join(`,\n\n `) + `\n]`; let contents = `[\n ` + new Array(...this.elements.map(element => JSON.stringify(element))).join(`,\n\n `) + `\n]`;
return contents != this.lastJsonContents; return contents != this.lastJsonContents;
},
disable: function() {
this.erase();
this.menu.disable();
} }
}); });

View File

@ -166,7 +166,7 @@ var AreaManager = new Lang.Class({
container.set_position(monitor.x, monitor.y); container.set_position(monitor.x, monitor.y);
container.set_size(monitor.width, monitor.height); container.set_size(monitor.width, monitor.height);
area.set_size(monitor.width, monitor.height); area.set_size(monitor.width, monitor.height);
area.stopDrawingHandler = area.connect('stop-drawing', this.toggleDrawing.bind(this)); area.leaveDrawingHandler = area.connect('leave-drawing-mode', this.toggleDrawing.bind(this));
area.showOsdHandler = area.connect('show-osd', this.showOsd.bind(this)); area.showOsdHandler = area.connect('show-osd', this.showOsd.bind(this));
this.areas.push(area); this.areas.push(area);
} }
@ -334,6 +334,9 @@ var AreaManager = new Lang.Class({
if (!this.activeArea) if (!this.activeArea)
return; return;
// The menu changes Main.actionMode.
this.activeArea.closeMenu();
if (Main.actionMode & DRAWING_ACTION_MODE) { if (Main.actionMode & DRAWING_ACTION_MODE) {
Main.popModal(this.activeArea); Main.popModal(this.activeArea);
setCursor('DEFAULT'); setCursor('DEFAULT');
@ -473,11 +476,10 @@ var AreaManager = new Lang.Class({
removeAreas: function() { removeAreas: function() {
for (let i = 0; i < this.areas.length; i++) { for (let i = 0; i < this.areas.length; i++) {
let area = this.areas[i]; let area = this.areas[i];
area.disconnect(area.leaveDrawingHandler);
area.disconnect(area.showOsdHandler);
let container = area.get_parent(); let container = area.get_parent();
container.get_parent().remove_actor(container); container.get_parent().remove_actor(container);
area.disconnect(area.stopDrawingHandler);
area.disconnect(area.showOsdHandler);
area.disable();
container.destroy(); container.destroy();
} }
this.areas = []; this.areas = [];