From 2ce6dca9f8ef3ea7874b289162e36ea52d4290d4 Mon Sep 17 00:00:00 2001 From: TanninOne Date: Thu, 1 Jun 2017 10:02:47 +0200 Subject: [PATCH] conflict editor now shows a hint when the other mod has a dependency --- .../mod-dependency-manager/src/actions.ts | 4 +- .../src/util/renderReference.ts | 15 ++++++++ .../src/views/ConflictEditor.tsx | 37 ++++++++++++++++++- .../src/views/DependencyIcon.tsx | 25 ++++--------- 4 files changed, 61 insertions(+), 20 deletions(-) create mode 100644 extensions/mod-dependency-manager/src/util/renderReference.ts diff --git a/extensions/mod-dependency-manager/src/actions.ts b/extensions/mod-dependency-manager/src/actions.ts index 94724a25d..94c0b5296 100644 --- a/extensions/mod-dependency-manager/src/actions.ts +++ b/extensions/mod-dependency-manager/src/actions.ts @@ -1,3 +1,5 @@ +import {IBiDirRule} from './types/IBiDirRule'; + import { IReference } from 'modmeta-db'; import { safeCreateAction } from 'nmm-api'; @@ -18,4 +20,4 @@ export const setType = safeCreateAction('SET_MOD_RULE_TYPE'); export const setConflictInfo = safeCreateAction('SET_CONFLICT_INFO'); export const setConflictDialog = safeCreateAction('SET_CONFLICT_DIALOG', - (gameId?: string, modId?: string) => ({ gameId, modId })); + (gameId?: string, modId?: string, modRules?: IBiDirRule[]) => ({ gameId, modId, modRules })); diff --git a/extensions/mod-dependency-manager/src/util/renderReference.ts b/extensions/mod-dependency-manager/src/util/renderReference.ts new file mode 100644 index 000000000..c51c4f565 --- /dev/null +++ b/extensions/mod-dependency-manager/src/util/renderReference.ts @@ -0,0 +1,15 @@ +import { IReference } from 'modmeta-db'; + +function renderReference(ref: IReference) { + if ((ref.logicalFileName === undefined) && (ref.fileExpression === undefined)) { + return ref.fileMD5; + } + + let name = ref.logicalFileName || ref.fileExpression; + if (ref.versionMatch !== undefined) { + name += ' v' + ref.versionMatch; + } + return name; +} + +export default renderReference; diff --git a/extensions/mod-dependency-manager/src/views/ConflictEditor.tsx b/extensions/mod-dependency-manager/src/views/ConflictEditor.tsx index d95dea34e..47a8a7bba 100644 --- a/extensions/mod-dependency-manager/src/views/ConflictEditor.tsx +++ b/extensions/mod-dependency-manager/src/views/ConflictEditor.tsx @@ -1,11 +1,13 @@ +import { IBiDirRule } from '../types/IBiDirRule'; import { IConflict } from '../types/IConflict'; import matchReference from '../util/matchReference'; import renderModName from '../util/renderModName'; +import renderReference from '../util/renderReference'; import { setConflictDialog } from '../actions'; import { IReference, IRule } from 'modmeta-db'; -import { actions as nmmActions, ComponentEx, types } from 'nmm-api'; +import { actions as nmmActions, ComponentEx, tooltip, types } from 'nmm-api'; import * as React from 'react'; import { Button, FormControl, ListGroup, ListGroupItem, Modal, OverlayTrigger, Popover } from 'react-bootstrap'; @@ -16,6 +18,7 @@ interface IConnectedProps { gameId: string; modId: string; conflicts: IConflict[]; + modRules: IBiDirRule[]; mods: { [modId: string]: types.IMod }; } @@ -46,6 +49,7 @@ class ConflictEditor extends ComponentEx { } public componentWillReceiveProps(nextProps: IProps) { + // find existing rules for these conflicts this.nextState.ruleType = this.getRuleTypes(nextProps.modId, nextProps.mods, nextProps.conflicts); } @@ -87,7 +91,7 @@ class ConflictEditor extends ComponentEx { } private renderConflict = (conflict: IConflict) => { - const {t, mods} = this.props; + const {t, modId, modRules, mods} = this.props; const {ruleType} = this.state; const popover = ( { ); + let reverseRule: IBiDirRule; + + if (ruleType[conflict.otherMod.name] === undefined) { + reverseRule = modRules + .find(rule => matchReference(rule.reference, conflict.otherMod) + && matchReference(rule.source, mods[modId])); + } + return ( { } + { this.renderReverseRule(reverseRule) } ); } + private renderReverseRule(rule: IBiDirRule) { + const { t } = this.props; + if (rule === undefined) { + return null; + } + + return ( + + ); + } + private close = () => { const { onClose } = this.props; onClose(); @@ -174,6 +206,7 @@ function mapStateToProps(state): IConnectedProps { modId: dialog.modId, conflicts: dialog.modId !== undefined ? state.session.dependencies.conflicts[dialog.modId] : [], mods: dialog.gameId !== undefined ? state.persistent.mods[dialog.gameId] : {}, + modRules: dialog.modRules, }; } diff --git a/extensions/mod-dependency-manager/src/views/DependencyIcon.tsx b/extensions/mod-dependency-manager/src/views/DependencyIcon.tsx index f01269a81..01d3a950b 100644 --- a/extensions/mod-dependency-manager/src/views/DependencyIcon.tsx +++ b/extensions/mod-dependency-manager/src/views/DependencyIcon.tsx @@ -129,7 +129,7 @@ interface IActionProps { onSetTarget: (id: string, pos: { x: number, y: number }) => void; onEditDialog: (gameId: string, modId: string, reference: IReference, defaultType: string) => void; onRemoveRule: (gameId: string, modId: string, rule: IRule) => void; - onConflictDialog: (gameId: string, modId: string) => void; + onConflictDialog: (gameId: string, modId: string, modRules: IBiDirRule[]) => void; } interface IComponentState { @@ -282,9 +282,6 @@ class DependencyIcon extends ComponentEx { matchReference(rule.source, nextProps.mod)); } - const staticRules = util.getSafe(nextState, ['modInfo', 'rules'], undefined); - const customRules = util.getSafe(nextProps.mod, ['rules'], undefined); - if (this.props.isDragging !== nextProps.isDragging) { let pos; if (nextProps.isDragging) { @@ -328,9 +325,6 @@ class DependencyIcon extends ComponentEx { private renderConnectorIcon(mod: types.IMod) { const {t, connectDragSource, enabledMods} = this.props; - const staticRules = util.getSafe(this.state, ['modInfo', 'rules'], []); - const customRules = util.getSafe(mod, ['rules'], []); - const classes = ['btn-dependency']; let anyUnfulfilled = false; @@ -357,6 +351,9 @@ class DependencyIcon extends ComponentEx { let popover: JSX.Element; + const staticRules = util.getSafe(this.state, ['modInfo', 'rules'], []); + const customRules = util.getSafe(mod, ['rules'], []); + if ((staticRules.length > 0) || (customRules.length > 0)) { popover = ( @@ -466,14 +463,6 @@ class DependencyIcon extends ComponentEx { return version !== undefined ? id + ' v' + version : id; } - private renderReference(ref: IReference) { - if (ref.fileMD5) { - return ref.fileMD5; - } else { - return (ref.logicalFileName || ref.fileExpression) + ' v' + ref.versionMatch; - } - } - private findReference(reference: IReference, mods: IModLookupInfo[]): IModLookupInfo { return mods.find(mod => matchReference(reference, mod)); } @@ -492,7 +481,8 @@ class DependencyIcon extends ComponentEx { private openConflictDialog = () => { const { gameId, mod, onConflictDialog } = this.props; - onConflictDialog(gameId, mod.id); + const { modRules } = this.state; + onConflictDialog(gameId, mod.id, modRules); } private key = (rule: IRule) => { @@ -554,7 +544,8 @@ function mapDispatchToProps(dispatch): IActionProps { onEditDialog: (gameId, modId, reference, defaultType) => dispatch(setCreateRule(gameId, modId, reference, defaultType)), onRemoveRule: (gameId, modId, rule) => dispatch(actions.removeModRule(gameId, modId, rule)), - onConflictDialog: (gameId, modId) => dispatch(setConflictDialog(gameId, modId)), + onConflictDialog: (gameId, modId, modRules) => + dispatch(setConflictDialog(gameId, modId, modRules)), }; }