Commit e2b66891 authored by twanvl's avatar twanvl

Finally got precompiled headers to work.

 Now all C++ files need to #include <util/prec.hpp>
 That is why all .cpp files are touched by this commit

Many changes to installers and update checking:
     - the window is now called PackagesWindow, in a new source file
     - update checking is now independent from the PackagesWindow. For update checking only a list of package versions are needed (vector<PackageDependency>). This is much less information to download at each startup.
     - the list of available packages is now a list of available Installers, since an installer can contain multiple packages.
     - moved the logic of dependency checking etc. to data/installer
     - moved the actual installation to util/io/package_manager
     - moved directory iteration/creation logic to util/file_utils
     - added PackageDirectory: the local and global package directory now have their own object (was part of PackageManager)
     - added PackageVersion: for detecting if a package has been modified after it was installed.
     - added PackageDescription: description/header of a package. Basicly the same as what Packaged provides.
     - added DownloadableInstaller: where to find an insaller, what does it contain?
     - added InstallablePackage: brining it all together: installer, package, status, action.

Current status: the insaller is currently broken in a few places, more on that soon.
parent e042585b
mse version: 0.3.5
mse version: 0.3.6
installer group: locales
full name: English
version: 2007-09-23
icon: usgb.png
############################################################## Menu items
menu:
......@@ -92,13 +94,6 @@ menu:
basic shapes: &Basic Shapes F8
symmetry: S&ymmetry F9
paint: P&aint F10
# Updates window
apply changes: Apply changes
cancel changes: Cancel changes
install package: Install package
upgrade package: Upgrade package
remove package: Remove package
############################################################## Menu help texts
help:
......@@ -458,6 +453,23 @@ label:
# Symbol editor
sides: sides
# Packages window
package name: Package
package installed version: Installed version
package remote version: Latest version
package status: Status
package action: Action
package conflicts: conflicting modifications
package modified: local modifications
package updates: updates available
package installed: installed
package installable: not installed
install package: install
upgrade package: upgrade
remove package: remove
############################################################## Buttons/checkboxes/choices in the GUI
button:
......@@ -515,6 +527,15 @@ button:
defaults: Reset to &Defaults
enabled: Enabled
whole word: Match whole word only
# Packages window
install package: &Install
upgrade package: &Upgrade
remove package: &Remove
install group: &Install All
upgrade group: &Upgrade All
remove group: &Remove All
############################################################## Titles in the GUI
title:
......@@ -639,9 +660,7 @@ error:
dependency not given:
The package '%s' uses files from the package '%s', but it does not list a dependency.
To resolve this, add:
depends on:
package: %s
version: %s
depends on: %s %s
# Script stuff
has no member: %s has no member '%s'
......@@ -687,6 +706,22 @@ error:
# Package update window
no packages: Found no package updates.
checking updates: Checking for updates.
can't download installer:
Unable to download installer for package %s from %s.
Nothing has been installed.
downloading updates: Downloading updates (%d of %d)
installing updates: Updating packages (%d of %d)
remove packages:
This will remove %s packages, do you want to continue?
remove packages modified:
This will remove %s packages, %s of those have been modified after installing.
Removing them can not be undone.
Do you want to continue?
cannot create file: Can not create file '%s', continue installation?
############################################################## Types used in scripts / shape names
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/action/keyword.hpp>
#include <data/keyword.hpp>
#include <data/set.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/action/set.hpp>
#include <data/set.hpp>
#include <data/card.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/action/symbol.hpp>
#include <data/action/symbol_part.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/action/symbol_part.hpp>
#include <gfx/bezier.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/action/value.hpp>
#include <data/field.hpp>
#include <data/field/text.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/card.hpp>
#include <data/game.hpp>
#include <data/stylesheet.hpp>
......
......@@ -49,7 +49,7 @@ class Card : public IntrusivePtrVirtualBase {
/// Extra values for specitic stylesheets, indexed by stylesheet name
DelayedIndexMaps<FieldP,ValueP> extra_data;
/// Styling information for a particular stylesheet
IndexMap<FieldP, ValueP>& extraDataFor(const StyleSheet& stylesheet) ;
IndexMap<FieldP, ValueP>& extraDataFor(const StyleSheet& stylesheet);
/// Keyword usage statistics
vector<pair<Value*,const Keyword*> > keyword_usage;
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/export_template.hpp>
#include <data/game.hpp>
#include <data/field.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field.hpp>
#include <data/field/text.hpp>
#include <data/field/choice.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/boolean.hpp>
// ----------------------------------------------------------------------------- : BooleanField
......@@ -31,8 +32,8 @@ BooleanStyle::BooleanStyle(const ChoiceFieldP& field)
: ChoiceStyle(field)
{
render_style = RENDER_BOTH;
//%%choice_images[_("yes")] = ScriptableImage(_("buildin_image(\"bool_yes\")"));
//%%choice_images[_("no")] = ScriptableImage(_("buildin_image(\"bool_no\")"));
//choice_images[_("yes")] = ScriptableImage(_("buildin_image(\"bool_yes\")"));
//choice_images[_("no")] = ScriptableImage(_("buildin_image(\"bool_no\")"));
choice_images[_("yes")] = ScriptableImage(new_intrusive1<BuiltInImage>(_("bool_yes")));
choice_images[_("no")] = ScriptableImage(new_intrusive1<BuiltInImage>(_("bool_no")));
}
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/choice.hpp>
#include <util/io/package.hpp>
#include <wx/imaglist.h>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/color.hpp>
#include <script/script.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/image.hpp>
// ----------------------------------------------------------------------------- : ImageField
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/information.hpp>
#include <script/script.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/multiple_choice.hpp>
// ----------------------------------------------------------------------------- : MultipleChoiceField
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/package_choice.hpp>
#include <util/io/package_manager.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/symbol.hpp>
#include <render/symbol/filter.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/field/text.hpp>
#include <util/tagged_string.hpp>
#include <script/script.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/font.hpp>
// ----------------------------------------------------------------------------- : Font
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/settings.hpp>
#include <data/set.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/clipboard.hpp>
#include <data/format/formats.hpp>
#include <data/card.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/set.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
// ----------------------------------------------------------------------------- :
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/set.hpp>
#include <data/stylesheet.hpp>
......
......@@ -13,6 +13,7 @@
#pragma warning(disable:4996)
#endif
#include <util/prec.hpp>
#include <data/format/image_to_symbol.hpp>
#include <gfx/bezier.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/set.hpp>
#include <data/game.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/set.hpp>
#include <data/settings.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/set.hpp>
#include <data/game.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/format/formats.hpp>
#include <data/game.hpp>
#include <data/set.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/game.hpp>
#include <data/field.hpp>
#include <data/field/choice.hpp>
......
This diff is collapsed.
......@@ -9,22 +9,14 @@
// ----------------------------------------------------------------------------- : Includes
#include <data/settings.hpp>
#include <util/prec.hpp>
#include <util/io/package.hpp>
// ----------------------------------------------------------------------------- : InstallType
// Platform default install directory.
#ifdef __WXMSW__
#define DEFAULT_INSTALL_LOCAL false
#else
#define DEFAULT_INSTALL_LOCAL true
#endif
inline bool isInstallLocal(const InstallType& type)
{
return type == INSTALL_DEFAULT ? DEFAULT_INSTALL_LOCAL : type == INSTALL_LOCAL;
}
DECLARE_POINTER_TYPE(Installer);
DECLARE_POINTER_TYPE(PackageVersion);
DECLARE_POINTER_TYPE(PackageDescription);
DECLARE_POINTER_TYPE(DownloadableInstaller);
DECLARE_POINTER_TYPE(InstallablePackage);
// ----------------------------------------------------------------------------- : Installer
......@@ -32,7 +24,7 @@ inline bool isInstallLocal(const InstallType& type)
class Installer : public Packaged {
public:
String prefered_filename; ///< What filename should be used (by default)
vector<String> packages; ///< Packages to install
vector<PackageDescriptionP> packages; ///< Packages to install
/// Load an installer from a file, and run it
static void installFrom(const String& filename, bool message_on_success, bool local);
......@@ -40,7 +32,7 @@ class Installer : public Packaged {
void install(bool local, bool check_dependencies = true);
/// Install a specific package
void install(const String& package);
/// Add a package to the installer (if it is not already added).
/** If the package is named *.mse-installer uses it as the filename instead */
void addPackage(const String& package);
......@@ -54,5 +46,133 @@ class Installer : public Packaged {
DECLARE_REFLECTION();
};
// ----------------------------------------------------------------------------- : Installer descriptions
/// A description of a package in an installer
class PackageDescription : public IntrusivePtrBase<PackageDescription> {
public:
PackageDescription();
PackageDescription(const Packaged& package);
String name; ///< Filename of the package
Version version; ///< Version number of this package
String short_name; ///< Short name of this package
String full_name; ///< Name of this package, for menus etc.
String icon_url; ///< Filename or URL of icon to use in package lists
Image icon; ///< Icon for the package
String installer_group; ///< Where to put this package in the installer
int position_hint; ///< A hint for the package list
String description; ///< Changelog/description
vector<PackageDependencyP> dependencies; ///< Dependencies of this package
DECLARE_REFLECTION();
};
/// A description of the contents of an installer
class InstallerDescription : public IntrusivePtrBase<InstallerDescription> {
public:
vector<PackageDescriptionP> packages;
DECLARE_REFLECTION();
};
/// Information on an installer that can be downloaded
class DownloadableInstaller : public IntrusivePtrBase<DownloadableInstaller> {
public:
DownloadableInstaller() : downloadable(true) {}
DownloadableInstaller(const InstallerP& installer);
~DownloadableInstaller();
InstallerP installer; ///< The installer, if it is loaded
String installer_url; ///< The URL where the installer can be found
String installer_file; ///< The temp file where the installer can be found (after downloading)
bool downloadable; ///< Is the installer downloadable (in)directly from that url?
vector<PackageDescriptionP> packages; ///< Packages provided by this installer
DECLARE_REFLECTION();
};
// ----------------------------------------------------------------------------- : Installable package
/// Installation status of a package
enum PackageStatus
{ PACKAGE_NOT_INSTALLED = 0x0000
, PACKAGE_INSTALLED = 0x0001
, PACKAGE_REMOVABLE = 0x0002
, PACKAGE_INSTALLABLE = 0x0010
, PACKAGE_UPDATES = 0x0111 ///< Remote updates available
, PACKAGE_MODIFIED = 0x1001 ///< Local changes made
, PACKAGE_CONFLICTS = PACKAGE_UPDATES | PACKAGE_MODIFIED
};
/// (un)install a package?
enum PackageAction
{ PACKAGE_NOTHING = 0x001 ///< Don't change anything
, PACKAGE_INSTALL = 0x002 ///< Install the package
, PACKAGE_UPGRADE = 0x004 ///< Upgrade the package
, PACKAGE_REMOVE = 0x008 ///< Remove the package
, PACKAGE_LOCAL = 0x010 ///< In the local package directory
, PACKAGE_GLOBAL = 0x020 ///< In the global package directory
, PACKAGE_WHERE = PACKAGE_LOCAL | PACKAGE_GLOBAL
};
/// A package that can be installed, or is already installed
class InstallablePackage : public IntrusivePtrVirtualBase {
public:
InstallablePackage();
InstallablePackage(const PackageVersionP&, const PackageDescriptionP&);
PackageVersionP installed; ///< The information of the installed package (if installed)
PackageDescriptionP description; ///< The details of the package. Either from the installed package or from an installer
DownloadableInstallerP installer; ///< The installer to install from (if updates are available)
PackageStatus status; ///< Status of installation
PackageAction action; ///< What to do with this package?
int automatic; ///< Install/upgrade/remove automaticly to satisfy this many packages
PackageAction old_action;
int old_automatic;
void determineStatus();
/// Is the action possible?
bool can(PackageAction act) const;
/// Is the action currently selected?
bool has(PackageAction act) const;
/// Merge two descriptions of installable packages
void merge(const InstallablePackage& p2);
};
typedef vector<InstallablePackageP> InstallablePackages;
/// Sort a list of InstallablePackages by package name
void sort(InstallablePackages& packages);
/// Merge two lists of InstallablePackages.
/** The first list contains installed packages, the second list contains packages in an installer
* @pre both lists are sorted by package name
* @post the output will be sorted
*/
void merge(InstallablePackages& installed, const InstallablePackages& from_installer);
/// Merge the packages from a DownloadableInstaller into a list of InstallablePackages.
void merge(InstallablePackages& installed, const DownloadableInstallerP& installer);
/// Set the action to perform on a given package, makes sure the dependencies are also set correctly
/** Returns true on success
* action may be PACKAGE_NOTHING to clear the action
*/
bool set_package_action(InstallablePackages& packages, const InstallablePackageP& package, PackageAction action);
// ----------------------------------------------------------------------------- : Program package
/// The "magicseteditor.exe" package is special, it refers to the program
extern String mse_package;
InstallablePackageP mse_installable_package();
// ----------------------------------------------------------------------------- : EOF
#endif
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/keyword.hpp>
#include <util/tagged_string.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/locale.hpp>
#include <data/game.hpp>
#include <data/stylesheet.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/pack.hpp>
// ----------------------------------------------------------------------------- : PackType
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/set.hpp>
#include <data/game.hpp>
#include <data/stylesheet.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/settings.hpp>
#include <data/installer.hpp>
#include <data/game.hpp>
......@@ -38,6 +39,15 @@ IMPLEMENT_REFLECTION_ENUM(InstallType) {
VALUE_N("global", INSTALL_GLOBAL);
}
bool is_install_local(InstallType type) {
#ifdef __WXMSW__
#define DEFAULT_INSTALL_LOCAL false
#else
#define DEFAULT_INSTALL_LOCAL true
#endif
return type == INSTALL_DEFAULT ? DEFAULT_INSTALL_LOCAL : type == INSTALL_LOCAL;
}
IMPLEMENT_REFLECTION_ENUM(FilenameConflicts) {
VALUE_N("keep old", CONFLICT_KEEP_OLD);
VALUE_N("overwrite", CONFLICT_OVERWRITE);
......@@ -143,8 +153,10 @@ Settings::Settings()
, symbol_grid_size (30)
, symbol_grid (true)
, symbol_grid_snap (false)
, updates_url (_("http://magicseteditor.sourceforge.net/updates"))
, package_versions_url (_("http://magicseteditor.sourceforge.net/packages"))
, installer_list_url (_("http://magicseteditor.sourceforge.net/installers"))
, check_updates (CHECK_IF_CONNECTED)
, check_updates_all (true)
, install_type (INSTALL_DEFAULT)
, website_url (_("http://magicseteditor.sourceforge.net/"))
{}
......@@ -221,8 +233,11 @@ IMPLEMENT_REFLECTION_NO_SCRIPT(Settings) {
REFLECT(symbol_grid_snap);
REFLECT(default_game);
REFLECT(apprentice_location);
REFLECT(updates_url);
REFLECT_IGNORE(306,"updates url");
REFLECT(package_versions_url);
REFLECT(installer_list_url);
REFLECT(check_updates);
REFLECT(check_updates_all);
REFLECT(install_type);
REFLECT(website_url);
REFLECT(game_settings);
......
......@@ -41,6 +41,7 @@ enum InstallType
};
bool parse_enum(const String&, InstallType&);
bool is_install_local(InstallType type);
/// How to handle filename conflicts
enum FilenameConflicts
......@@ -164,11 +165,12 @@ class Settings {
// --------------------------------------------------- : Special game stuff
String apprentice_location;
String mws_location;
// --------------------------------------------------- : Update checking
String updates_url;
String package_versions_url; ///< latest package versions
String installer_list_url; ///< available installers
CheckUpdates check_updates;
bool check_updates_all; ///< Check updates of all packages, not just the program
String website_url;
// --------------------------------------------------- : Installation settings
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/statistics.hpp>
#include <data/field.hpp>
#include <data/field/choice.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/stylesheet.hpp>
#include <data/game.hpp>
#include <data/field.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/symbol.hpp>
#include <script/to_value.hpp>
#include <gfx/bezier.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/symbol_font.hpp>
#include <data/stylesheet.hpp>
#include <util/dynamic_arg.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/word_list.hpp>
// ----------------------------------------------------------------------------- : WordList
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/bezier.hpp>
#include <gfx/polynomial.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
// ----------------------------------------------------------------------------- : Color utility functions
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/reflect.hpp>
#include <algorithm>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/generated_image.hpp>
#include <util/io/package.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/polynomial.hpp>
#include <complex>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/error.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
#include <util/error.hpp>
#include <gui/util.hpp> // clearDC_black
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gfx/gfx.hpp>
// ----------------------------------------------------------------------------- : Implementation
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/about_window.hpp>
#include <gui/util.hpp>
#include <util/version.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/auto_replace_window.hpp>
#include <gui/control/item_list.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/card_select_window.hpp>
#include <gui/control/select_card_list.hpp>
#include <util/window_id.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/card_editor.hpp>
#include <gui/value/editor.hpp>
#include <gui/icon_menu.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/card_list.hpp>
#include <gui/control/card_list_column_select.hpp>
#include <gui/icon_menu.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/card_list_column_select.hpp>
#include <data/game.hpp>
#include <data/field.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/card_viewer.hpp>
#include <data/stylesheet.hpp>
#include <data/settings.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/filtered_card_list.hpp>
DECLARE_TYPEOF_COLLECTION(CardP);
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/gallery_list.hpp>
#include <gfx/gfx.hpp>
#include <wx/dcbuffer.h>
......@@ -91,7 +92,6 @@ void GalleryList::scrollTo(int top, bool update_scrollbar) {
top = max(0, top);
// scroll
if (top == visible_start) return;
//%int old_top = visible_start;
visible_start = top;
if (update_scrollbar) {
// scroll bar
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/graph.hpp>
#include <util/alignment.hpp>
#include <gfx/gfx.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/image_card_list.hpp>
#include <gui/thumbnail_thread.hpp>
#include <data/field/image.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/item_list.hpp>
#include <gui/util.hpp>
#include <wx/imaglist.h>
......
......@@ -12,8 +12,6 @@
#include <util/prec.hpp>
#include <wx/listctrl.h>
typedef intrusive_ptr<IntrusivePtrVirtualBase> VoidP;
// ----------------------------------------------------------------------------- : ItemList
/// A generic list of items
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/keyword_list.hpp>
#include <gui/icon_menu.hpp>
#include <data/set.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/native_look_editor.hpp>
#include <gui/value/editor.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/package_list.hpp>
#include <util/io/package_manager.hpp>
#include <util/alignment.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/select_card_list.hpp>
#include <gui/util.hpp>
#include <data/card.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/text_ctrl.hpp>
#include <gui/value/editor.hpp>
#include <gui/util.hpp>
......
......@@ -6,12 +6,13 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/control/tree_list.hpp>
#include <gfx/gfx.hpp>
#include <wx/renderer.h>
#include <wx/dcbuffer.h>
DECLARE_TYPEOF_COLLECTION(TreeList::Item);
DECLARE_TYPEOF_COLLECTION(TreeList::ItemP);
// ----------------------------------------------------------------------------- : TreeList : item managment
......@@ -23,21 +24,28 @@ void TreeList::rebuild(bool full) {
}
bool TreeList::hasChildren(size_t item) const {
return item < items.size() && items[item].level < items[item+1].level;
return item + 1 < items.size() && items[item]->level < items[item+1]->level;
}
void TreeList::expand(size_t item, bool expand) {
if (hasChildren(item) && items[item].expanded != expand) {
items[item].expanded = expand;
if (hasChildren(item) && items[item]->expanded != expand) {
items[item]->expanded = expand;
rebuild(false);
}
}
void TreeList::select(size_t item) {
void TreeList::select(size_t item, bool event) {
if (item >= items.size() || selection == item) return;
size_t oldpos = selection < items.size() ? items[selection].position : 0;
// select
size_t oldpos = selection < items.size() ? items[selection]->position : 0;
selection = item;
size_t pos = items[selection].position;
size_t pos = items[selection]->position;
// event
if (event) {
wxCommandEvent ev(wxEVT_COMMAND_LISTBOX_SELECTED, GetId());
ProcessEvent(ev);
}
// redraw
if (pos < first_line) {
ScrollToLine(pos);
} else if (pos >= first_line + visible_lines_t) {
......@@ -53,28 +61,28 @@ void TreeList::calcItemCount() {
total_lines = 0;
int visible_level = 0;
FOR_EACH(i,items) {
if (i.level <= visible_level) {
i.position = total_lines;
if (i->level <= visible_level) {
i->position = total_lines;
++total_lines;
if (i.expanded) visible_level = i.level + 1;
else visible_level = i.level;
if (i->expanded) visible_level = i->level + 1;
else visible_level = i->level;
} else {
i.position = NOTHING;
i->position = NOTHING;
}
}
// update lines
UInt lines = 0;
FOR_EACH_REVERSE(i,items) {
if (i.visible()) {
i.lines = lines;
lines &= (1 << i.level) - 1;
lines |= 1 << i.level;
if (i->visible()) {
i->lines = lines;
lines &= (1 << i->level) - 1;
lines |= 1 << i->level;
}
}
// selection hidden? move to first visible item before it
if (selection < items.size()) {
for ( ; selection + 1 > 0 ; --selection) {
if (items[selection].visible()) break; // visible
if (items[selection]->visible()) break; // visible
}
if (selection >= items.size()) selection = 0;
}
......@@ -86,20 +94,20 @@ size_t TreeList::findItemByPos(int y) const {
}
size_t TreeList::findItem(size_t line, size_t start) const {
for (size_t i = start ; i < items.size() ; ++i) {
if (items[i].visible() && items[i].position >= line) return i;
if (items[i]->visible() && items[i]->position >= line) return i;
}
return items.size();
}
size_t TreeList::findLastItem(size_t start) const {
for (size_t i = min(items.size(), start) - 1 ; i + 1 > 0 ; --i) {
if (items[i].visible()) return i;
if (items[i]->visible()) return i;
}
return items.size();
}
size_t TreeList::findParent(size_t start) const {
int level = items[start].level;
int level = items[start]->level;
for (size_t i = start - 1 ; i + 1 > 0 ; --i) {
if (items[i].visible() && items[i].level < level) return i;
if (items[i]->visible() && items[i]->level < level) return i;
}
return items.size();
}
......@@ -147,9 +155,13 @@ void TreeList::onPaint(wxPaintEvent& ev) {
size_t start = findItem(first_line);
size_t end = findItem(first_line + visible_lines);
for (size_t i = start ; i < end ; ++i) {
const Item& item = items[i];
const Item& item = *items[i];
if (!item.visible()) continue; // invisible
x = level_width * (item.level + 1);
// line below
dc.SetPen(lerp(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW),
wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT),0.2));
dc.DrawLine(x,y+item_height-1,cs.x,y+item_height-1);
// draw lines
dc.SetPen(lerp(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW),
wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT),0.4));
......@@ -171,15 +183,12 @@ void TreeList::onPaint(wxPaintEvent& ev) {
if (selection == i) {
dc.SetPen(*wxTRANSPARENT_PEN);
dc.SetBrush(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHT));
dc.SetTextForeground(wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT));
dc.DrawRectangle(x, y, cs.x-x, item_height);
dc.DrawRectangle(x, y, cs.x-x, item_height-1);
}
// draw text(s)
for (size_t j = 0 ; j < cols ; ++j) {
int w = columnWidth(j);
if (selection != i)
dc.SetTextForeground(itemColor(i,j));
dc.DrawText(itemText(i,j),x+1,y+1);
drawItem(dc, i, j, x+1, y, selection == i);
if (j == 0) x = 0;
x += w;
}
......@@ -197,7 +206,7 @@ void TreeList::onChar(wxKeyEvent& ev) {
break;
} case WXK_LEFT: {
if (selection < items.size()) {
if (hasChildren(selection) && items[selection].expanded) {
if (hasChildren(selection) && items[selection]->expanded) {
expand(selection, false);
} else {
// select parent
......@@ -207,7 +216,7 @@ void TreeList::onChar(wxKeyEvent& ev) {
break;
} case WXK_RIGHT: {
if (selection < items.size() && hasChildren(selection)) {
if (items[selection].expanded) {
if (items[selection]->expanded) {
// select first child
select(selection+1);
Refresh(false);
......@@ -216,10 +225,10 @@ void TreeList::onChar(wxKeyEvent& ev) {
}
}
break;
} case WXK_PAGEUP: {
} case WXK_PAGEUP: case WXK_PRIOR: {
ScrollToLine(first_line > visible_lines_t ? first_line - visible_lines_t : 0);
break;
} case WXK_PAGEDOWN: {
} case WXK_PAGEDOWN: case WXK_NEXT: {
ScrollToLine(first_line + visible_lines_t);
break;
} case WXK_HOME: {
......@@ -242,9 +251,9 @@ void TreeList::onChar(wxKeyEvent& ev) {
void TreeList::onLeftDown(wxMouseEvent& ev) {
size_t i = findItemByPos(ev.GetY());
if (i >= items.size()) return;
int left = items[i].level * level_width;
int left = items[i]->level * level_width;
if (hasChildren(i) && ev.GetX() >= left && ev.GetX() < left + level_width) {
expand(i, !items[i].expanded);
expand(i, !items[i]->expanded);
} else {
select(i);
}
......@@ -255,7 +264,7 @@ void TreeList::onLeftDClick(wxMouseEvent& ev) {
size_t i = findItemByPos(ev.GetY());
if (i >= items.size()) return;
if (hasChildren(i)) {
expand(i, !items[i].expanded);
expand(i, !items[i]->expanded);
}
ev.Skip();
}
......@@ -264,7 +273,8 @@ void TreeList::onLeftDClick(wxMouseEvent& ev) {
void TreeList::ScrollToLine(size_t line) {
// determine the real first line to scroll to: we shouldn't scroll beyond the end
line = (size_t)min((int)line, (int)(total_lines - visible_lines_t));
line = (size_t)max((int)line, 0);
line = (size_t)min((int)line, max(0, (int)(total_lines - visible_lines_t)));
// nothing to do?
if (line == first_line) return;
first_line = line;
......@@ -314,12 +324,13 @@ void TreeList::onScroll(wxScrollWinEvent& ev) {
void TreeList::onSize(wxSizeEvent& ev) {
UpdateScrollbar();
Refresh(false);
ev.Skip();
}
void TreeList::onMouseWheel(wxMouseEvent& ev) {
ScrollLines(-ev.GetWheelRotation() * ev.GetLinesPerAction() / ev.GetWheelDelta());
Refresh(false);
int delta = -ev.GetWheelRotation() * ev.GetLinesPerAction() / ev.GetWheelDelta();
ScrollToLine(first_line + delta);
}
......
......@@ -12,8 +12,6 @@
#include <util/prec.hpp>
#include <wx/vscroll.h>
typedef intrusive_ptr<IntrusivePtrVirtualBase> VoidP;
// ----------------------------------------------------------------------------- : TreeList
/// A combination of a TreeCtrl and a ListCtrl. A tree with multiple columns.
......@@ -24,7 +22,7 @@ class TreeList : public wxPanel {
/// Expand/collapse an item
void expand(size_t item, bool expand = true);
/// Select an item
void select(size_t item);
void select(size_t item, bool event = true);
/// (re)build the list
void rebuild(bool full = true);
......@@ -32,24 +30,26 @@ class TreeList : public wxPanel {
public:
/// An item in the tree list
struct Item {
Item() {}
Item(int level, bool expanded = false, VoidP data = VoidP())
: level(level), expanded(expanded), data(data)
{}
class Item : public IntrusivePtrBase<Item> {
public:
Item() : level(0), expanded(false) {}
virtual ~Item() {}
int level;
bool expanded;
VoidP data;
inline bool visible() const { return position != NOTHING; }
private:
friend class TreeList;
size_t position; // NOTHING if invisible, otherwise the line the item is on
UInt lines; // lines in front of this item (bit set)
inline bool visible() const { return position != NOTHING; }
};
typedef intrusive_ptr<Item> ItemP;
protected:
/// The items in the tree list
vector<Item> items;
vector<ItemP> items;
static const size_t NOTHING = (size_t)-1;
size_t selection;
......@@ -57,10 +57,8 @@ class TreeList : public wxPanel {
/// Initialize the items
virtual void initItems() = 0;
/// Get the text of an item
virtual String itemText(size_t item, size_t column) const = 0;
/// Get the color of an item
virtual Color itemColor(size_t item, size_t column) const = 0;
/// Draw the text of an item
virtual void drawItem(DC& dc, size_t index, size_t column, int x, int y, bool selected) const = 0;
/// The number of columns
virtual size_t columnCount() const = 0;
......@@ -69,11 +67,11 @@ class TreeList : public wxPanel {
/// The width of a column in pixels
virtual int columnWidth(size_t column) const = 0;
private:
int item_height;
static const int header_height = 17;
static const int level_width = 17;
private:
size_t total_lines; // number of shown items
size_t first_line; // first visible line
size_t visible_lines; // number of (partially) visible lines
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/drop_down_list.hpp>
#include <gui/util.hpp>
#include <render/value/viewer.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/html_export_window.hpp>
#include <gui/control/package_list.hpp>
#include <gui/control/native_look_editor.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/icon_menu.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/image_slice_window.hpp>
#include <gui/util.hpp>
#include <util/window_id.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/images_export_window.hpp>
#include <gui/control/select_card_list.hpp>
#include <data/settings.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/new_window.hpp>
#include <gui/control/gallery_list.hpp>
#include <gui/control/package_list.hpp>
......
This diff is collapsed.
//+----------------------------------------------------------------------------+
//| Description: Magic Set Editor - Program to make Magic (tm) cards |
//| Copyright: (C) 2001 - 2007 Twan van Laarhoven |
//| License: GNU General Public License 2 or later (see file COPYING) |
//+----------------------------------------------------------------------------+
#ifndef HEADER_GUI_PACKAGES_WINDOW
#define HEADER_GUI_PACKAGES_WINDOW
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <data/installer.hpp>
// #include <gui/welcome_window.hpp> //???
class PackageUpdateList;
class PackageInfoPanel;
//class wxHtmlWindow;
//DECLARE_POINTER_TYPE(PackageVersionData);
//DECLARE_POINTER_TYPE(PackageVersion);
//DECLARE_POINTER_TYPE(PackageDescription);
//DECLARE_POINTER_TYPE(InstallableInstaller);
DECLARE_POINTER_TYPE(InstallablePackage);
// ----------------------------------------------------------------------------- : Available Packages
// ----------------------------------------------------------------------------- : Packages window
/// A window that displays the installed packages and updates to them
class PackagesWindow : public wxDialog {
public:
PackagesWindow(Window* parent, bool download_package_list = true);
~PackagesWindow();
InstallablePackages installable_packages;
private:
PackageUpdateList* package_list; ///< List of available packages
PackageInfoPanel* package_info; ///< Description of the selected package
InstallablePackageP package; ///< Selected package
PackageAction where; ///< Where to install? (PACKAGE_LOCAL or PACKAGE_GLOBAL)
DECLARE_EVENT_TABLE();
void onOk(wxCommandEvent&);
void onActionChange(wxCommandEvent&);
void onPackageSelect(wxCommandEvent&);
void onUpdateUI(wxUpdateUIEvent&);
/*
wxHtmlWindow* description_window;
wxButton *install_button, *upgrade_button, *remove_button, *cancel_button, *apply_button;
void onUpdateCheckFinished(wxCommandEvent&);
void onPackageSelect(wxCommandEvent&);
void onActionChange(wxCommandEvent&);
void onApplyChanges(wxCommandEvent&);
void SelectPackageDependencies (PackageVersionDataP);
void RemovePackageDependencies (PackageVersionDataP);
void DowngradePackageDependencies(PackageVersionDataP);
/// Update the buttons to indicate that this is selected.
void updateButtons(const PackageVersionDataP& pack);
void setDefaultPackageStatus();
*/
};
// ----------------------------------------------------------------------------- : EOF
#endif
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/preferences_window.hpp>
#include <gui/update_checker.hpp>
#include <data/settings.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/print_window.hpp>
#include <gui/card_select_window.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/cards_panel.hpp>
#include <gui/control/image_card_list.hpp>
#include <gui/control/card_editor.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/keywords_panel.hpp>
#include <gui/control/keyword_list.hpp>
#include <gui/control/text_ctrl.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/panel.hpp>
#include <data/card.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/set_info_panel.hpp>
#include <gui/control/native_look_editor.hpp>
#include <gui/icon_menu.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/stats_panel.hpp>
#include <gui/control/graph.hpp>
#include <gui/control/gallery_list.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/style_panel.hpp>
#include <gui/control/package_list.hpp>
#include <gui/control/card_viewer.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/set/window.hpp>
#include <gui/set/panel.hpp>
#include <gui/set/cards_panel.hpp>
......@@ -18,6 +19,7 @@
#include <gui/control/gallery_list.hpp>
#include <gui/about_window.hpp>
#include <gui/update_checker.hpp>
#include <gui/packages_window.hpp>
#include <gui/new_window.hpp>
#include <gui/preferences_window.hpp>
#include <gui/print_window.hpp>
......@@ -538,8 +540,8 @@ void SetWindow::onFileExportMWS(wxCommandEvent&) {
void SetWindow::onFileCheckUpdates(wxCommandEvent&) {
if (!askSaveAndContinue()) return;
(new UpdatesWindow)->Show();
Destroy();
(new PackagesWindow(this))->Show();
//Destroy();
}
void SetWindow::onFilePrint(wxCommandEvent&) {
......@@ -562,7 +564,7 @@ void SetWindow::onFileReload(wxCommandEvent&) {
vector<CardP>::const_iterator card_it = find(set->cards.begin(), set->cards.end(), current_panel->selectedCard());
if (card_it != set->cards.end()) card_pos = card_it - set->cards.begin();
}
packages.destroy(); // unload all packages
packages.reset(); // unload all packages
settings.read(); // reload settings
setSet(import_set(filename));
// reselect card
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/basic_shape_editor.hpp>
#include <gui/util.hpp>
#include <util/window_id.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/control.hpp>
#include <gui/symbol/window.hpp>
#include <gui/symbol/editor.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/editor.hpp>
#include <gui/symbol/window.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/part_list.hpp>
#include <gui/symbol/selection.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/point_editor.hpp>
#include <gui/symbol/window.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/select_editor.hpp>
#include <gui/symbol/window.hpp>
#include <gui/util.hpp>
......
......@@ -6,6 +6,7 @@
// ----------------------------------------------------------------------------- : Includes
#include <util/prec.hpp>
#include <gui/symbol/selection.hpp>
#include <data/symbol.hpp>
#include <gfx/bezier.hpp>
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment