Add decent UI for VC_COMPARE

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@35306 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Pavel Sanda 2010-09-07 11:28:57 +00:00
parent d179943b8f
commit e2c0424c17
7 changed files with 414 additions and 10 deletions

View File

@ -721,6 +721,7 @@ src_frontends_qt4_header_files = Split('''
GuiCommandBuffer.h GuiCommandBuffer.h
GuiCommandEdit.h GuiCommandEdit.h
GuiCompare.h GuiCompare.h
GuiCompareHistory.h
GuiCompleter.h GuiCompleter.h
GuiDelimiter.h GuiDelimiter.h
GuiDialog.h GuiDialog.h
@ -823,6 +824,7 @@ src_frontends_qt4_files = Split('''
GuiCommandBuffer.cpp GuiCommandBuffer.cpp
GuiCommandEdit.cpp GuiCommandEdit.cpp
GuiCompare.cpp GuiCompare.cpp
GuiCompareHistory.cpp
GuiCompleter.cpp GuiCompleter.cpp
GuiDelimiter.cpp GuiDelimiter.cpp
GuiDialog.cpp GuiDialog.cpp
@ -921,6 +923,7 @@ src_frontends_qt4_ui_files = Split('''
CitationUi.ui CitationUi.ui
ColorUi.ui ColorUi.ui
CompareUi.ui CompareUi.ui
CompareHistoryUi.ui
DelimiterUi.ui DelimiterUi.ui
DocumentUi.ui DocumentUi.ui
ERTUi.ui ERTUi.ui

View File

@ -2192,13 +2192,14 @@ void LyXAction::init()
* \var lyx::FuncCode lyx::LFUN_VC_COMPARE * \var lyx::FuncCode lyx::LFUN_VC_COMPARE
* \li Action: Compares two revisions of the same file under version control. * \li Action: Compares two revisions of the same file under version control.
* \li Notion: This is currently implemented only for SVN and RCS. * \li Notion: This is currently implemented only for SVN and RCS.
* \li Syntax: vc-compare <REV1> [<REV2>] * \li Syntax: vc-compare [<REV1>] [<REV2>]
* \li Params: Revision number either points directly to commit in history * \li Params: Revision number either points directly to commit in history
or if negative number -x it points to last commit - x.\n or if negative number -x it points to (last commit - x).\n
In RCS we subtract only in the last number of revision specification. In RCS we subtract only in the last number of revision specification.
Special case "0" is reserved for the last committed revision.\n Special case "0" is reserved for the last committed revision.\n
<REV1>: Older file.\n <REV1>: Older file.\n
<REV2>: Newer file. Used only if REV1 > 0. <REV2>: Newer file. Used only if REV1 > 0.\n
If no parameter is given, interactive dialog will be shown.
* \li Sample: Compare current document against last commit\n * \li Sample: Compare current document against last commit\n
vc-compare 0 vc-compare 0
* \li Sample: Compare current document against current revision - 5 commits\n * \li Sample: Compare current document against current revision - 5 commits\n

View File

@ -0,0 +1,124 @@
/**
* \file GuiCompareHistory.cpp
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Pavel Sanda
*
* Full author contact details are available in file CREDITS.
*/
#include <config.h>
#include "GuiCompareHistory.h"
#include "Buffer.h"
#include "BufferView.h"
#include "FuncRequest.h"
#include "GuiView.h"
#include "LyXVC.h"
#include "support/convert.h"
#include "support/lstrings.h"
using namespace std;
using namespace lyx::support;
namespace lyx {
namespace frontend {
GuiCompareHistory::GuiCompareHistory(GuiView & lv)
: GuiDialog(lv, "comparehistory", qt_("Compare different revisions"))
{
setupUi(this);
setModal(Qt::WindowModal);
connect(okPB, SIGNAL(clicked()), this, SLOT(slotOK()));
connect(cancelPB, SIGNAL(clicked()), this, SLOT(slotCancel()));
connect(revbackRB, SIGNAL(clicked()), this, SLOT(selectRevback()));
connect(betweenrevRB, SIGNAL(clicked()), this, SLOT(selectBetweenrev()));
string revstring = lv.currentBufferView()->buffer().lyxvc().revisionInfo(LyXVC::File);
int rev=0;
if (prefixIs(revstring, "r"))
revstring = ltrim(revstring,"r");
if (isStrInt(revstring))
rev = convert<int>(revstring);
okPB->setEnabled(rev);
rev1SB->setMaximum(rev);
rev2SB->setMaximum(rev);
revbackSB->setMaximum(rev);
rev2SB->setValue(rev);
rev1SB->setValue(rev-1);
//bc().setPolicy(ButtonPolicy::OkApplyCancelPolicy);
//bc().setOK(okPB);
//bc().setCancel(cancelPB);
enableControls();
}
void GuiCompareHistory::updateContents()
{
enableControls();
}
void GuiCompareHistory::selectRevback()
{
betweenrevRB->setChecked(false);
enableControls();
}
void GuiCompareHistory::selectBetweenrev()
{
revbackRB->setChecked(false);
enableControls();
}
void GuiCompareHistory::enableControls()
{
bool rb = revbackRB->isChecked();
rev1SB->setEnabled(!rb);
rev2SB->setEnabled(!rb);
betweenrevRB->setChecked(!rb);
revbackSB->setEnabled(rb);
}
void GuiCompareHistory::slotOK()
{
string param;
if (revbackRB->isChecked())
param = "-" + convert<string>(revbackSB->value());
else
param = convert<string>(rev1SB->value()) +
+ " " + convert<string>(rev2SB->value());
GuiDialog::slotClose();
dispatch(FuncRequest(LFUN_VC_COMPARE, param));
}
void GuiCompareHistory::slotCancel()
{
GuiDialog::slotClose();
}
Dialog * createGuiCompareHistory(GuiView & lv) { return new GuiCompareHistory(lv); }
} // namespace frontend
} // namespace lyx
#include "moc_GuiCompareHistory.cpp"

View File

@ -0,0 +1,61 @@
// -*- C++ -*-
/**
* \file GuiCompareHistory.h
* This file is part of LyX, the document processor.
* Licence details can be found in the file COPYING.
*
* \author Pavel Sanda
*
* Full author contact details are available in file CREDITS.
*/
#ifndef GUICOMPAREHISTORY_H
#define GUICOMPAREHISTORY_H
#include "GuiDialog.h"
#include "ui_CompareHistoryUi.h"
#include "qt_helpers.h"
namespace lyx {
namespace frontend {
class GuiCompareHistory : public GuiDialog, public Ui::CompareHistoryUi
{
Q_OBJECT
public:
///
GuiCompareHistory(GuiView & lv);
private Q_SLOTS:
///
void slotOK();
///
void slotCancel();
///
void selectRevback();
///
void selectBetweenrev();
private:
///
void updateContents();
///
bool initialiseParams(std::string const &) { return true; }
///
bool isBufferDependent() const { return true; }
///
void clearParams() {}
///
void dispatchParams() {}
///
void enableControls();
private:
};
} // namespace frontend
} // namespace lyx
#endif // GUICOMPAREHISTORY_H

View File

@ -1667,8 +1667,7 @@ bool GuiView::getStatus(FuncRequest const & cmd, FuncStatus & flag)
break; break;
} }
case LFUN_VC_COMPARE: case LFUN_VC_COMPARE:
enable = doc_buffer && !cmd.argument().empty() enable = doc_buffer && doc_buffer->lyxvc().prepareFileRevisionEnabled();
&& doc_buffer->lyxvc().prepareFileRevisionEnabled();
break; break;
case LFUN_SERVER_GOTO_FILE_ROW: case LFUN_SERVER_GOTO_FILE_ROW:
@ -2665,6 +2664,11 @@ void GuiView::dispatchVC(FuncRequest const & cmd)
case LFUN_VC_COMPARE: { case LFUN_VC_COMPARE: {
if (cmd.argument().empty()) {
lyx::dispatch(FuncRequest(LFUN_DIALOG_SHOW, "comparehistory"));
break;
}
string rev1 = cmd.getArg(0); string rev1 = cmd.getArg(0);
string f1, f2; string f1, f2;
@ -3456,15 +3460,15 @@ namespace {
// docs in LyXAction.cpp. // docs in LyXAction.cpp.
char const * const dialognames[] = { char const * const dialognames[] = {
"aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character", "aboutlyx", "bibitem", "bibtex", "box", "branch", "changes", "character",
"citation", "compare", "document", "errorlist", "ert", "external", "citation", "compare", "comparehistory", "document", "errorlist", "ert",
"file", "findreplace", "findreplaceadv", "float", "graphics", "href", "external", "file", "findreplace", "findreplaceadv", "float", "graphics",
"include", "index", "index_print", "info", "listings", "label", "line", "href", "include", "index", "index_print", "info", "listings", "label", "line",
"log", "mathdelimiter", "mathmatrix", "mathspace", "nomenclature", "log", "mathdelimiter", "mathmatrix", "mathspace", "nomenclature",
"nomencl_print", "note", "paragraph", "phantom", "prefs", "print", "ref", "nomencl_print", "note", "paragraph", "phantom", "prefs", "print", "ref",
"sendto", "space", "spellchecker", "symbols", "tabular", "tabularcreate", "sendto", "space", "spellchecker", "symbols", "tabular", "tabularcreate",
"thesaurus", "texinfo", "toc", "view-source", "vspace", "wrap", "thesaurus", "texinfo", "toc", "view-source", "vspace", "wrap", "progress"};
"progress"};
char const * const * const end_dialognames = char const * const * const end_dialognames =
dialognames + (sizeof(dialognames) / sizeof(char *)); dialognames + (sizeof(dialognames) / sizeof(char *));
@ -3643,6 +3647,7 @@ Dialog * createGuiChanges(GuiView & lv);
Dialog * createGuiCharacter(GuiView & lv); Dialog * createGuiCharacter(GuiView & lv);
Dialog * createGuiCitation(GuiView & lv); Dialog * createGuiCitation(GuiView & lv);
Dialog * createGuiCompare(GuiView & lv); Dialog * createGuiCompare(GuiView & lv);
Dialog * createGuiCompareHistory(GuiView & lv);
Dialog * createGuiDelimiter(GuiView & lv); Dialog * createGuiDelimiter(GuiView & lv);
Dialog * createGuiDocument(GuiView & lv); Dialog * createGuiDocument(GuiView & lv);
Dialog * createGuiErrorList(GuiView & lv); Dialog * createGuiErrorList(GuiView & lv);
@ -3701,6 +3706,8 @@ Dialog * GuiView::build(string const & name)
return createGuiCitation(*this); return createGuiCitation(*this);
if (name == "compare") if (name == "compare")
return createGuiCompare(*this); return createGuiCompare(*this);
if (name == "comparehistory")
return createGuiCompareHistory(*this);
if (name == "document") if (name == "document")
return createGuiDocument(*this); return createGuiDocument(*this);
if (name == "errorlist") if (name == "errorlist")

View File

@ -74,6 +74,7 @@ SOURCEFILES = \
GuiCommandBuffer.cpp \ GuiCommandBuffer.cpp \
GuiCommandEdit.cpp \ GuiCommandEdit.cpp \
GuiCompare.cpp \ GuiCompare.cpp \
GuiCompareHistory.cpp \
GuiCompleter.cpp \ GuiCompleter.cpp \
GuiDelimiter.cpp \ GuiDelimiter.cpp \
GuiDialog.cpp \ GuiDialog.cpp \
@ -185,6 +186,7 @@ MOCHEADER = \
GuiCommandBuffer.h \ GuiCommandBuffer.h \
GuiCommandEdit.h \ GuiCommandEdit.h \
GuiCompare.h \ GuiCompare.h \
GuiCompareHistory.h \
GuiCompleter.h \ GuiCompleter.h \
GuiDelimiter.h \ GuiDelimiter.h \
GuiDialog.h \ GuiDialog.h \
@ -263,6 +265,7 @@ UIFILES = \
CitationUi.ui \ CitationUi.ui \
ColorUi.ui \ ColorUi.ui \
CompareUi.ui \ CompareUi.ui \
CompareHistoryUi.ui \
DelimiterUi.ui \ DelimiterUi.ui \
DocumentUi.ui \ DocumentUi.ui \
ErrorListUi.ui \ ErrorListUi.ui \

View File

@ -0,0 +1,205 @@
<ui version="4.0" >
<class>CompareHistoryUi</class>
<widget class="QWidget" name="CompareHistoryUi" >
<property name="geometry" >
<rect>
<x>0</x>
<y>0</y>
<width>356</width>
<height>172</height>
</rect>
</property>
<property name="windowTitle" >
<string/>
</property>
<property name="sizeGripEnabled" stdset="0" >
<bool>true</bool>
</property>
<layout class="QVBoxLayout" name="verticalLayout" >
<item>
<widget class="QGroupBox" name="groupBox" >
<property name="title" >
<string>Compare Revisions</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_2" >
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2" >
<item>
<widget class="QRadioButton" name="revbackRB" >
<property name="text" >
<string>&amp;Revisions back</string>
</property>
<property name="checked" >
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="revbackSB" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="minimum" >
<number>1</number>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="Line" name="line" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout" >
<item>
<widget class="QRadioButton" name="betweenrevRB" >
<property name="text" >
<string>&amp;Between revisions</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="rev1SB" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="minimum" >
<number>1</number>
</property>
<property name="maximum" >
<number>1</number>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="rev2SB" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize" >
<size>
<width>80</width>
<height>0</height>
</size>
</property>
<property name="minimum" >
<number>1</number>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_3" >
<item>
<spacer name="horizontalSpacer_2" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="okPB" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>&amp;Ok</string>
</property>
<property name="autoDefault" >
<bool>false</bool>
</property>
<property name="default" >
<bool>true</bool>
</property>
<property name="flat" >
<bool>false</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="cancelPB" >
<property name="sizePolicy" >
<sizepolicy vsizetype="Fixed" hsizetype="Fixed" >
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text" >
<string>&amp;Cancel</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_3" >
<property name="orientation" >
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0" >
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<includes>
<include location="local" >qt_i18n.h</include>
</includes>
<resources/>
<connections/>
</ui>