Initial commit with README and example Qt5 window.
This commit is contained in:
@@ -0,0 +1 @@
|
||||
__pycache__
|
||||
@@ -0,0 +1,19 @@
|
||||
# novelWriter
|
||||
|
||||
This is a reboot of my novelWriter application using Qt5 after abandoning the Gtk3 version now renamed novelWriterGtk.
|
||||
|
||||
As an amateur science fiction writer, I have been looking for a simple tool to organise text files into a novel.
|
||||
|
||||
While there are a number of tools ranging from the excellent distraction free editors to complex project organisers, there isn't anything that combines the features I am looking for.
|
||||
|
||||
Here is an overview of the core features I want to implement as a starting point:
|
||||
|
||||
* Multi-tabbed editor allowing the user to work on multiple files at the same time.
|
||||
* A non-sorted tree view for easy navigation between the files. The tree view must not be sorted automatically as one wants to order the scene or chapter files in the order they should appear in the finished novel.
|
||||
* Scene meta data including POV, character, location, plot and timeline information in a tag-style manner.
|
||||
* Basic visualisation tools for the novel meta data.
|
||||
* The file format should be such that version control software can be used for the projects. That is, no binary files.
|
||||
|
||||
Future features that will be added:
|
||||
|
||||
* Export options for HTML, open document format and PDF (probably via LaTeX or Pandoc).
|
||||
Executable
+8
@@ -0,0 +1,8 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*
|
||||
|
||||
import sys
|
||||
import nw
|
||||
|
||||
if __name__ == "__main__":
|
||||
nw.main(sys.argv[1:])
|
||||
+111
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 45 KiB |
+199
@@ -0,0 +1,199 @@
|
||||
# -*- coding: utf-8 -*
|
||||
"""novelWriter Init
|
||||
|
||||
novelWriter – Init File
|
||||
=========================
|
||||
Application initialisation
|
||||
|
||||
File History:
|
||||
Created: 2018-09-22 [0.1.0]
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
import getopt
|
||||
import gi
|
||||
|
||||
gi.require_version("Gtk","3.0")
|
||||
|
||||
from os import path, remove, rename
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
from nw.main import NovelWriter
|
||||
|
||||
__author__ = "Veronica Berglyd Olsen"
|
||||
__copyright__ = "Copyright 2016-2018, Veronica Berglyd Olsen"
|
||||
__credits__ = ["Veronica Berglyd Olsen"]
|
||||
__license__ = "GPLv3"
|
||||
__version__ = "0.1.0"
|
||||
__date__ = "2018"
|
||||
__maintainer__ = "Veronica Berglyd Olsen"
|
||||
__email__ = "code@vkbo.net"
|
||||
__status__ = "Development"
|
||||
|
||||
#
|
||||
# Logging
|
||||
# =========
|
||||
# Standard used for logging levels in novelWriter:
|
||||
# CRITICAL Use for errors that result in termination of the program
|
||||
# ERROR Use when an action fails, but execution continues
|
||||
# WARNING When something unexpected, but non-critical happens
|
||||
# INFO Any useful user information like open, save, exit initiated
|
||||
# ----------- SPAM Threshold : Output above should be minimal -----------------
|
||||
# DEBUG Use for descriptions of main program flow
|
||||
# VERBOSE Use for outputting values and program flow details
|
||||
# VVERBOSE Use for describing what the user does, like clicks and entries
|
||||
#
|
||||
|
||||
# Adding verbose and vverbose logging levels
|
||||
|
||||
VERBOSE = 9
|
||||
VVERBOSE = 8
|
||||
logging.addLevelName(VERBOSE, "DEBUGV")
|
||||
logging.addLevelName(VVERBOSE,"DEBUGVV")
|
||||
|
||||
def logVerbose(self, message, *args, **kws):
|
||||
if self.isEnabledFor(VERBOSE):
|
||||
self._log(VERBOSE, message, args, **kws)
|
||||
def logVVerbose(self, message, *args, **kws):
|
||||
if self.isEnabledFor(VVERBOSE):
|
||||
self._log(VVERBOSE, message, args, **kws)
|
||||
|
||||
logging.Logger.verbose = logVerbose
|
||||
logging.Logger.vverbose = logVVerbose
|
||||
|
||||
# Initiating logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
#
|
||||
# Main Program
|
||||
# ==============
|
||||
#
|
||||
|
||||
# Load the main config as a global object
|
||||
# CONFIG = Config()
|
||||
|
||||
def main(sysArgs):
|
||||
"""
|
||||
Parses command line, sets up logging, and launches main GUI.
|
||||
"""
|
||||
|
||||
# Valid Input Options
|
||||
shortOpt = "hd:qtl:v"
|
||||
longOpt = [
|
||||
"help",
|
||||
"debug=",
|
||||
"verbose",
|
||||
"vverbose",
|
||||
"quiet",
|
||||
"time",
|
||||
"logfile=",
|
||||
"version",
|
||||
"config=",
|
||||
"headless",
|
||||
]
|
||||
|
||||
helpMsg = (
|
||||
"novelWriter {version} ({status})\n"
|
||||
"{copyright}\n"
|
||||
"\n"
|
||||
"Usage:\n"
|
||||
" -h, --help Print this message.\n"
|
||||
" -v, --version Print program version and exit.\n"
|
||||
" -d, --debug Debug level. Valid options are DEBUG, INFO, WARN or ERROR.\n"
|
||||
" --verbose Increase verbosity of debug.\n"
|
||||
" --vverbose Increase verbosity of debug even more.\n"
|
||||
" -q, --quiet Disable output to command line. Does not affect log file.\n"
|
||||
" -t, --time Shows time stamp in logging output. Adds milliseconds for verbose.\n"
|
||||
" -l, --logfile Specify log file.\n"
|
||||
" --config Alternative config file.\n"
|
||||
" --headless Do not display GUI. Useful for testing scripts.\n"
|
||||
).format(
|
||||
version = __version__,
|
||||
status = __status__,
|
||||
copyright = __copyright__
|
||||
)
|
||||
|
||||
# Defaults
|
||||
debugLevel = logging.WARN
|
||||
debugStr = "%(levelname)-8s %(message)s"
|
||||
timeStr = "[%(asctime)s] "
|
||||
logFile = ""
|
||||
toFile = False
|
||||
toStd = True
|
||||
showTime = False
|
||||
confPath = None
|
||||
showGUI = True
|
||||
|
||||
# Parse Options
|
||||
try:
|
||||
inOpts, inArgs = getopt.getopt(sysArgs,shortOpt,longOpt)
|
||||
except getopt.GetoptError:
|
||||
print(helpMsg)
|
||||
exit(2)
|
||||
|
||||
for inOpt, inArg in inOpts:
|
||||
if inOpt in ("-h","--help"):
|
||||
print(helpMsg)
|
||||
exit()
|
||||
elif inOpt in ("-v", "--version"):
|
||||
print("makeNovel %s Version %s" % (__status__,__version__))
|
||||
exit()
|
||||
elif inOpt in ("-d", "--debug"):
|
||||
if inArg == "ERROR":
|
||||
debugLevel = logging.ERROR
|
||||
elif inArg == "WARN":
|
||||
debugLevel = logging.WARNING
|
||||
elif inArg == "INFO":
|
||||
debugLevel = logging.INFO
|
||||
elif inArg == "DEBUG":
|
||||
debugLevel = logging.DEBUG
|
||||
debugStr = "%(lineno)4d:%(name)-20s %(levelname)-8s %(message)s"
|
||||
else:
|
||||
print("Invalid debug level")
|
||||
exit(2)
|
||||
elif inOpt in ("-l","--logfile"):
|
||||
logFile = inArg
|
||||
toFile = True
|
||||
elif inOpt in ("-q","--quiet"):
|
||||
toStd = False
|
||||
elif inOpt in ("--verbose"):
|
||||
debugLevel = VERBOSE
|
||||
timeStr = "[%(asctime)s.%(msecs)03d] "
|
||||
elif inOpt in ("--vverbose"):
|
||||
debugLevel = VVERBOSE
|
||||
timeStr = "[%(asctime)s.%(msecs)03d] "
|
||||
elif inOpt in ("-t","--time"):
|
||||
showTime = True
|
||||
elif inOpt in ("--config"):
|
||||
confPath = inArg
|
||||
elif inOpt in ("--headless"):
|
||||
showGUI = False
|
||||
|
||||
# Set Logging
|
||||
if showTime: debugStr = timeStr+debugStr
|
||||
logFmt = logging.Formatter(fmt=debugStr,datefmt="%Y-%m-%d %H:%M:%S")
|
||||
|
||||
if not logFile == "" and toFile:
|
||||
if path.isfile(logFile+".bak"):
|
||||
remove(logFile+".bak")
|
||||
if path.isfile(logFile):
|
||||
rename(logFile,logFile+".bak")
|
||||
|
||||
fHandle = logging.FileHandler(logFile)
|
||||
fHandle.setLevel(debugLevel)
|
||||
fHandle.setFormatter(logFmt)
|
||||
logger.addHandler(fHandle)
|
||||
|
||||
if toStd:
|
||||
cHandle = logging.StreamHandler()
|
||||
cHandle.setLevel(debugLevel)
|
||||
cHandle.setFormatter(logFmt)
|
||||
logger.addHandler(cHandle)
|
||||
|
||||
logger.setLevel(debugLevel)
|
||||
|
||||
nwApp = QApplication([])
|
||||
nwGUI = NovelWriter()
|
||||
exit(nwApp.exec_())
|
||||
|
||||
return
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
# -*- coding: utf-8 -*
|
||||
"""novelWriter Main Class
|
||||
|
||||
novelWriter – Main Class
|
||||
==========================
|
||||
Sets up the main GUI and holds action and event functions
|
||||
|
||||
File History:
|
||||
Created: 2018-09-22 [0.1.0]
|
||||
|
||||
"""
|
||||
|
||||
import logging
|
||||
import nw
|
||||
|
||||
from PyQt5.QtWidgets import QWidget
|
||||
from PyQt5.QtGui import QIcon
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
class NovelWriter(QWidget):
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
self.initGUI()
|
||||
|
||||
def initGUI(self):
|
||||
|
||||
# self.setGeometry(300, 300, 300, 220)
|
||||
self.resize(600,500)
|
||||
self.setWindowTitle("novelWriter")
|
||||
self.setWindowIcon(QIcon("novelWriter.svg"))
|
||||
|
||||
self.show()
|
||||
|
||||
# END Class NovelWriter
|
||||
Reference in New Issue
Block a user