diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index c6df78bde8fb03947251684c1f297928d757298a..ca8e0debe4a65f2189194533b40a02e644c155c4 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -23,7 +23,7 @@ import { MatTooltipModule } from '@angular/material/tooltip';
 import { AnalysisService } from './services/analysis/analysis.service';
 import { AddExpressedProteinsComponent } from './dialogs/add-expressed-proteins/add-expressed-proteins.component';
 import { createCustomElement } from '@angular/elements';
-import { NetworkLegendComponent } from './components/network-legend/network-legend.component';
+import { NetworkLegendComponent } from './components/network/network-legend/network-legend.component';
 import { ProtTableComponent } from './components/analysis-panel/prot-table/prot-table.component';
 import { DrugTableComponent } from './components/analysis-panel/drug-table/drug-table.component';
 
@@ -34,7 +34,7 @@ import {
   faRulerVertical, faDna, faMicroscope, faBook, faPause, faTrash, faSpinner, faExclamationTriangle, faPlus,
   faExpand, faInfo, faRocket, faAngleDown, faSearch, faFastForward, faExternalLinkAlt, faTasks, faFilter,
   faMinus, faUpload, faAngleDoubleDown, faSync, faBroom, faAngleDoubleUp, faChild, faHeadSideMask, faBiohazard,
-  faBullseye, faSeedling
+  faBullseye, faSeedling, faSyncAlt
 } from '@fortawesome/free-solid-svg-icons';
 import { TooltipModule } from 'primeng/tooltip';
 import { NetworkMenuComponent } from './components/network/network-menu/network-menu.component';
@@ -43,6 +43,10 @@ import { ToggleInplaceComponent } from './components/network/network-menu/toggle
 import { NetworkMenuLeftComponent } from './components/network/network-menu-left/network-menu-left.component';
 import { ToggleInplaceReversedComponent } from './components/network/network-menu-left/toggle-inplace-reversed/toggle-inplace-reversed.component';
 import { DownloadButtonInverseComponent } from './components/network/network-menu-left/download-button-inverse/download-button-inverse.component';
+import { NetworkControlComponent } from './components/network-control/network-control.component';
+import { CenterViewComponent } from './components/network/network-menu/center-view/center-view.component';
+import { CenterViewInverseComponent } from './components/network/network-menu-left/center-view-inverse/center-view-inverse.component';
+
 
 @NgModule({
   declarations: [
@@ -66,6 +70,9 @@ import { DownloadButtonInverseComponent } from './components/network/network-men
     NetworkMenuLeftComponent,
     ToggleInplaceReversedComponent,
     DownloadButtonInverseComponent,
+    NetworkControlComponent,
+    CenterViewComponent,
+    CenterViewInverseComponent,
   ],
   imports: [
     BrowserModule,
@@ -90,7 +97,7 @@ export class AppModule {
       faCheck, faCamera, faDownload, faRulerVertical, faDna, faMicroscope, faBook, faPause, faTrash,
       faSpinner, faExclamationTriangle, faPlus, faExpand, faInfo, faRocket, faAngleDown, faSearch,
       faFastForward, faExternalLinkAlt, faTasks, faFilter, faMinus, faUpload, faAngleDoubleDown,
-      faSync, faBroom, faAngleDoubleUp, faChild, faHeadSideMask, faBiohazard, faBullseye, faSeedling);
+      faSync, faBroom, faAngleDoubleUp, faChild, faHeadSideMask, faBiohazard, faBullseye, faSeedling, faSyncAlt);
     const NetworkExpander = createCustomElement(ExplorerPageComponent, { injector });
     // Register the custom element with the browser.
     customElements.define('drugst-one', NetworkExpander);
diff --git a/src/app/components/network-control/network-control.component.html b/src/app/components/network-control/network-control.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..a5986389cee18722c667c8ff97de6f35fb65945e
--- /dev/null
+++ b/src/app/components/network-control/network-control.component.html
@@ -0,0 +1,3 @@
+<div>
+    <button (click)="fitNetwork()">fit network</button>
+</div>
diff --git a/src/app/components/network-control/network-control.component.scss b/src/app/components/network-control/network-control.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/app/components/network-control/network-control.component.spec.ts b/src/app/components/network-control/network-control.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..278188373ad9f8bb959543d471a321b68326505d
--- /dev/null
+++ b/src/app/components/network-control/network-control.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { NetworkControlComponent } from './network-control.component';
+
+describe('NetworkControlComponent', () => {
+  let component: NetworkControlComponent;
+  let fixture: ComponentFixture<NetworkControlComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ NetworkControlComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(NetworkControlComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/components/network-control/network-control.component.ts b/src/app/components/network-control/network-control.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..95aa6edec62db3c63d191748535f2236f479382a
--- /dev/null
+++ b/src/app/components/network-control/network-control.component.ts
@@ -0,0 +1,20 @@
+import { Component, OnInit } from '@angular/core';
+import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service';
+
+@Component({
+  selector: 'app-network-control',
+  templateUrl: './network-control.component.html',
+  styleUrls: ['./network-control.component.scss']
+})
+export class NetworkControlComponent implements OnInit {
+
+  constructor(public networkHandler: NetworkHandlerService) { }
+
+  ngOnInit(): void {
+  }
+
+  public fitNetwork() {
+    this.networkHandler.activeNetwork.networkInternal.fit();
+  }
+
+}
diff --git a/src/app/components/network-legend/network-legend.component.html b/src/app/components/network-legend/network-legend.component.html
deleted file mode 100644
index adde137d9a403e4cb676405d66cec9b0ae732820..0000000000000000000000000000000000000000
--- a/src/app/components/network-legend/network-legend.component.html
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-<div class="legend" [class.right]="this.config.legendPos === 'right'" [ngClass]="{ 'legend-small': drugstoneConfig.smallStyle }">
-  <div class="legend-background"></div>
-  <!-- default legend in html -->
-  <table *ngIf="!this.config.legendUrl.length" class="legend-table">
-    <ng-container *ngIf="this.config.showLegendNodes">
-      <tr *ngFor="let nodeGroup of this.config.nodeGroups | keyvalue" class="list-item">
-
-        <ng-container *ngIf="nodeGroup.key && checkNodeGroupContext(nodeGroup.key)">
-          <ng-container *ngIf="nodeGroup.value.image">
-            <!-- group icon given, use icon in legend -->
-            <th>
-              <img [src]="nodeGroup.value.image" class="legend-icon"/>
-            </th>
-            <td class="group-name">&nbsp;{{ nodeGroup.value.groupName }}</td>
-          </ng-container>
-
-          <ng-container *ngIf="!nodeGroup.value.image" [ngSwitch]="nodeGroup.value.shape">
-            <!-- no image given, create icon programmatically -->
-            <th *ngSwitchCase="'text'">
-              <span class="node text">
-                text
-              </span>
-            </th>
-            <th *ngSwitchCase="'hexagon'">
-              <span class="node hexagon" [style.color]=nodeGroup.value.color.background>
-                &#x2B23;
-              </span>
-            </th>
-            <th *ngSwitchCase="'triangle'">
-              <span class="node triangle" [style.border-bottom-color]=nodeGroup.value.color.background>
-              </span>
-            </th>
-            <th *ngSwitchCase="'triangleDown'">
-              <span class="node triangleDown" [style.border-top-color]=nodeGroup.value.color.background>
-              </span>
-            </th>
-            <th *ngSwitchCase="'diamond'">
-              <span class="node diamond"
-                    [style.background-color]=nodeGroup.value.color.background
-              >
-              </span>
-            </th>
-            <th *ngSwitchCase="'star'">
-              <span class="node star"
-                    [style.border-bottom-color]=nodeGroup.value.color.background
-                    [style.color]=nodeGroup.value.color.background
-              >
-              </span>
-            </th>
-            <th *ngSwitchCase="'circle'">
-              <span class="node circle" [style.background-color]=nodeGroup.value.color.background>
-              ...
-              </span>
-            </th>
-            <th *ngSwitchDefault>
-              <span class="node {{ nodeGroup.value.shape }}" [style.background-color]=nodeGroup.value.color.background>
-              </span>
-            </th>
-            <td class="group-name">&nbsp;{{ nodeGroup.value.groupName }}</td>
-          </ng-container>
-        </ng-container>
-      </tr>
-    </ng-container>
-
-    <ng-container *ngIf="this.config.showLegendEdges">
-      <tr *ngFor="let edgeGroup of this.config.edgeGroups | keyvalue" class="list-item">
-        <ng-container *ngIf="edgeGroup.key && checkEdgeGroupContext(edgeGroup.key)">
-          <th>
-            <hr *ngIf="!edgeGroup.value.dashes" class="edge" [style.background-color]=edgeGroup.value.color>
-            <hr *ngIf="edgeGroup.value.dashes" class="edge dashes" [style.color]=edgeGroup.value.color>
-          </th>
-          <td class="group-name">&nbsp;{{ edgeGroup.value.groupName }}</td>
-        </ng-container>
-      </tr>
-    </ng-container>
-  </table>
-
-
-  <!-- custom legend image if url given by user -->
-  <img *ngIf="this.config.legendUrl.length" [src]="this.config.legendUrl" [ngClass]="this.config.legendClass"/>
-
-</div>
diff --git a/src/app/components/network/network-legend/network-legend.component.html b/src/app/components/network/network-legend/network-legend.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..f2e488ed086b8dca0649f0e4ac1454b15ae9bd94
--- /dev/null
+++ b/src/app/components/network/network-legend/network-legend.component.html
@@ -0,0 +1,123 @@
+<div
+  class="legend"
+  [class.right]="this.config.legendPos === 'right'"
+  [ngClass]="{ 'legend-small': drugstoneConfig.smallStyle }"
+>
+  <div class="legend-background"></div>
+  <!-- default legend in html -->
+  <table *ngIf="!this.config.legendUrl.length" class="legend-table">
+    <ng-container *ngIf="this.config.showLegendNodes">
+      <tr
+        *ngFor="let nodeGroup of this.config.nodeGroups | keyvalue"
+        class="list-item"
+      >
+        <ng-container
+          *ngIf="nodeGroup.key && checkNodeGroupContext(nodeGroup.key)"
+        >
+          <ng-container *ngIf="nodeGroup.value.image">
+            <!-- group icon given, use icon in legend -->
+            <th>
+              <img [src]="nodeGroup.value.image" class="legend-icon" />
+            </th>
+            <td class="group-name">&nbsp;{{ nodeGroup.value.groupName }}</td>
+          </ng-container>
+
+          <ng-container
+            *ngIf="!nodeGroup.value.image"
+            [ngSwitch]="nodeGroup.value.shape"
+          >
+            <!-- no image given, create icon programmatically -->
+            <th *ngSwitchCase="'text'">
+              <span class="node text"> text </span>
+            </th>
+            <th *ngSwitchCase="'hexagon'">
+              <span
+                class="node hexagon"
+                [style.color]="nodeGroup.value.color.background"
+              >
+                &#x2B23;
+              </span>
+            </th>
+            <th *ngSwitchCase="'triangle'">
+              <span
+                class="node triangle"
+                [style.border-bottom-color]="nodeGroup.value.color.background"
+              >
+              </span>
+            </th>
+            <th *ngSwitchCase="'triangleDown'">
+              <span
+                class="node triangleDown"
+                [style.border-top-color]="nodeGroup.value.color.background"
+              >
+              </span>
+            </th>
+            <th *ngSwitchCase="'diamond'">
+              <span
+                class="node diamond"
+                [style.background-color]="nodeGroup.value.color.background"
+              >
+              </span>
+            </th>
+            <th *ngSwitchCase="'star'">
+              <span
+                class="node star"
+                [style.border-bottom-color]="nodeGroup.value.color.background"
+                [style.color]="nodeGroup.value.color.background"
+              >
+              </span>
+            </th>
+            <th *ngSwitchCase="'circle'">
+              <span
+                class="node circle"
+                [style.background-color]="nodeGroup.value.color.background"
+              >
+                ...
+              </span>
+            </th>
+            <th *ngSwitchDefault>
+              <span
+                class="node {{ nodeGroup.value.shape }}"
+                [style.background-color]="nodeGroup.value.color.background"
+              >
+              </span>
+            </th>
+            <td class="group-name">&nbsp;{{ nodeGroup.value.groupName }}</td>
+          </ng-container>
+        </ng-container>
+      </tr>
+    </ng-container>
+
+    <ng-container *ngIf="this.config.showLegendEdges">
+      <tr
+        *ngFor="let edgeGroup of this.config.edgeGroups | keyvalue"
+        class="list-item"
+      >
+        <ng-container
+          *ngIf="edgeGroup.key && checkEdgeGroupContext(edgeGroup.key)"
+        >
+          <th>
+            <hr
+              *ngIf="!edgeGroup.value.dashes"
+              class="edge"
+              [style.background-color]="edgeGroup.value.color"
+            />
+            <hr
+              *ngIf="edgeGroup.value.dashes"
+              class="edge dashes"
+              [style.color]="edgeGroup.value.color"
+            />
+          </th>
+          <td class="group-name">&nbsp;{{ edgeGroup.value.groupName }}</td>
+        </ng-container>
+      </tr>
+    </ng-container>
+  </table>
+
+  <!-- custom legend image if url given by user -->
+  <img
+    *ngIf="this.config.legendUrl.length"
+    [src]="this.config.legendUrl"
+    [ngClass]="this.config.legendClass"
+  />
+</div>
diff --git a/src/app/components/network-legend/network-legend.component.scss b/src/app/components/network/network-legend/network-legend.component.scss
similarity index 100%
rename from src/app/components/network-legend/network-legend.component.scss
rename to src/app/components/network/network-legend/network-legend.component.scss
diff --git a/src/app/components/network-legend/network-legend.component.spec.ts b/src/app/components/network/network-legend/network-legend.component.spec.ts
similarity index 100%
rename from src/app/components/network-legend/network-legend.component.spec.ts
rename to src/app/components/network/network-legend/network-legend.component.spec.ts
diff --git a/src/app/components/network-legend/network-legend.component.ts b/src/app/components/network/network-legend/network-legend.component.ts
similarity index 97%
rename from src/app/components/network-legend/network-legend.component.ts
rename to src/app/components/network/network-legend/network-legend.component.ts
index cc42a71e400290e079953efd3272bf34216a3f04..8c8c89b514bc870ecca3bc9ecce9066b3dc91e15 100644
--- a/src/app/components/network-legend/network-legend.component.ts
+++ b/src/app/components/network/network-legend/network-legend.component.ts
@@ -1,7 +1,7 @@
 import {Component, Input, OnInit} from '@angular/core';
 import { LegendContext } from 'src/app/interfaces';
 import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service';
-import {IConfig} from '../../config';
+import {IConfig} from '../../../config';
 
 @Component({
   selector: 'app-network-legend',
diff --git a/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.html b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..a678b223ac754e8d47205d9388b54727954828b2
--- /dev/null
+++ b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.html
@@ -0,0 +1,21 @@
+<button
+  (click)="fitNetwork()"
+  class="button is-primary is-rounded has-tooltip"
+  pTooltip="Reset the network zoom and position."
+  [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'"
+  tooltipPosition="right"
+  [ngClass]="{
+    'is-small': drugstoneConfig.smallStyle
+  }"
+>
+  <span
+    [ngClass]="{
+      'text-normal': drugstoneConfig.smallStyle
+    }"
+  >
+    Reset View
+  </span>
+  <span class="icon">
+    <i class="fas fa-sync-alt" aria-hidden="true"></i>
+  </span>
+</button>
diff --git a/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.scss b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.spec.ts b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..f56ebb6961519e0eee7360d553c650b33b301e94
--- /dev/null
+++ b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CenterViewInverseComponent } from './center-view-inverse.component';
+
+describe('CenterViewInverseComponent', () => {
+  let component: CenterViewInverseComponent;
+  let fixture: ComponentFixture<CenterViewInverseComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ CenterViewInverseComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CenterViewInverseComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.ts b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..37464a4ec6d3e39a8fa2729b6f699c1dabff93f7
--- /dev/null
+++ b/src/app/components/network/network-menu-left/center-view-inverse/center-view-inverse.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from '@angular/core';
+import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service';
+import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service';
+
+@Component({
+  selector: 'app-center-view-inverse',
+  templateUrl: './center-view-inverse.component.html',
+  styleUrls: ['./center-view-inverse.component.scss']
+})
+export class CenterViewInverseComponent implements OnInit {
+
+  constructor(public networkHandler: NetworkHandlerService, public drugstoneConfig: DrugstoneConfigService) { }
+
+  ngOnInit(): void {
+  }
+
+  public fitNetwork() {
+    this.networkHandler.activeNetwork.networkInternal.fit();
+  }
+
+}
diff --git a/src/app/components/network/network-menu-left/network-menu-left.component.html b/src/app/components/network/network-menu-left/network-menu-left.component.html
index 8dcfff7f443ceaed4ad69d12f6518b882fbc9532..c251083c4e2e7f682a275259049c664f3ecbee94 100644
--- a/src/app/components/network/network-menu-left/network-menu-left.component.html
+++ b/src/app/components/network/network-menu-left/network-menu-left.component.html
@@ -30,6 +30,14 @@
           icon="fas fa-seedling"
         ></app-toggle-inplace-reversed>
       </div>
+      <div
+        class="row is-full m-1 is-pulled-right"
+        *ngIf="drugstoneConfig.config.showNetworkMenuButtonScreenshot"
+      >
+        <div class="network-footer-toolbar-element">
+          <app-center-view-inverse></app-center-view-inverse>
+        </div>
+      </div>
       <div
         class="row is-full m-1 is-pulled-right"
         *ngIf="drugstoneConfig.config.showNetworkMenuButtonScreenshot"
diff --git a/src/app/components/network/network-menu/center-view/center-view.component.html b/src/app/components/network/network-menu/center-view/center-view.component.html
new file mode 100644
index 0000000000000000000000000000000000000000..989e2372860bf86c2820811d99628ac7120e4254
--- /dev/null
+++ b/src/app/components/network/network-menu/center-view/center-view.component.html
@@ -0,0 +1,20 @@
+<button
+  (click)="fitNetwork()"
+  class="button is-primary is-rounded has-tooltip"
+  pTooltip="Reset the network zoom and position."
+  [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'"
+  tooltipPosition="left"
+  [ngClass]="{
+    'is-small': drugstoneConfig.smallStyle
+  }"
+>
+  <span class="icon">
+    <i class="fas fa-sync-alt" aria-hidden="true"></i>
+  </span>
+  <span
+    [ngClass]="{
+      'text-normal': drugstoneConfig.smallStyle
+    }"
+    >Reset View</span
+  >
+</button>
diff --git a/src/app/components/network/network-menu/center-view/center-view.component.scss b/src/app/components/network/network-menu/center-view/center-view.component.scss
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/src/app/components/network/network-menu/center-view/center-view.component.spec.ts b/src/app/components/network/network-menu/center-view/center-view.component.spec.ts
new file mode 100644
index 0000000000000000000000000000000000000000..cf2340038b640fef58c42fde0332ed0163e99fac
--- /dev/null
+++ b/src/app/components/network/network-menu/center-view/center-view.component.spec.ts
@@ -0,0 +1,25 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CenterViewComponent } from './center-view.component';
+
+describe('CenterViewComponent', () => {
+  let component: CenterViewComponent;
+  let fixture: ComponentFixture<CenterViewComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      declarations: [ CenterViewComponent ]
+    })
+    .compileComponents();
+  });
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(CenterViewComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
diff --git a/src/app/components/network/network-menu/center-view/center-view.component.ts b/src/app/components/network/network-menu/center-view/center-view.component.ts
new file mode 100644
index 0000000000000000000000000000000000000000..734fcf925d13e2bb7bb2d547549c563e94234b88
--- /dev/null
+++ b/src/app/components/network/network-menu/center-view/center-view.component.ts
@@ -0,0 +1,21 @@
+import { Component, OnInit } from '@angular/core';
+import { DrugstoneConfigService } from 'src/app/services/drugstone-config/drugstone-config.service';
+import { NetworkHandlerService } from 'src/app/services/network-handler/network-handler.service';
+
+@Component({
+  selector: 'app-center-view',
+  templateUrl: './center-view.component.html',
+  styleUrls: ['./center-view.component.scss']
+})
+export class CenterViewComponent implements OnInit {
+
+  constructor(public networkHandler: NetworkHandlerService, public drugstoneConfig: DrugstoneConfigService) { }
+
+  ngOnInit(): void {
+  }
+
+  public fitNetwork() {
+    this.networkHandler.activeNetwork.networkInternal.fit();
+  }
+
+}
diff --git a/src/app/components/network/network-menu/network-menu.component.html b/src/app/components/network/network-menu/network-menu.component.html
index 5a9b5a1ffce2cce437d7c5037d11b4a7b6c262dd..5fe50c46f26a47fe6853b1c19cdb4eeaf961d99f 100644
--- a/src/app/components/network/network-menu/network-menu.component.html
+++ b/src/app/components/network/network-menu/network-menu.component.html
@@ -32,201 +32,200 @@
       </div>
       <div
         class="row is-full m-1"
-        *ngIf="drugstoneConfig.config.showNetworkMenuButtonScreenshot"
+        *ngIf="drugstoneConfig.config.showNetworkMenuButtonCenter"
       >
         <div class="network-footer-toolbar-element">
+          <app-center-view></app-center-view>
+        </div>
+      </div>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonScreenshot"
+    >
+      <div class="network-footer-toolbar-element">
+        <button
+          (click)="networkHandler.activeNetwork.toImage()"
+          class="button is-primary is-rounded has-tooltip"
+          pTooltip="Take a screenshot of the current network."
+          [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'"
+          tooltipPosition="left"
+          [ngClass]="{
+            'is-small': drugstoneConfig.smallStyle
+          }"
+        >
+          <span class="icon">
+            <i class="fas fa-camera" aria-hidden="true"></i>
+          </span>
+          <span
+            [ngClass]="{
+              'text-normal': drugstoneConfig.smallStyle
+            }"
+            >Screenshot</span
+          >
+        </button>
+      </div>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonExportGraphml"
+    >
+      <div class="network-footer-toolbar-element">
+        <app-download-button
+          [nodeData]="networkHandler.activeNetwork.nodeData"
+          [buttonId]="'explorer-download'"
+        ></app-download-button>
+      </div>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonExpression"
+    >
+      <div
+        class="dropdown network-footer-toolbar-element"
+        [class.is-active]="networkHandler.activeNetwork.expressionExpanded"
+      >
+        <div class="dropdown-trigger">
           <button
-            (click)="networkHandler.activeNetwork.toImage()"
-            class="button is-primary is-rounded has-tooltip"
-            pTooltip="Take a screenshot of the current network."
+            (click)="
+              networkHandler.activeNetwork.expressionExpanded =
+                !networkHandler.activeNetwork.expressionExpanded
+            "
+            class="button is-rounded is-primary"
+            [class.is-outlined]="!networkHandler.activeNetwork.selectedTissue"
+            aria-haspopup="true"
+            aria-controls="dropdown-menu"
+            pTooltip="Tissue expression data is provided by the GTEx project."
             [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'"
             tooltipPosition="left"
             [ngClass]="{
               'is-small': drugstoneConfig.smallStyle
             }"
           >
-            <span class="icon">
-              <i class="fas fa-camera" aria-hidden="true"></i>
+            <span class="icon is-small">
+              <i class="fas fa-child"></i>
             </span>
             <span
+              *ngIf="!networkHandler.activeNetwork.selectedTissue"
               [ngClass]="{
-                'text-normal': drugstoneConfig.smallStyle
+                'text-small': drugstoneConfig.smallStyle
               }"
-              >Screenshot</span
+              >Tissue</span
             >
-          </button>
-        </div>
-      </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="drugstoneConfig.config.showNetworkMenuButtonExportGraphml"
-      >
-        <div class="network-footer-toolbar-element">
-          <app-download-button
-            [nodeData]="networkHandler.activeNetwork.nodeData"
-            [buttonId]="'explorer-download'"
-          ></app-download-button>
-        </div>
-      </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="drugstoneConfig.config.showNetworkMenuButtonExpression"
-      >
-        <div
-          class="dropdown network-footer-toolbar-element"
-          [class.is-active]="networkHandler.activeNetwork.expressionExpanded"
-        >
-          <div class="dropdown-trigger">
-            <button
-              (click)="
-                networkHandler.activeNetwork.expressionExpanded =
-                  !networkHandler.activeNetwork.expressionExpanded
-              "
-              class="button is-rounded is-primary"
-              [class.is-outlined]="!networkHandler.activeNetwork.selectedTissue"
-              aria-haspopup="true"
-              aria-controls="dropdown-menu"
-              pTooltip="Tissue expression data is provided by the GTEx project."
-              [tooltipStyleClass]="'drgstn drgstn-tooltip drgstn-tooltip-left'"
-              tooltipPosition="left"
+            <span
+              *ngIf="networkHandler.activeNetwork.selectedTissue"
               [ngClass]="{
-                'is-small': drugstoneConfig.smallStyle
+                'text-small': drugstoneConfig.smallStyle
               }"
+              >{{ networkHandler.activeNetwork.selectedTissue.name }}</span
             >
-              <span class="icon is-small">
-                <i class="fas fa-child"></i>
-              </span>
-              <span
-                *ngIf="!networkHandler.activeNetwork.selectedTissue"
-                [ngClass]="{
-                  'text-small': drugstoneConfig.smallStyle
-                }"
-                >Tissue</span
-              >
-              <span
-                *ngIf="networkHandler.activeNetwork.selectedTissue"
-                [ngClass]="{
-                  'text-small': drugstoneConfig.smallStyle
-                }"
-                >{{ networkHandler.activeNetwork.selectedTissue.name }}</span
-              >
-              <span
-                *ngIf="networkHandler.activeNetwork.expressionExpanded"
-                class="icon is-small"
+            <span
+              *ngIf="networkHandler.activeNetwork.expressionExpanded"
+              class="icon is-small"
+            >
+              <i class="fas fa-angle-down" aria-hidden="true"></i>
+            </span>
+            <span
+              *ngIf="!networkHandler.activeNetwork.expressionExpanded"
+              class="icon is-small"
+            >
+              <i class="fas fa-angle-left" aria-hidden="true"></i>
+            </span>
+          </button>
+        </div>
+        <div class="dropdown-menu" id="dropdown-menu" role="menu">
+          <div class="dropdown-content tissue-dropdown">
+            <div class="scroll-area">
+              <a
+                (click)="networkHandler.activeNetwork.selectTissue(null)"
+                [class.is-active]="!networkHandler.activeNetwork.selectedTissue"
+                class="dropdown-item"
               >
-                <i class="fas fa-angle-down" aria-hidden="true"></i>
-              </span>
-              <span
-                *ngIf="!networkHandler.activeNetwork.expressionExpanded"
-                class="icon is-small"
+                None
+              </a>
+              <a
+                *ngFor="
+                  let tissue of networkHandler.activeNetwork.analysis.getTissues()
+                "
+                (click)="networkHandler.activeNetwork.selectTissue(tissue)"
+                [class.is-active]="
+                  networkHandler.activeNetwork.selectedTissue &&
+                  tissue.netexId ===
+                    networkHandler.activeNetwork.selectedTissue.netexId
+                "
+                class="dropdown-item"
               >
-                <i class="fas fa-angle-left" aria-hidden="true"></i>
-              </span>
-            </button>
-          </div>
-          <div class="dropdown-menu" id="dropdown-menu" role="menu">
-            <div class="dropdown-content tissue-dropdown">
-              <div class="scroll-area">
-                <a
-                  (click)="networkHandler.activeNetwork.selectTissue(null)"
-                  [class.is-active]="
-                    !networkHandler.activeNetwork.selectedTissue
-                  "
-                  class="dropdown-item"
-                >
-                  None
-                </a>
-                <a
-                  *ngFor="
-                    let tissue of networkHandler.activeNetwork.analysis.getTissues()
-                  "
-                  (click)="networkHandler.activeNetwork.selectTissue(tissue)"
-                  [class.is-active]="
-                    networkHandler.activeNetwork.selectedTissue &&
-                    tissue.netexId ===
-                      networkHandler.activeNetwork.selectedTissue.netexId
-                  "
-                  class="dropdown-item"
-                >
-                  {{ tissue.name }}
-                </a>
-              </div>
+                {{ tissue.name }}
+              </a>
             </div>
           </div>
         </div>
       </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="drugstoneConfig.config.showNetworkMenuButtonAdjacentDrugs"
-      >
-        <app-toggle-inplace
-          class="network-footer-toolbar-element"
-          text="{{
-            drugstoneConfig.config.networkMenuButtonAdjacentDrugsLabel
-          }}"
-          icon="fas fa-capsules"
-          tooltip="Display adjacent drugs."
-          [value]="networkHandler.activeNetwork.adjacentDrugs"
-          (valueChange)="
-            networkHandler.activeNetwork.updateAdjacentDrugs($event)
-          "
-        ></app-toggle-inplace>
-      </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="
-          drugstoneConfig.config.showNetworkMenuButtonAdjacentDisordersProteins
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonAdjacentDrugs"
+    >
+      <app-toggle-inplace
+        class="network-footer-toolbar-element"
+        text="{{ drugstoneConfig.config.networkMenuButtonAdjacentDrugsLabel }}"
+        icon="fas fa-capsules"
+        tooltip="Display adjacent drugs."
+        [value]="networkHandler.activeNetwork.adjacentDrugs"
+        (valueChange)="networkHandler.activeNetwork.updateAdjacentDrugs($event)"
+      ></app-toggle-inplace>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="
+        drugstoneConfig.config.showNetworkMenuButtonAdjacentDisordersProteins
+      "
+    >
+      <app-toggle-inplace
+        class="network-footer-toolbar-element"
+        text="{{
+          drugstoneConfig.config.networkMenuButtonAdjacentDisordersProteinsLabel
+        }}"
+        tooltip="Show disorders adjacent to all currently displayed proteins/genes."
+        [value]="networkHandler.activeNetwork.adjacentDisordersProtein"
+        (valueChange)="
+          networkHandler.activeNetwork.updateAdjacentProteinDisorders($event)
         "
-      >
-        <app-toggle-inplace
-          class="network-footer-toolbar-element"
-          text="{{
-            drugstoneConfig.config
-              .networkMenuButtonAdjacentDisordersProteinsLabel
-          }}"
-          tooltip="Show disorders adjacent to all currently displayed proteins/genes."
-          [value]="networkHandler.activeNetwork.adjacentDisordersProtein"
-          (valueChange)="
-            networkHandler.activeNetwork.updateAdjacentProteinDisorders($event)
-          "
-          icon="fas fa-head-side-mask"
-        ></app-toggle-inplace>
-      </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="
-          drugstoneConfig.config.showNetworkMenuButtonAdjacentDisordersDrugs
+        icon="fas fa-head-side-mask"
+      ></app-toggle-inplace>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonAdjacentDisordersDrugs"
+    >
+      <app-toggle-inplace
+        class="network-footer-toolbar-element"
+        text="{{
+          drugstoneConfig.config.networkMenuButtonAdjacentDisordersDrugsLabel
+        }}"
+        tooltip="Show disorders adjacent to all currently displayed drugs."
+        [value]="networkHandler.activeNetwork.adjacentDisordersDrug"
+        [disabled]="!networkHandler.activeNetwork.hasDrugsLoaded()"
+        (valueChange)="
+          networkHandler.activeNetwork.updateAdjacentDrugDisorders($event)
         "
-      >
-        <app-toggle-inplace
-          class="network-footer-toolbar-element"
-          text="{{
-            drugstoneConfig.config.networkMenuButtonAdjacentDisordersDrugsLabel
-          }}"
-          tooltip="Show disorders adjacent to all currently displayed drugs."
-          [value]="networkHandler.activeNetwork.adjacentDisordersDrug"
-          [disabled]="!networkHandler.activeNetwork.hasDrugsLoaded()"
-          (valueChange)="
-            networkHandler.activeNetwork.updateAdjacentDrugDisorders($event)
-          "
-          icon="fas fa-biohazard"
-        ></app-toggle-inplace>
-      </div>
-      <div
-        class="row is-full m-1"
-        *ngIf="drugstoneConfig.config.showNetworkMenuButtonAnimation"
-      >
-        <app-toggle-inplace
-          class="network-footer-toolbar-element"
-          text="{{ drugstoneConfig.config.networkMenuButtonAnimationLabel }}"
-          tooltip="Toggle the network animation."
-          [value]="drugstoneConfig.config.physicsOn"
-          (valueChange)="
-            networkHandler.activeNetwork.updatePhysicsEnabled($event)
-          "
-          icon="fas fa-bullseye"
-        ></app-toggle-inplace>
-      </div>
+        icon="fas fa-biohazard"
+      ></app-toggle-inplace>
+    </div>
+    <div
+      class="row is-full m-1"
+      *ngIf="drugstoneConfig.config.showNetworkMenuButtonAnimation"
+    >
+      <app-toggle-inplace
+        class="network-footer-toolbar-element"
+        text="{{ drugstoneConfig.config.networkMenuButtonAnimationLabel }}"
+        tooltip="Toggle the network animation."
+        [value]="drugstoneConfig.config.physicsOn"
+        (valueChange)="
+          networkHandler.activeNetwork.updatePhysicsEnabled($event)
+        "
+        icon="fas fa-bullseye"
+      ></app-toggle-inplace>
     </div>
   </div>
 </div>
diff --git a/src/app/config.ts b/src/app/config.ts
index cbf90bf60a03617f0ad803f7b649aa588a7938b1..0045a293e3dca091db260df7f985c1d5992736a7 100644
--- a/src/app/config.ts
+++ b/src/app/config.ts
@@ -50,6 +50,7 @@ export interface IConfig {
   showNetworkMenuButtonScreenshot: boolean;
   showNetworkMenuButtonExportGraphml: boolean;
   showNetworkMenuButtonAdjacentDrugs: boolean;
+  showNetworkMenuButtonCenter: boolean;
   networkMenuButtonAdjacentDrugsLabel: string;
   showNetworkMenuButtonAdjacentDisordersProteins: boolean;
   networkMenuButtonAdjacentDisordersProteinsLabel: string;
@@ -98,6 +99,7 @@ export const defaultConfig: IConfig = {
   showNetworkMenuButtonScreenshot: true,
   showNetworkMenuButtonExportGraphml: true,
   showNetworkMenuButtonAdjacentDrugs: true,
+  showNetworkMenuButtonCenter: true,
   networkMenuButtonAdjacentDrugsLabel: 'Drugs',
   showNetworkMenuButtonAdjacentDisordersProteins: true,
   networkMenuButtonAdjacentDisordersProteinsLabel: 'Disorders (protein)',
diff --git a/src/app/network-settings.ts b/src/app/network-settings.ts
index e68a102a62f49822a20557851e0f7a27cd5caf77..ddd420a38ebaafb998b54eb535f86f2eadae1ecb 100644
--- a/src/app/network-settings.ts
+++ b/src/app/network-settings.ts
@@ -1,8 +1,8 @@
-import {getGradientColor} from './utils';
+import { getGradientColor } from './utils';
 import {
   Node,
 } from './interfaces';
-import { IConfig, defaultConfig} from './config';
+import { IConfig, defaultConfig } from './config';
 import * as merge from 'lodash/fp/merge';
 
 export class NetworkSettings {
@@ -53,10 +53,10 @@ export class NetworkSettings {
   };
   private static mainEdges = {
     smooth: false,
-    length: 250,
+    length: 250
   };
   private static mainPhysics = {
-    enabled: false,
+    enabled: false
   };
 
   // Node size
@@ -73,13 +73,13 @@ export class NetworkSettings {
       return {
         layout: this.mainLayout,
         edges: this.mainEdges,
-        physics: physicsOn || this.mainPhysics ,
+        physics: physicsOn || this.mainPhysics,
       };
     } else if (network === 'analysis') {
       return {
         layout: this.analysisLayout,
         edges: this.analysisEdges,
-        physics: physicsOn ||  this.analysisPhysics,
+        physics: physicsOn || this.analysisPhysics,
       };
     } else if (network === 'analysis-big') {
       return {
@@ -95,8 +95,7 @@ export class NetworkSettings {
     'edgeHostDrug' | 'edgeHostDrugHighlight' | 'edgeGeneGene' | 'edgeGeneGeneHighlight')
     /**
      * Collection of all colors per use-case
-     */
-    {
+     */ {
     if (color === 'protein') {
       return this.hostColor;
     } else if (color === 'approvedDrug') {
@@ -126,40 +125,40 @@ export class NetworkSettings {
     isSeed: boolean,
     isSelected: boolean,
     gradient: number = 1): Node {
-      // delete possible old styles
-      Object.keys(config.nodeGroups.default).forEach(e => delete node[e]);
-      // set group styles
-      if (node.group === 'default') {
-        node = merge(node, config.nodeGroups.default);
-      } else {
-        node = merge(node, config.nodeGroups[node.group]);
-      }
-      // note that seed and selected node style are applied after the node style is fetched.
-      // this allows to overwrite only attributes of interest, therefor in e.g. seedNode group
-      // certain attributes like shape can remain undefined
-      // use lodash merge to not lose deep attributes, e.g. "font.size"
-      if (isSeed) {
-        // apply seed node style to node
-        node = merge(node, config.nodeGroups.seedNode);
-      }
-      // selection on purpose after seed style, so seed style will be combined with selection style
-      if (isSelected) {
-        // apply selected node style to node
-        node = merge(node, config.nodeGroups.selectedNode);
-      }
+    // delete possible old styles
+    Object.keys(config.nodeGroups.default).forEach(e => delete node[e]);
+    // set group styles
+    if (node.group === 'default') {
+      node = merge(node, config.nodeGroups.default);
+    } else {
+      node = merge(node, config.nodeGroups[node.group]);
+    }
+    // note that seed and selected node style are applied after the node style is fetched.
+    // this allows to overwrite only attributes of interest, therefor in e.g. seedNode group
+    // certain attributes like shape can remain undefined
+    // use lodash merge to not lose deep attributes, e.g. "font.size"
+    if (isSeed) {
+      // apply seed node style to node
+      node = merge(node, config.nodeGroups.seedNode);
+    }
+    // selection on purpose after seed style, so seed style will be combined with selection style
+    if (isSelected) {
+      // apply selected node style to node
+      node = merge(node, config.nodeGroups.selectedNode);
+    }
 
-      // show image if image url is given. If seed nodes are highlighted, ignore image property
-      if (node.image && !isSeed) {
-        node.shape = 'image';
-      }
+    // show image if image url is given. If seed nodes are highlighted, ignore image property
+    if (node.image && !isSeed) {
+      node.shape = 'image';
+    }
 
-      // use opactiy as gradient
-      if (gradient === null) {
-          node.opacity = 0
-        } else {
-          node.opacity = gradient
-        }
-      return node;
+    // use opactiy as gradient
+    if (gradient === null) {
+      node.opacity = 0
+    } else {
+      node.opacity = gradient
     }
+    return node;
+  }
 }